2017-09-02 84 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