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。
因此您正在查找范围开始前的一个单元格。

您需要参考 AuxDatDatArr 关于它们所代表的范围

' 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 开始索引的单元格集合。