2017-09-02 82 views
0

每個單元這只是我的代碼部分:Excel中的VBA - 在選擇

Set ws1 = Sheets("Source") 
Set ws2 = Sheets("Destination") 

finalrow = ws1.Cells(Rows.Count, "A").End(xlUp).Row 

ws1.Range(Cells(2, "B"), Cells(finalrow, "C")).Select 

For Each c In Selection 
     If IsNumeric(c) Then 
      c.Value = 1 * c.Value 
     End If 
Next c 

即使這樣,我指定表「源」和「目的地」,如果我不 運行該宏從表格「源」中,它返回一個錯誤。我認爲問題出現在「For Each c In Selection」一行中,但它指向上面的行作爲有問題的行。我不知道那有什麼問題。

回答

2

嘗試

Set ws1 = ThisWorkbook.Sheets("Source") 
Set ws2 = ThisWorkbook.Sheets("Destination") 

With ws1 
    finalrow = .Cells(.Rows.Count, "A").End(xlUp).Row 

    For Each c In Range(.Cells(2, 2), .Cells(finalrow, 3)) 
      If IsNumeric(c) Then 
       c.Value = 1 * c.Value 
      End If 
    Next c 
End With 

如果需要指定一個工作表對象(這是很好的做法),你需要指定它爲所有使用範圍/細胞的特性。

因此,這是不正確的:

ws1.Range(Cells(2, "B"), Cells(finalrow, "C")).Select 

,因爲兩個單元屬性沒有指定的工作表。

儘管這可能在某些時候有效,但它將取決於代碼的位置(在工作表代碼模塊中,與其他模塊不同,任何使用Range或單元格而沒有工作表對象引用是指包含代碼而不是活動工作表)以及哪個工作表在當時處於活動狀態,因此有時會失敗 - 這種錯誤可能很難追查到。

對於上述正確的語法是:

ws1.Range(ws1.Cells(2, "B"), ws1.Cells(finalrow, "C")).Select 

,或者你可以使用一個帶......最終隨着塊節省一點打字:

With ws1 
    .Range(.Cells(2, 2), .Cells(finalrow, 3)) 
End With 

請注意範圍和單元格呼叫之前的完整停靠點(週期)。

here得到這個。

+0

它返回相同的錯誤1004「應用程序定義或對象定義的錯誤」 – crni

+0

@crni - 現在查看更新的代碼。 – Mrig

+0

是的,這工作。謝謝。我花了一段時間才正確輸入。但是我沒有工作的原因是什麼? – crni