我正在尝试设置以下范围:
Range("F3:F102,J3:J102,N3:N102,R3:R102,V3:V102,Z3:Z102,AD3:AD102,AH3:AH102,AL3:AL102,AP3:AP102,AT3:AT102,AX3:AX102,BB3:BB102,BF3:BF102,BJ3:BJ102,BN3:BN102,BR3:BR102,BV3:BV102,BZ3:BZ102,CD3:CD102")
我尝试使用 For 循环和 Application.Union
迭代地构建它,而不是手动输入 Range,因为我必须构建许多类似的范围。
Sub Build_Range()
Dim FirstParamCol, ParamCells As Range
Dim i As Integer
Application.ScreenUpdating = False
Application.EnableEvents = False 'avoid infinite loop if any target cell is changed
Set ParamCells = Range("F3:F102") 'There 20 different "Parameter" columns, the first one being Column F (column 6)
'Note: After column F (6), the other 19 columns are 4 columns apart each (j/10, N/14, ...)
'so I looped for i = 1 to 19 and used the formula column = 6 (column F) + i * 4:
For i = 1 To 19 'There are other 19 "Parameter" columns
Set ParamCells = Application.union(ParamCells, Range(ActiveSheet.Cells(3, 6 + 4 * i), ActiveSheet.Cells(102, 6 + 4 * i)))
Next i
MsgBox ParamCells.Address 'TODO: For Debugging only
Range("B103").Value = ParamCells.Address
Exitsub:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
我得到以下范围,但缺少最后一列(“CD3:CD102”):
Range("F3:F102,J3:J102,N3:N102,R3:R102,V3:V102,Z3:Z102,AD3:AD102,AH3:AH102,AL3:AL102,AP3:AP102,AT3:AT102,AX3:AX102,BB3:BB102,BF3:BF102,BJ3:BJ102,BN3:BN102,BR3:BR102,BV3:BV102,BZ3:BZ102")
我尝试增加 For 循环中最后一个 i 的值,但得到的范围与上述相同。
我尝试使用以下代码手动设置范围。我得到与上面相同的范围,再次错过了最后一列:
Sub Build_Range_2()
Dim ParamCells As Range
Set ParamCells = Range("F3:F102,J3:J102,N3:N102,R3:R102,V3:V102,Z3:Z102,AD3:AD102,AH3:AH102,AL3:AL102,AP3:AP102,AT3:AT102,AX3:AX102,BB3:BB102,BF3:BF102,BJ3:BJ102,BN3:BN102,BR3:BR102,BV3:BV102,BZ3:BZ102,CD3:CD102")
MsgBox ParamCells.Address
Range("B103").Value = ParamCells.Address
End Sub
我搜索了它是否是 Range 的最大大小限制或类似的东西,但我找不到任何东西。
我在 MsgBox 和 Range("B103").Value 上打印构建的 Range,仅用于调试目的(我不需要显示 Range,而是使用它/使用它)。
最佳答案
首先,好的信息是您构建该范围的代码可以正常工作!
插入一个 ParamCells.Select
并检查它选择的内容。甚至 "CD3:CD102"
也不会出现在地址 ParamCells.Address
中,它是 ParamCells
范围的一部分。
问题是 .Address
限制为 255 个字符。
如果比较,您可以轻松检查
Debug.Print ParamCells.Address
Debug.Print ParamCells.Address(False, False)
$F$3:$F$102,$J$3:$J$102,$N$3:$N$102,$R$3:$R$102,$V$3:$V$102,$Z$3:$Z$102,$AD$3:$AD$102,$AH$3:$AH$102,$AL$3:$AL$102,$AP$3:$AP$102,$AT$3:$AT$102,$AX$3:$AX$102,$BB$3:$BB$102,$BF$3:$BF$102,$BJ$3:$BJ$102,$BN$3:$BN$102,$BR$3:$BR$102,$BV$3:$BV$102,$BZ$3:$BZ$102
F3:F102,J3:J102,N3:N102,R3:R102,V3:V102,Z3:Z102,AD3:AD102,AH3:AH102,AL3:AL102,AP3:AP102,AT3:AT102,AX3:AX102,BB3:BB102,BF3:BF102,BJ3:BJ102,BN3:BN102,BR3:BR102,BV3:BV102,BZ3:BZ102,CD3:CD102
第一个有 253 个字符,在字符串中添加 CD3:CD102
会超过 255,因此会被截断。第二个没有绝对地址,因此它更短,所以最后你可以看到 ...,BZ3:BZ102,CD3:CD102
CD3:CD102
实际上在范围内.
因此,无论何时您使用 ParamCells
,它都适用于整个范围,无论 ParamCells.Address
被截断为什么。
所以问题是您需要显示地址吗?然后你需要一些解决方法(取决于你的实际目标是什么)。还是只是调试您的代码然后使用 ParamCells.Select
来检查它。
如果要输出ParamCells
的实际地址,可以通过循环ParamCells.Areas
来实现。
Dim AddrOfParamCells As String
Dim Area As Range
For Each Area In ParamCells.Areas
AddrOfParamCells = IIf(AddrOfParamCells <> vbNullString, AddrOfParamCells & ",", vbNullString) & Area.Address
Next Area
Debug.Print AddrOfParamCells
请注意,此地址只能用于验证,但不能使用它来构建像 Set TestRange = Range(AddrOfParamCells)
这样的范围,因为它超过了 255 个字符。
关于Excel VBA 正在更改我设置的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71761326/