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

Dei*_*ios 3 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")
Run Code Online (Sandbox Code Playgroud)

我尝试使用 For 循环 和 迭代地构建它Application.Union,而不是手动键入范围,因为我必须构建许多类似的范围。

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")
Run Code Online (Sandbox Code Playgroud)

我得到以下范围,缺少最后一列(“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")
Run Code Online (Sandbox Code Playgroud)

我尝试增加 For 循环中的最后一个 i 值,但得到与上面相同的范围。

我尝试使用以下代码来手动设置范围。我得到与上面相同的范围,再次缺少最后一列:

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
Run Code Online (Sandbox Code Playgroud)

我搜索了它是否是范围最大大小的限制或类似的东西,但我找不到任何东西。

我在 MsgBox 和 Range("B103").Value 上打印构建的 Range,仅用于调试目的(我不需要显示 Range,而是使用它/使用它)。

Pᴇʜ*_*Pᴇʜ 5

首先,好的信息是您构建该范围的代码可以正常工作!

\n

插入 aParamCells.Select并检查它选择的内容。即使"CD3:CD102"没有出现在地址中,ParamCells.Address它也是范围的一部分ParamCells

\n

问题是.Address限制为 255 个字符。

\n

如果您进行比较,您可以轻松检查

\n
Debug.Print ParamCells.Address\nDebug.Print ParamCells.Address(False, False) \n
Run Code Online (Sandbox Code Playgroud)\n
Debug.Print ParamCells.Address\nDebug.Print ParamCells.Address(False, False) \n
Run Code Online (Sandbox Code Playgroud)\n

第一个字符有 253 个字符,添加CD3:CD102到字符串中将超过 255 个字符,因此它被截断。第二个没有绝对地址,因此它更短,所以最后您可以看到\xe2\x80\xa6,BZ3:BZ102,CD3:CD102CD3:CD102实际上在范围内。

\n

因此,任何时候您使用ParamCells它时,无论ParamCells.Address被截断为什么,它都可以在整个范围内工作。

\n

那么问题来了,需要出示地址吗?然后你需要一些解决方法(取决于你的实际目标是什么)。或者只是为了调试您的代码然后用于ParamCells.Select检查它。

\n

如果你想输出ParamCellsvor 验证的实际地址,可以通过循环ParamCells.Areas.

\n
Dim AddrOfParamCells As String\nDim Area As Range\nFor Each Area In ParamCells.Areas\n    AddrOfParamCells = IIf(AddrOfParamCells <> vbNullString, AddrOfParamCells & ",", vbNullString) & Area.Address\nNext Area\n\nDebug.Print AddrOfParamCells\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,该地址只能用于验证,但不能使用它来构建范围,Set TestRange = Range(AddrOfParamCells)因为它超过 255 个字符。

\n