【问题标题】:Range linked to last cell in adjoining column范围链接到相邻列中的最后一个单元格
【发布时间】:2016-06-13 19:10:52
【问题描述】:

我有一个包含 4 列的工作表,我编写了一个宏来将公式放在 A + B 列中,这取决于 D 列中的内容,然后复制并粘贴为值以启用对这些列的过滤。我的问题是每周 D 列会变长。我不想在我的宏中不断更改 A + B (A2:A69422) 范围内的值,其中 69422 是 D 列中最后使用的单元格。

Worksheets("salesinfo").Range("B2").Formula = "= MID(D3,3,5)"
    Range("B2").Select
        Selection.AutoFill Destination:=Range("B2:B69422")
        Range("B2:B69422").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

    Selection.Value = Selection.Value

    Range("A2").Formula = "= VLOOKUP(B2,[Data.xlsb]Stores!$A:$X,4,0)"

    Range("A2").Select
        Selection.AutoFill Destination:=Range("A2:A69422")
        Range("A2:A69422").Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

            Workbooks("Data.xlsb").Close SaveChanges:=False

            Application.CutCopyMode = False

            Range("A2").Select

【问题讨论】:

    标签: vba excel excel-formula vlookup


    【解决方案1】:

    使用以下语法确定 D 列中的最后一行,然后将其分配给 LongInteger 变量。在我的示例中,我使用 lRow 作为我的变量:

    Dim lRow As Long
    
    With ActiveSheet
    
        lRow = .Cells(.Rows.Count, 4).End(xlUp).Row
    
    End With
    

    然后只需在单元格地址的行引用中使用lRow + 1

    【讨论】:

    • 非常感谢你,因为“TheGuyThatDoesn'tKnowMuch”你知道很多。一个小问题,B 列结束了一个单元格短,A 列结束了 1 个单元格太长。再次感谢。
    【解决方案2】:

    正如TheGuyThatDoesn'tKnowMuch 所指出的,声明一个 Long 类型变量并存储模式相关列的最后填充行最好通过自下而上来完成。这相当于从工作表底部开始并点击 Ctrl+

    这里有一些其他方法可以改进您的代码。

    当您只需要 A:D 时,在 VLOOKUP function 内的外部工作簿中引用列 A:X 效率低下;无论如何,对于大量行,INDEX/MATCH 函数对可能会更好。

    您正在将公式写入引用外部工作簿 Data.xlsb 的 A 列,所以我知道这不是包含 salesinfo 工作表的工作表。您应该调整下面的工作簿参考以避免使用ActiveWorkbook property

        Dim lr As Long
    
        With ActiveWorkbook
            With .Worksheets("salesinfo")
                lr = .Cells(.Rows.Count, "D").End(xlUp).Row
                With .Range("B2:B" & lr)
                    .Formula = "=MID(D3, 3, 5)"
                    .Value = .Value
                End With
                With .Range("A2:A" & lr)
                    .Formula = "=VLOOKUP(B2, [Data.xlsb]Stores!$A:$X, 4, FALSE)"
                    'alternate formula
                    '.Formula = "=INDEX([Data.xlsb]Stores!$D:$D, MATCH(B2, [Data.xlsb]Stores!$A:$A, 0))"
                    .Value = .Value
                End With
                .Range("A2").Activate
            End With
        End With
    
        Workbooks("Data.xlsb").Close SaveChanges:=False
    

    用于 B 列的公式让我有点担心。您从 B2 的公式中引用 D3。这意味着如果将公式填充到 B 列以匹配 D 列中的所有值,则最后一个公式实际上将引用 D 列中最后一个填充单元格下方的空白单元格。

    如果您在将两列公式写入近 70K 行时遇到计算滞后问题(耗时太长),字典对象和变量数组可以显着加快速度。


    请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

    【讨论】:

    • 谢谢 Jeeped,工作很愉快,只需要几秒钟,但节省了我不少时间,我才刚刚开始使用 vba,非常感谢您的帮助。我有几本书,vba for dummy for one,你能指出任何好的自学网站的方向吗?虽然只是通过查看这里的帖子,我设法在一点点帮助下写了这篇文章,实际上有点大。谢谢你。 PS.D3 应为 D2,感谢您指出这一点。
    • 你可能会在短时间内学习 VBA;选择一项任务并研究构成该任务的每个“部分”或操作。将一些东西放在一起,如果遇到麻烦,请在此处发布一个新问题,显示您的想法并记录任何问题或错误。 VBA 在很大程度上是一种 DIY 类型的语言;我相信它是故意以这种方式构建的。保留一个“sn-ps”集合,展示您可以参考的各个方面。
    • 谢谢吉普德。非常感谢。
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多