3

如果选择了 sheet1 以外的其他工作表或工作簿,为什么在执行宏时代码不起作用?我需要这种格式的代码,以便稍后将单元格条目中的值更改为变量。有没有办法解决这个问题?

Sub testhsa()
    ThisWorkbook.Sheets("Sheet1").Range(Cells(1, 1), Cells(2, 2)).Value = 1
End Sub
4

2 回答 2

6

它不起作用,因为您没有限定Cells语句的组成部分。

您需要以下内容 - 注意.之前的Cells

With ThisWorkbook.Sheets("Sheet1")
    .Range(.Cells(1,1), .Cells(2, 2)).Value = 1
End With

编辑:进一步澄清评论。通过离开.工作表/范围/单元格,您是在告诉 Excel 您想要 Active 父级。即Cells(1, 1)是相同的ActiveSheet.Cells(1,1)Range("A1:D4")是相同的ActiveSheet.Range("A1:D4")

With语句有效地告诉 Excel 后面的任何内容都与该对象“关联”,因此我的 3 行代码与以下内容完全相同:

ThisWorkbook.Sheets("Sheet1").Range(ThisWorkbook.Sheets("Sheet1").Cells(1,1), ThisWorkbook.Sheets("Sheet1").Cells(2, 2)).Value = 1

这向 Excel 阐明,无论ActiveWorkbook您希望代码访问运行代码的工作簿中的范围是什么。

最后,如果您经常使用范围,您会希望将它们分配给一个变量,正如 HeadofCatering 正确建议的那样。

于 2013-07-18T01:22:16.150 回答
3

我强烈建议为您的对象使用变量。它让你更容易弄清楚你在做什么,并显着地清理你的代码。

您可以使用以下代码作为模板:

Sub OperateOnInactiveSheet()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim rng As Range
    Dim writeThis as string

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")
    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(2, 2))
    writeThis = "foo"

    rng.Value = writeThis
End Sub
于 2013-07-18T01:37:23.187 回答