Я пытаюсь использовать replace() для определенного столбца в таблице. Все даты указаны 13.03.2019. Мне нужно заменить "." с «/», чтобы иметь возможность использовать их в других формулах.
Как я могу позволить этой формуле изменить весь столбец? Мне удалось сделать одну ячейку.
Это работает для одной ячейки за пределами таблицы. Но мне нужно изменить даты во всем столбце таблицы.
wsDormant.Range("C8") = WorksheetFunction.Substitute(wsDormant.Range("C8"), ".", "/")
Это для столбца таблицы:
With wsDormant.ListObjects("Table_Dormant_Stock")
.Range.AutoFilter
'Convert date format
.ListColumns("Days Last Sold").DataBodyRange.Formula = WorksheetFunction.Substitute(.ListColumns("Days Last Sold").DataBodyRange, ".", "/")
End With
Все должно измениться с 15.03.2019 по 15.03.2019
Вы не можете использовать «Заменить» или «Заменить» в назначении диапазона ячеек, и вы не можете применить формулу ко всему столбцу, который ссылается на себя (как в вашей попытке).
Если это всего лишь небольшая таблица, вы можете использовать свое решение для одной ячейки в ленивом цикле через ListColumn:
Dim raCell as Range
For each raCell in wsDormant.ListObjects("Table_Dormant_Stock").ListColumns("Days Last Sold").DataBodyRange
raCell = WorksheetFunction.Substitute(raCell, ".", "/")
Next
В качестве альтернативы, как указал Скотт, использование встроенной функции VBA Replace более эффективно:
Dim raCell as Range
For each raCell in wsDormant.ListObjects("Table_Dormant_Stock").ListColumns("Days Last Sold").DataBodyRange
raCell = Replace(raCell, ".", "/")
Next
Тем не менее, оба решения по-прежнему неэффективны, если вы работаете с большим списком.
Более эффективным решением является создание временного рабочего столбца с помощью функции ПОДСТАВИТЬ:
With wsDormant.ListObjects("Table_Dormant_Stock").ListColumns.Add
.DataBodyRange.Formula = "=SUBSTITUTE([@[Days Last Sold]], ""."", ""/"")"
wsDormant.ListObjects("Table_Dormant_Stock").ListColumns("Days Last Sold").DataBodyRange.Value = .DataBodyRange.Value
.Delete
End With
Другим эффективным решением является копирование всех значений в массив, цикл по этому массиву, а затем копирование обновленных значений обратно в электронную таблицу:
Dim varArray As Variant, i As Integer
With wsDormant.ListObjects("Table_Dormant_Stock").ListColumns("Days Last Sold")
varArray = .DataBodyRange
For i = 1 To UBound(varArray, 1)
varArray(i, 1) = Replace(varArray(i, 1), ".", "/")
Next i
.DataBodyRange = varArray
End With
Спасибо @Michael, третий вариант «эффективная замена», похоже, решил проблему.
Используйте
Replace()
не функцию рабочего листа.