Excel vba – 为每个单元格select

这只是我的代码的一部分:

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 

即使我指定了“Source”和“Destination”工作表,如果我不从工作表“Source”运行macros,它将返回一个错误。 我认为问题是“For Each c In Selection”这一行,但它指向上面的行作为有问题的行。 我不知道那是什么问题。

尝试

 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 

因为两个单元格属性没有指定的工作表。

尽pipe这可能在某些时候有效,但它将取决于代码的位置(在工作表代码模块中,与其他模块不同,任何使用Range或者没有工作表对象引用的单元格都是指包含代码而不是活动工作表),哪个工作表在当时处于活动状态,所以有时会失败 – 这种错误可能很难追查到。

上面的正确语法是:

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

或者你可以使用With … End With块来保存一些input:

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

请注意范围和单元格呼叫之前的完整停止(句点)。

从这里得到这个。