Excel VBA 从 -1 而不是 0 开始的范围数组
Excel VBA Array from Range Starting at -1 rather than 0
我在 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
这是因为 Option Base 语句影响 arrays 而不是 ranges。
因此您正在查找范围开始前的一个单元格。
您需要参考 AuxDat
和 DatArr
关于它们所代表的范围:
' First cell in AuxDat.
Debug.Print AuxDat.Cells(1, 1).Value
' First cell in DatArr.
Debug.Print DatArr.Cells(1, 1).Value
通过例如 AuxDat(x)
访问将允许任何值,即使它超出了您的 selected 范围(只要它符合 Excel 的范围) .例如(使用您的代码),select 范围 $B:$B
:
Debug.Print AuxDat(-1) ' This is allowed and will print A3.
Debug.Print AuxDat(5) ' This is allowed and will print A9.
正在编辑您的代码:
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 的学生所说,范围是从 1 开始索引的单元格集合。
我在 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
这是因为 Option Base 语句影响 arrays 而不是 ranges。
因此您正在查找范围开始前的一个单元格。
您需要参考 AuxDat
和 DatArr
关于它们所代表的范围:
' First cell in AuxDat.
Debug.Print AuxDat.Cells(1, 1).Value
' First cell in DatArr.
Debug.Print DatArr.Cells(1, 1).Value
通过例如 AuxDat(x)
访问将允许任何值,即使它超出了您的 selected 范围(只要它符合 Excel 的范围) .例如(使用您的代码),select 范围 $B:$B
:
Debug.Print AuxDat(-1) ' This is allowed and will print A3.
Debug.Print AuxDat(5) ' This is allowed and will print A9.
正在编辑您的代码:
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 的学生所说,范围是从 1 开始索引的单元格集合。