2017-05-12 87 views
7

任何人都可以給我一個爲什麼我會在下面的代碼上收到1004錯誤的感覺?宏循環執行VBA 1004錯誤

如果它是不明確的,我想環路是不是我的命名錶中的所有表,並嘗試選擇一個特定的範圍,將其複製並粘貼到編撰的「定量表」

Dim ws As Worksheet 
Dim x As Integer 
Dim y As Integer 
Dim a As Integer 
Dim b As Integer 
Set ws = Worksheets("Quant Sheet") 
x = 1 
y = 3 
a = 3 
b = 2 

Worksheets("Quant Sheet").Activate 
For Each ws In ActiveWorkbook.Worksheets 
If (ws.Name <> "Quant Sheet") Then 

    ws.Range("A3").Select 
    Selection.Copy 
    Sheets("Quant Sheet").Select 
    Cells(y, 1).Select 
    ActiveSheet.Paste 
    y = y + 1 


End If 

Next ws 
+6

在激活其父工作表之前,您無法選擇單元格。在'AB $ 2:AE'&lastRowSF'之前使用'ws.activate'。一旦工作,看看[如何避免在Excel VBA宏中使用Select](http://stackoverflow.com/questions/10714251/how- to-avoid-using-select-in-excel-vba-macros) – Jeeped

回答

6

你將WS設置爲Worksheets("Quant Sheet"),然後使用該變量ws在您的循環中使用。這可能會導致問題。

試試這個:

Dim ws As Worksheet, mainWS As Worksheet 
Dim x As Integer, y As Integer, a As Integer, b As Integer 
Set mainWS = Worksheets("Quant Sheet") 
x = 1 
y = 3 
a = 3 
b = 2 

For Each ws In ActiveWorkbook.Worksheets 
If (ws.Name <> "Quant Sheet") Then 
    ws.Range("A3").Copy Destination:=mainWS.Cells(y, 1) 
    y = y + 1 
End If 

Next ws 

主要是,要avoid using .Select/.Activate確保你更直接地與數據的工作。

編輯:僅供參考如果不使用y=y+1之類的東西,而是使用偏移量或lastRow變量,那麼您可能會進一步使其變得更加動態,但這是個人偏好,因爲它會完成同樣的事情。 (我也假設了xa,並且b變量在宏別處使用...

+1

'ws.Range(「A3」)。複製Destination:= mainWS.Cells(y,1)'.Paste是一個工作表方法,而不是範圍方法。 – Jeeped

+0

@Jeeped - 德哦,謝謝你的修復,我也注意到了。 – BruceWayne

+0

好吧,我無法以原始形式讓你滿意,我答應給我的狗一個芝士漢堡,所以我必須要去。 – Jeeped

3

As was already stated,你不能.Select細胞在你還沒有在第一個叫.Activate工作表 - 這解決這個問題,但留給你體弱&慢.Select.Activate電話到處相反,具有For Each循環迭代Worksheets集合,所以你得到一個Worksheet對象每次迭代工作:

Sub test() 
    Dim quantSheet As Worksheet, tempSheet as Worksheet 
    Dim i As Integer 

    Set quantSheet = ThisWorkbook.Worksheets("Quant Sheet") 
    i = 3 

    For Each tempSheet In ThisWorkbook.Worksheets 
     If tempSheet.Name <> quantSheet.Name Then 
      quantSheet.Cells(i, 1).Value = tempSheet.Range("A3").Value 
      i = i + 1 
     End If 
    Next tempSheet 
End Sub 

除了已經提供的良好答案和評論之外,您可以將代碼進行很多整理。

  • 縮進是。您可以通過堅持簡單縮進來避免大量錯誤
  • 刪除所有這些未使用的變量(除非您稍後使用它們並且未向我們展示!)
  • 而不是複製和粘貼,直接設置您的值使用.Value。正如已經指出的那樣,儘可能避免SelectActivate
  • 。這包括ActiveSheetActiveWorkbook
  • 給你的變量很好,有意義的名字和你的代碼幾乎會像一個令人討厭的VBA小說閱讀。這樣你總能知道發生了什麼。

發表您的工作代碼Code Review Stack Exchange爲成熟的同行評審。

+0

我意識到我有很多清理工作要做! – Bez