在表中的特定列上使用replace()更改日期

时间:2019-04-08 21:32:14

标签: excel vba substitution tablecolumn

我正在尝试在表中的特定列上使用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

所有内容应从2019年3月15日更改为2019年3月15日

1 个答案:

答案 0 :(得分: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

或者,如Scott所指出的那样,使用本机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