考虑下面的
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
的每个例程. . .
当你这样做的时候
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