【问题标题】:Excel vba - for each cell in selection [duplicate]Excel vba - 对于选择中的每个单元格[重复]
【发布时间】:2018-02-11 09:10:55
【问题描述】:

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

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”这一行,但它指向上面的行作为有问题的行。我不知道那有什么问题。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    试试

    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
    

    如果您需要指定工作表对象(这是一种很好的做法),则需要为您使用的所有 Range/Cells 属性指定它。

    所以这是不正确的:

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

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

    虽然这在某些时候可能会起作用,但这将取决于代码的位置(在工作表代码模块中,与其他模块不同,任何使用 Range 或 Cells 没有工作表对象引用是指包含代码的工作表而不是活动工作表)以及当时哪个工作表处于活动状态,所以有时它会失败——这种错误很难追踪。

    上面的正确语法是:

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

    或者您可以使用 With ... End With 块来节省一点输入:

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

    注意 Range 和 Cells 调用之前的句号(句点)。

    here得到这个。

    【讨论】:

    • 返回同样的错误 1004 "Application-defined or object-defined error"
    • @crni - 现在查看更新的代码。
    • 是的,这行得通。谢谢。我花了一段时间才正确输入。但是我没有工作的原因是什么。
    • @crni - 与ws1.Cells(Rows.Count, "A").End(xlUp).Row 一样,虽然您使用的是ws1.Cells,但Rows.Count, "A" 将引用活动工作表而不是ws1
    • @crni - 我在答案中添加了解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多