为什么以下不起作用:
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
完全糊涂了。
答案 0 :(得分:12)
当Range
与单个参数一起使用时,参数将被解释为范围名称。
Range(Cells(1,1))
与使用
相同Range(Cells(1,1).Value)
因此,只有Cells(1,1)
的值是A1
样式中的有效范围地址
仅当传递两个范围参数时,它们才会被解释为范围的角落。
答案 1 :(得分:4)
当你想使用Cells属性来指定范围对象的参数时(如果我没记错的话 - 我有一段时间没有使用过VBA),那么你必须有效地提供两个参数。
因此,如果要引用只有一个单元格的范围对象,则需要编写:
Range(Cells(1, 1), Cells(1, 1)).value = "Hello World"
答案 2 :(得分:3)
而不是像这样引用单个单元格:
Range(Cells(1,1), Cells(1,1))
你可以写:
Range(Cells(1,1).Address)
答案 3 :(得分:1)
对于单个单元格更容易:使用默认的Cells()函数:
Cells(1,1) = "hello world"
或使用Sheet的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
说明:
细胞功能接收:
字符串参数 - 您可以在其中指定A1_And_Colon样式范围
或两个Cell参数 - 范围的起始单元格和结束单元格。
所以用'单元格设置范围'你需要用逗号分隔两个单元格:
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))"
答案 4 :(得分:0)
我之所以写这个答案,是因为我正在学习VBA,花了我三天的大部分时间才弄清楚这里发生了什么,而官方文档根本没有讨论这个话题。从我今天的角度来看,此质量检查很好,但信息有点分散。
关于使用Range()对象内的Cells()属性引用单个单元格范围的信息,这是我所了解的。我一直都需要做!
给出有效的ws对象...
您认为这会起作用:
ws.Range(ws.Cells(i,j))
不是。您会收到运行时错误'1004':对象'_Worksheet'的方法'Range'失败。
由@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)
谢谢,感谢在此页面上做出贡献的所有人;我觉得现在终于有了整个图片。
答案 5 :(得分: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
答案 6 :(得分:-2)
使用“cells”时,需要配制Object.cells, 例如Application.cells(2,2)或activeWorksheet.cells