我通过从另一个范围对象的 Rows() 设置它来创建一个范围对象。当我按行和列引用新创建的范围时,它会生成错误 1004。
我可以按行和列引用原始范围。我已经包括检查以确保 rng 对象指向与数据集对象相同的范围。当我检查 rng 对象时,Value2 显示单行数据。
下面是我正在使用的生成错误的最小代码。
Private Sub TestRangeObject()
Dim i As Long
Dim dataset As Range
Dim rng As Range
Set dataset = sRoster.Range("B18:E37")
For i = 1 To dataset.Rows.Count
Set rng = dataset.Rows(i)
Debug.Print "Rng is Range Obj: " & (TypeOf rng Is Range)
Debug.Print "Same worksheet: " & (rng.Parent.CodeName = dataset.Parent.CodeName)
Debug.Print "Same address: " & (dataset.Rows(i).Address = rng.Address)
'can reference dataset object by row and column
Debug.Print "First column (dataset): " & dataset(i, 1).Address
'error when referencing rng object by row and column
Debug.Print "First column (rng): " & rng(1, 1).Address
Next i
End Sub
最佳答案
作为附加细节:使用 Rows(somerow)
之间存在差异和 Range(somerange)
.
这可以通过一个简单的例子来验证:
Sub Test()
Dim rng As Range
Set rng = Sheet1.Range("1:1")
Debug.Print rng(1, 1).Address ' returns $A$1
Dim rng2 As Range
Set rng2 = Sheet1.Rows(1)
Debug.Print rng2(1).Address ' succeeds, returns $1:$1
Debug.Print rng2(1, 1).Address ' fails
End Sub
解决方案 - 使用
Rows(myRow).Cells
- 已经提出。编辑:
为了捕捉和总结评论中的一些来回,
Row
, 无论是Range.Rows(somerow)
或 Sheet.Rows(somerow)
, 将一个单元称为一行,而不是单个单元格。例如,
Range("A1:E10").Rows
将引用 10 行,而不是 50 个单元格。同理,
Sheet1.Rows(1)
指 1 行,而不是 16384 个单元格。由于没有更好的术语,该行是“考虑的最小单位”。一行不能有列索引 - 它只是一行,而不是构成该行的所有单元格的集合,每个单元格都有自己的列索引。所以你需要使用
Cells
如果您特别想索引某一行中的单元格。
关于excel - 引用 Range.Row() 设置的 Range 对象会生成错误 1004 "Application-defined or object-defined error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56601613/