Использование replace() для определенного столбца в таблице для изменения дат

Я пытаюсь использовать 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

Используйте Replace() не функцию рабочего листа.

Scott Craner 08.04.2019 23:34
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете использовать «Заменить» или «Заменить» в назначении диапазона ячеек, и вы не можете применить формулу ко всему столбцу, который ссылается на себя (как в вашей попытке).

Если это всего лишь небольшая таблица, вы можете использовать свое решение для одной ячейки в ленивом цикле через 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, третий вариант «эффективная замена», похоже, решил проблему.

Simone Fick 23.04.2019 11:20

Другие вопросы по теме