2016-06-13 28 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

相關問題