![](/img/trans.png)
[英]VBA Type mismatch error on Do While ActiveCell.Value <> ""
[英]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所說的只是一個補充:每當您遇到這種僅在“有時”發生的典型現象時,通常會使用諸如Active
或Current
或Selection
關鍵字。 這些不是特定的,但是每次您調用宏時都會更改。 無論您選擇什么,都是起點。 您甚至可能開始單擊鼠標,從而在宏運行時更改Selection
。 簡而言之,您應該明確地開始編碼,並且不允許VBA / Excel為您做出決定。
讓我們從Range("J14").Select
。 此行代碼要求VBA已經做出兩個假設:
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.