我在Excel中使用VBA。我希望用户能够选择一组垂直的连续单元格,并将这些单元格的值放入数组中。下面的代码执行此操作,但我无法弄清楚为什么Debug.Print DatArr(0)打印所选区域上方的一个单元格的值。我做错了什么?
Option Explicit
Option Base 0
Sub reconcile()
Dim DatArr As Range
Dim AuxDat As Range
Dim StartCellRange As String
Dim CellCnt As Integer
Set DatArr = Application.InputBox("Select a contiguous range of cells.", "SelectARAnge Demo", Selection.Address, , , , , 8)
CellCnt = DatArr.Count
DatArr.Select
Selection.Offset(0, -1).Select
Set AuxDat = Selection
Debug.Print AuxDat.Count
Debug.Print AuxDat(0)
Debug.Print DatArr(0)
End Sub
答案 0 :(得分:2)
您需要参考AuxDat
和DatArr
,了解他们所代表的范围:
' First cell in AuxDat.
Debug.Print AuxDat.Cells(1, 1).Value
' First cell in DatArr.
Debug.Print DatArr.Cells(1, 1).Value
访问via,例如AuxDat(x)
,即使它超出您选择的范围(只要它符合Excel的范围),也允许任何任何值。例如(使用您的代码),选择范围$B$5:$B$7
:
Debug.Print AuxDat(-1) ' This is allowed and will print A3.
Debug.Print AuxDat(5) ' This is allowed and will print A9.
答案 1 :(得分:1)
这是因为 Option Base 语句影响数组而不是范围。
所以你正在寻找一个单元格之前范围的开始。
答案 2 :(得分:0)
编辑代码:
Option Explicit
Sub reconcile()
Dim DatArr As Range
Dim AuxDat As Range
Dim CellCnt As Integer
Set DatArr = _
Application.InputBox( _
"Select a contiguous range of cells.", _
"SelectARAnge Demo", _
Selection.Address, , , , , 8)
CellCnt = DatArr.Count
If DatArr.Columns(1).Column > 1 Then '<<small error trap in case the user selects column A
Set AuxDat = DatArr.Offset.Offset(0, -1)
End If
Debug.Print AuxDat.Count
Debug.Print AuxDat(1).Value
Debug.Print DatArr(1).Value
End Sub
正如Gary的学生所说,Ranges是从1开始索引的细胞集合。