Использование подстановки () для определенного столбца в таблице для изменения дат - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь использовать substitute () для определенного столбца в таблице.Все даты введены 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

1 Ответ

1 голос
/ 09 апреля 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

При этом оба решения по-прежнему неэффективны, если вы работаете с большим списком.

Более эффективное решение - создать временный рабочий столбец с помощью функции SUBSTITUTE:

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
...