9

为什么以下不起作用:

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

完全糊涂了。

4

7 回答 7

14

Range与单个参数一起使用时,该参数被解释为范围名称。

Range(Cells(1,1))

与使用相同

Range(Cells(1,1).Value)

所以你会得到一个结果,只有值是样式Cells(1,1)中的有效范围地址A1

只有当传递两个范围参数时,它们才会被解释为范围的角。

于 2013-07-14T03:58:48.733 回答
5

当您想使用 Cells 属性来指定范围对象的参数时(如果我没记错的话 - 我已经有一段时间没有使用 VBA 了),那么您必须有效地提供两个参数。

所以如果你想引用一个只有一个单元格的范围对象,那么你需要写:

Range(Cells(1, 1), Cells(1, 1)).value = "Hello World"
于 2013-07-14T03:25:42.920 回答
3

而不是像这样引用单个单元格:

Range(Cells(1,1), Cells(1,1))

你可以写:

 Range(Cells(1,1).Address)
于 2015-05-04T12:56:45.367 回答
2

对于单个单元格,它更容易:使用默认的 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))"
于 2016-12-20T21:11:43.983 回答
1

我写这个答案是因为我正在学习 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)

感谢所有在此页面上做出贡献的人;我觉得我现在终于拥有了整个画面。

于 2019-09-20T19:07:42.937 回答
0

我知道有时您需要一个范围来存储除值之外的其他属性。我要做的是创建一个函数来帮助你:

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
于 2020-01-27T21:57:50.707 回答
-3

使用“单元格”时,需要制定 Object.cells ,例如 Application.cells(2,2) 或 activeWorksheet.cells

于 2014-10-26T13:00:12.410 回答