Excel VBA 正在更改我设置的范围

标签 excel vba

我正在尝试设置以下范围:

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/

相关文章:

arrays - 数组分割和提取vba excel

vba - 如何在 Excel VBA 脚本中递增单元格?

excel - 为什么我的 Worksheet_Activate 不会触发?

excel - 使用VBA将单词与数字分开

python - 将 xlwings 模块导入 python 3.4

excel - 在查找 Excel 中查找具有多个条件的最后一个匹配项

vba - 通过电子邮件 ID 从 Excel 中的联系人列表中获取姓名

excel - Spark : Unexpected end of input stream

excel - 当前面有字母时如何按数字排序?

excel - 通过 Excel 自动化 IE 以填写下拉列表并继续