首页 > 解决方案 > VBA 的范围导致“运行时错误 9 下标超出范围”

问题描述

每当我超出一定数量的列时,以下代码就会失败,例如,如果我正在使用这个数组:AD2:BM,一切正常,并且它将字母彼此绑定(其原始目的)。但是,每当我尝试从 AD2:KQ 开始时,它都会通过指示失败

运行时错误 9 下标超出范围。

您能否建议如何扩展此代码中的范围(不产生错误)?问候西

Sub WL()
  Dim R As Long, C As Long, X As Long, Data As Variant
  Data = Range("AD2:BM" & Columns("AD:BM").Find("*", , xlValues, , xlRows, xlPrevious).Row)
  For R = 1 To UBound(Data, 1)
    X = -1
    For C = 1 To UBound(Data, 2)
      If Len(Data(R, C)) Then
        X = X + 1
        If X Then Data(R, C) = Data(R, C + 1) & Data(R, C)
      End If
    Next
  Next
  Range("AD2:BM2").Resize(UBound(Data)) = Data
End Sub

2.更新:

W's & L's 的所有字符串都以一个字母开头并以一个字母结尾。中间的一切都很完美。

问题是:如何将第一个极右值和第一个极左值(即单数)加倍?例如,我在下面的附图中突出显示了这些事件[不要被愚弄,每个字符串都以一个字母开头和结尾——这两种情况完全可以看到]。

我需要开始和结束 L 或 W 加倍,从 W 到 WW 和从 L 到 LL。而介于两者之间的 W 和 L 保持原样,即从一个句点移动到另一个句点并加入另一个单个字母 [就像在下面的代码中一样]。

谢谢

在此处输入图像描述

标签: excelvba

解决方案


您将 C 增加到 UBound(Data, 2) 但在该循环中,您希望使用 UBound 之外的 Data(r, C + 1)。

Sub WL()
  Dim R As Long, C As Long, X As Long, Data As Variant
  Data = Range("AD2:BM" & Columns("AD:BM").Find("*", , xlValues, , xlRows, xlPrevious).Row)
  For R = 1 To UBound(Data, 1)
    X = -1
    For C = 1 To UBound(Data, 2) - 1   '<~~ FIX HERE!!
      If Len(Data(R, C)) Then
        X = X + 1
        If X Then Data(R, C) = Data(R, C + 1) & Data(R, C)    'Now C+1 doesn't error
      End If
    Next
  Next
  Range("AD2:BM2").Resize(UBound(Data)) = Data
End Sub

推荐阅读