Как удалить формулы и сохранить значение в таблице

#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 . Если указанный диапазон принадлежит другому листу, то вы просто создали диапазон не на том листе, не осознавая этого.