#excel #vba
#excel #vba
Вопрос:
Я пытаюсь удалить все формулы из ячейки моей таблицы и сохранить значения. Я пробовал несколько методов, но ни один из них не сработал.
Sub test()
ActiveSheet.ListObjects("Tableau4").Range.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Этот код всегда удаляет заголовок моей таблицы.
Я также пробовал этот код :
Sub test()
For Each cell In ListObjects("Tableau4").Range
cell.Value = cell.Value
Next cell
End Sub
Это работает, но это слишком долго для выполнения.
Комментарии:
1. Вместо этого используя
For Each Cell
. ПростоSet RangeValues = YourTable.Range
и затемRangeValues.Value = RangeValues.Value
2.
ListObjects("Tableau4").DataBodyRange.Value = ListObjects("Tableau4").DataBodyRange.Value
3. Спасибо, значит, это сработало, но это больше не таблица
4. Спасибо GSerg, это решение, которое мне было нужно
Ответ №1:
Вам не нужно беспокоиться о строке заголовка. Вам не разрешается размещать формулы в строке заголовка. Сконцентрируйтесь на DataBodyRange и используйте прямую передачу значений.
Sub test()
with ListObjects("Tableau4").databodyRange
.Value = .Value
end with
End Sub
Ответ №2:
Вы должны быть в состоянии просто использовать:
Sub test()
With ListObjects("Tableau4").DataBodyRange
.Value2 = .Value2
End With
End Sub
Комментарии:
1. Я полагаю, что это разделит даты на целые числа.
2. @user11246173 Даты — это числа в Excel. Это не изменит форматирование ячейки, поэтому никакие даты не будут отображаться по-другому.
Ответ №3:
Попробуйте:
Sub MAKE_VALUES()
Range(ActiveSheet.ListObjects("Tableau4").Range.Address) = Range(ActiveSheet.ListObjects("Tableau4").Range.Address).Value
End Sub
Обратите внимание, что это преобразует всю таблицу в значения, включая заголовки, и удаляет формат таблицы.
Если вы хотите сохранить формат таблицы и преобразовать в значения только тело, исключая заголовки, то используйте:
Sub MAKE_BODY_VALUES()
Range(ActiveSheet.ListObjects("Tableau4").DataBodyRange.Address) = Range(ActiveSheet.ListObjects("Tableau4").DataBodyRange.Address).Value
End Sub
Комментарии:
1. »
Range(Sheet.Range.Address)
» означает «Создать диапазон на активном листе, который имеет те же границы, что и данный диапазон с некоторого конкретного листа». Если указанный диапазон принадлежит активному листу, операция бессмысленна, потому что она создает тот же диапазон, и вы могли бы просто использовать оригиналSheet.Range
. Если указанный диапазон принадлежит другому листу, то вы просто создали диапазон не на том листе, не осознавая этого.