【问题标题】:Dynamic Range selection using column header使用列标题选择动态范围
【发布时间】:2018-10-17 22:38:47
【问题描述】:

我是 VBA 新手,需要您的帮助。

我有一个带有动态表格的 excel 电子表格(标题位于第 4 行)。导入表中的数据包含 Excel 无法格式化为 m-d-yyyy 的日期值(2018 年 9 月 5 日 6:11:17 PM EDT)。我们可以格式化日期的唯一方法是删除“逗号”、“EDT”和“EST”值。宏按预期运行和工作。

现在我的挑战是修改此宏 (VBA) 以查找列标题名称而不是整个列。当我不断被要求在表格中添加一列时。列名称为“目标取消日期”、“实际取消日期”、“创建日期”、“上次更新日期”、“认可日期”和“认可到期日期”

所有数据都填充在第 5 行,这是一个动态表。

这是我当前的代码

Sub ConvertDateFormat()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+Shift+D
'
    Range("V:V,W:W,Z:Z,AA:AA,AC:AC,AD:AD").Select
    Range("V5").Activate
    Selection.NumberFormat = "m/d/yyyy"
    Selection.Replace What:=",", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="EDT", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="EST", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

【问题讨论】:

    标签: excel


    【解决方案1】:

    您可以直接引用表格及其列,而无需使用列字母。

    Dim tbl As ListObject 'this will be the table
    Dim rngData as Range
    
    Set tbl = ActiveSheet.ListObjects("name_of_your_table")
    Set rngData = tbl.ListColumns("Target Decomm Date").DataBodyRange
    rngData.NumberFormat = "m/d/yyyy"
    rngData.Replace [.....]
    

    您可以使用数组来遍历所有不同的列名,但我不会在这里介绍,因为它在网络上有很好的记录,例如 How can I use a for each loop on an array?

    【讨论】:

    • 感谢您的帮助。它按预期工作。现在我只需要弄清楚如何为多列运行脚本。
    • 创建一个字符串数组,用所有列的名称填充它,使用我上面写的链接中描述的“for each”循环,如果这样,请不要忘记标记答案已经为你解决了。谢谢 :-) 编辑:thisone 更好地解释了数组的创建:stackoverflow.com/questions/19369132/…
    【解决方案2】:

    这是我的最终脚本,它运行良好。

    Sub FormatDate()
    '
    Dim tbl As ListObject 'this will be the table
    Dim rng1, rng2, rng3, rng4, rng5, rng6, rngM As Range
    
    Set tbl = ActiveSheet.ListObjects("tblProductList")
    Set rng1 = tbl.ListColumns("Target Decomm Date").DataBodyRange
    Set rng2 = tbl.ListColumns("Actual Decomm Date").DataBodyRange
    Set rng3 = tbl.ListColumns("Created Date").DataBodyRange
    Set rng4 = tbl.ListColumns("Last Updated Date").DataBodyRange
    Set rng5 = tbl.ListColumns("Accreditation Date").DataBodyRange
    Set rng6 = tbl.ListColumns("Accreditation expiry Date").DataBodyRange
    Set rngM = Union(rng1, rng2, rng3, rng4, rng5, rng6)
    rngM.NumberFormat = "m/d/yyyy"
    rngM.Replace What:=",", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    rngM.Replace What:="EDT", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    rngM.Replace What:="EST", Replacement:=" ", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多