2016-06-13 80 views
1

我有一个工作表,有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 

回答

2

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

Dim lRow As Long 

With ActiveSheet 

    lRow = .Cells(.Rows.Count, 4).End(xlUp).Row 

End With 

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

+0

非常感谢你,因为“TheGuyThatDoesn'KnowMuch”你知道很多。一个小的问题,列B结束了一个单元格短,列A结束了1个单元格太长。再次感谢。 – Sherbetdab

1

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

以下是一些可以改进代码的其他方法。

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

您正在向列A中写入一个引用外部工作簿Data.xlsb的公式,因此我知道这不是包含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更多的方法从依靠选择越来越远,并激活,以实现自己的目标。

+0

谢谢Jeeped,作品一种享受,只需要几秒钟的时间,但为我节省了不少时间,我只是刚开始使用vba,非常感谢您的帮助。我有几本书,vba for one,你可以指向我的任何良好的自学网站的方向吗?尽管通过在这里查看帖子,我设法用一点帮助来写这篇文章,但实际上它确实很棒。谢谢。 PS.D3应该阅读D2,谢谢指出。 – Sherbetdab

+0

你可能会学习VBA;选择一项任务并研究构成该任务的每个“部分”或操作。把一些东西放在一起,如果遇到麻烦,在这里发布一个新问题,显示你提出的问题,并注意任何问题或错误。 VBA非常适合DIY类型的语言;我相信这是故意的结构。保留一些“片段”,展示您可以参考的各个方面。 – Jeeped

+0

谢谢Jeeped。非常感激。 – Sherbetdab

相关问题