带有Cell参数的VBA Excel Range()

时间:2013-07-14 03:05:50

标签: excel vba excel-vba

为什么以下不起作用:

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

完全糊涂了。

7 个答案:

答案 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