为什么以下不起作用:
Range(Cells(1,1)).Value = 3
Cells(1,1)
本质上应该与使用A1
权相同吗?
(我意识到我可以做到Cells(1,1).Value = 3
,但我只是好奇为什么它不起作用。)
我阅读了 MSDN 条目,它表明第一个参数必须是A1
样式,但这样的东西确实有效:
Range(Cells(1,1), Cells(2,3)).Value = 2
完全糊涂了。
当Range
与单个参数一起使用时,该参数被解释为范围名称。
Range(Cells(1,1))
与使用相同
Range(Cells(1,1).Value)
所以你会得到一个结果,只有值是样式Cells(1,1)
中的有效范围地址A1
只有当传递两个范围参数时,它们才会被解释为范围的角。
当您想使用 Cells 属性来指定范围对象的参数时(如果我没记错的话 - 我已经有一段时间没有使用 VBA 了),那么您必须有效地提供两个参数。
所以如果你想引用一个只有一个单元格的范围对象,那么你需要写:
Range(Cells(1, 1), Cells(1, 1)).value = "Hello World"
而不是像这样引用单个单元格:
Range(Cells(1,1), Cells(1,1))
你可以写:
Range(Cells(1,1).Address)
对于单个单元格,它更容易:使用默认的 Cells() 函数:
Cells(1,1) = "hello world"
或使用工作表的 Cells() 函数:
Dim sht as Worksheet
Set sht = Sheets("myworksheet") ' or: = Sheets(1)
sht.Cells(1,1) = "hello world"
对于一个范围,您必须使用两个参数,如此处给出的其他答案中所述。但优点是您可以将整个范围的字段设置为一个值。您可以在幕后处理不是“活动”的工作表。例如:
Const colRand = 4
Const colDiff = 5
Dim sht as Worksheet, rngHi As Range, rngRand As Range, rngDiff As Range
Set sht = Sheets("myworksheet") ' or: = Sheets(1)
Set rngHi = sht.Range(sht.Cells(1,1), sht.Cells(3,3)
rngHi = "hello world"
Set rngRand = sht.Range(sht.Cells(1,colRand), sht.Cells(8,colRand) ' column 4, rows 1-8
rngRand = "=RAND()"
Set rngDiff = sht.Range(sht.Cells(2,colDiff), sht.Cells(8,colDiff) ' column 5, rows 2-8
' using FormulaR1C1 in case the sheet isn't set to use that type of formula
Set rngDiff.FormulaR1C1="=RC[-1] - R[-1]C[-1]" ' on previous columnn, diff between this row and previous row
解释:
Cells 函数接收:
一个字符串参数- 在其中指定 A1_And_Colon 样式范围
或两个单元格参数- 范围的开始单元格和结束单元格。
因此,要使用“单元格”设置范围,您需要将两个单元格都用逗号分隔:
Range(Cells(1,1), Cells(1,1)) = "hello world"
Range(Cells(2,2), Cells(3,4)) = "you cannot square around, but you can round a square"
Sheets(1).Cells(5,5) = "=Round(Sqrt(5))"
我写这个答案是因为我正在学习 VBA,我花了三天的大部分时间才弄清楚这里发生了什么,官方文档根本没有讨论这个话题。从我今天的角度来看,这个 QA 很好,但信息有点分散。
以下是我对在 Range() 对象中使用 Cells() 属性来引用单个单元格区域的了解。我需要一直这样做!
给定一个有效的 ws 对象...
你认为这会奏效:
ws.Range(ws.Cells(i,j))
它没有。您将收到运行时错误“1004”:对象“_Worksheet”的方法“范围”失败。
正如@Woody_Pride 所述,显而易见的解决方法是:
ws.Range(ws.Cells(i,j), ws.Cells(i,j))
不幸的是,必须这样做绝对令人愤怒,实际上并不是绝对必要的。
正如@Willby 所断言的那样,您真正需要的是,尽管@chris_neilsen 的回答实际上解释了为什么会出现这种情况:
ws.Range(ws.Cells(i,j).Address)
正如@pashute 所建议的那样,这也将起作用(他的大部分解释都是错误的):
ws.Cells(i,j)
感谢所有在此页面上做出贡献的人;我觉得我现在终于拥有了整个画面。
我知道有时您需要一个范围来存储除值之外的其他属性。我要做的是创建一个函数来帮助你:
Public Function cellRange(ws As Worksheet, rowNum As Integer, colNum As Integer) As Range
Set cellRange = ws.Range(ws.Cells(rowNum, colNum), ws.Cells(rowNum, colNum))
End Function
这样您就可以制作更简洁的代码:
Set ws = ActiveWorkbook.Sheets("Sheet1")
cellRange(ws, 1, 3).Interior.Color = cellRange(ws, 1, 8).Interior.Color
使用“单元格”时,需要制定 Object.cells ,例如 Application.cells(2,2) 或 activeWorksheet.cells