使用包含范围变量的变体数组来填充范围,稍后由范围变量按名称引用是失败的

问题描述 投票:0回答:1

考虑下面的

Subroutine
。我几乎有我要找的东西,但它不太正确。

需要考虑的已知信息:这个

Declarations
Module
语句已经设置了每个变量(总计63 - 我已经剔除大部分以简化下面的示例)作为
Public Variables
随时引用。我在修改
Boolean
变量值时做了类似的事情,但是由于某些原因,
Ranges
失败了,我认为这与它们是
Objects
.

的事实有关

For Loop
正确地提取相关数据并将其放入每个变体数组中的相关
placeholder
中,这意味着-例如
placeholder
StoreStateRng
,在工作表中的范围内保存正确的data,但是当试图操纵存储在占位符inside
中的实际
Range Variable时,它无法被引用。

理论上-我本以为这会将

Variable "StoreStateRng"
物理设置为指定的范围。 . .它确实将
rngVars(i)
设置为指定的范围,并在我在
Variant/Range
上检查它时给它一个
Type
Watch
,但是当同时检查实际的
Variable
时,
Range Variable "StoreStateRng"
是空!

'Excerpt of Declarations Statement

'example of 3 of the 63 variables listed in the arrays below
Public Const StoreStateRng_Col As Integer = 23
Public StoreStateRng As Range
Public StoreStateRng_Val As Variant

'the Variant Arrays defined at the beginning of the sub
Public rngVar As Variant
Public rngVars() As Variant
Public rngVarStr() As Variant
Public rngVarCols() As Variant
Public rngVarColStr() As Variant
Public rngVarVals() As Variant
Public rngVarValStr() As Variant


Sub Get_Ranges()
  Set ws = ThisWorkbook.Sheets(wsNameMain)
  
  rngVars() = Array(StoreStateRng, StoreCityRng, StoreDateRng, StoreNumRng)
  rngVarStr() = Array("StoreStateRng", "StoreCityRng", "StoreDateRng", "StoreNumRng")
  rngVarCols() = Array(StoreStateRng_Col, StoreCityRng_Col, StoreDateRng_Col, StoreNumRng_Col)
  rngVarColStr() = Array("StoreStateRng_Col", "StoreCityRng_Col", "StoreDateRng_Col", "StoreNumRng_Col")

  'Get Known Range that never has blanks in data:
  Set StoreNumRng = ws.Range(Cells(2, StoreNumRng_Col), Cells(2, StoreNumRng_Col))
  Dim i As Integer
  i = 0
  'Get Full Range of Known data set to establish beginning and end rows
  rw = StoreNumRng.Row 'Pulled from the removed excerpt above
  EndRw = StoreNumRng.End(xlDown).Row 'Pulled from the removed excerpt above
  
  For i = LBound(rngVars) To UBound(rngVars)
    If VarType(rngVars(i)) = vbObject Then
      Set rngVar = ws.Range(Cells(rw, rngVarCols(i)), Cells(EndRw, rngVarCols(i)))
      Set rngVars(i) = rngVar
      Debug.Print "The Address for " & rngVarStr(i) & " = " & rngVars(i).Address
    End If
  Next i
  Debug.Print StoreStateRng(1, 1).Value 'Fails because I'm assuming this variable is not set.
  
  
End Sub

我确实尝试修改

.Name
Variant's Placeholder
功能,它正确地引用了
SheetName$COL$ROW
地址(甚至在表格中给了我一个
Named Range
Goto
),以及
Name.Name
值匹配
Name of the Variable
- 但
Debug.Print StoreStareRng(1,1).Value
失败,因为对象本身仍然是空的。

我觉得我真的很接近弄清楚了,但是我很难理解我所缺少的东西。

目标是命名变量以在整个模块中引用。例如 - 我正在处理的数据集有 20 多列宽,与另一组现有数据偏移大约 20 列,通常深度在 10-30 行之间。我想要避免的是

fullRange(3,6).Value
对于Sheet的第23列的第3行。。 . Sheet 的 第 23 列将是指定范围的第 6 列)。 . . .

相反,我想参考

StoreStateRng(3,1).Value
对于这个相同的精确范围,并使用实际工作表列的常量来修改它,如果范围的范围向下变化而不是试图触及可能引用
StoreStateRng
的每个例程. . .

arrays excel vba range variant
1个回答
1
投票

当你这样做的时候

Set rngVars(i) = rngVar 

你正在用一个不同的变量替换原来的 Range 变量,而不是将原来的变量分配给

rngVar

更简单的版本:

Sub Tester()

    Dim rngA As Range, rngB As Range, arrRanges As Variant
    
    arrRanges = Array(rngA, rngB)
    
    Set arrRanges(0) = Range("A1:A5")  'This *replaces* rngA...
    
    Debug.Print rngA.Address           'Error - rngA is still Nothing
    
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.