在 table 中的特定列上使用 substitute() 来更改日期
Using substitute() on a specific column in a table to change dates
我正在尝试在 table 中的特定列上使用 substitute()。所有日期均输入 13.03.2019。我需要替换“。”带有“/”以便能够在其他公式中使用它们。
如何让这个公式改变整列?
我成功地做了一个单元格。
这适用于 table 之外的单个单元格。但我需要更改 table.
中整列的日期
wsDormant.Range("C8") = WorksheetFunction.Substitute(wsDormant.Range("C8"), ".", "/")
这是针对 table 列的:
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
您不能在对一系列单元格的赋值中使用替换或替换,也不能将公式应用于引用自身的整个列(如您的尝试)。
如果它只是一个小 table,您可以通过 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
我正在尝试在 table 中的特定列上使用 substitute()。所有日期均输入 13.03.2019。我需要替换“。”带有“/”以便能够在其他公式中使用它们。
如何让这个公式改变整列? 我成功地做了一个单元格。
这适用于 table 之外的单个单元格。但我需要更改 table.
中整列的日期 wsDormant.Range("C8") = WorksheetFunction.Substitute(wsDormant.Range("C8"), ".", "/")
这是针对 table 列的:
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
您不能在对一系列单元格的赋值中使用替换或替换,也不能将公式应用于引用自身的整个列(如您的尝试)。
如果它只是一个小 table,您可以通过 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