簡體   English   中英

在ActiveCell <>范圍內執行

[英]Do While ActiveCell <> Range

我有這個VBA excel宏代碼

Sub fillcells()
    Range("J14").Select
    Do While ActiveCell <> Range("J902")
        ActiveCell.Copy
        ActiveCell.Offset(6, 0).Select
        ActiveCell.PasteSpecial
    Loop
End Sub

起初它工作正常,但現在有時當我嘗試運行宏時,循環突然在單元格J242處停止,有時會出現錯誤“不匹配類型”,有時宏只選擇了單元格J14而沒有執行循環

不確定要做什么,但是(如OP注釋中所述) 不要使用.Select / .Activate 以下應該做你想做的(我認為):

Sub fillcells()
Dim i& ' Create a LONG variable to count cells

For i = 14 To 901 Step 6
    Cells(i, 10).Offset(6, 0).FormulaR1C1 = Cells(i, 10).FormulaR1C1
Loop
End Sub

這將從單元格J14循環到J901 ,將復制/粘貼*復制到偏移6行的單元格。


*請注意,我實際上並未復制/粘貼。 由於您的原始代碼使用了PasteSpecial ,因此我假設您只希望粘貼值。 在這種情況下,您可以將兩個范圍/單元格設置為相等。

@BruceWayne所說的只是一個補充:每當您遇到這種僅在“有時”發生的典型現象時,通常會使用諸如ActiveCurrentSelection關鍵字。 這些不是特定的,但是每次您調用宏時都會更改。 無論您選擇什么,都是起點。 您甚至可能開始單擊鼠標,從而在宏運行時更改Selection 簡而言之,您應該明確地開始編碼,並且不允許VBA / Excel為您做出決定。

讓我們從Range("J14").Select 此行代碼要求VBA已經做出兩個假設:

  1. 如果您打開了多個Excel文件。 它應該以哪個Excel文件開頭?
  2. 文件中可能有幾張紙。 應在哪些紙上選擇J14

顯式編碼意味着(希望始終)非常明確地指代您所指的內容。 因此,您不僅應該聲明Range("J14")還應該使用:

ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Range("J14")

但是在另一個答案中指出,在這種情況下甚至沒有必要。 而是如圖所示循環行並使用:

ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(6, 0).Formula = ThisWorkbook.Worksheets("SheetNameYouWantToReferTo").Cells(i, 10).Offset(i, 10).Formula

由於這有點長,您可以使用With語句將其縮短:

With ThisWorkbook.Worksheets("SheetNameYouWantToReferTo")
    .Cells(i, 10).Offset(6, 0).Formula = .Cells(i, 10).Formula
End With

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM