【问题标题】:excel vba Method Range of object _worksheet failed when range string is too long当范围字符串太长时,excel vba方法对象_worksheet的范围失败
【发布时间】:2015-02-10 03:54:31
【问题描述】:

当我尝试运行此函数以获取字符串范围时,我收到错误消息:"Method Range of object _Worksheet failed. 我正在运行 excel 2013 和 MSVBA 7.1

这是我的代码:

Public Function dataRange() As Range
  Dim activeMonth As Date, sht As Worksheet, s As String, r As Range
  activeMonth = Format(Now, "MMM-YYYY")
  Set sht = Sheets(Format(Now, "MMM-YYYY"))
  s = ""
  s = "$b$6:$bm$6,$B$9:$Bm$9,$B$12:$Bm$12,$b$15:$bm$15,$B$18:$Bm$18,$b$21:$bm$21,$b$24:$bm$24,$b$27:$bm$27,$b$30:$bm$30,$b$33:$bm$33,"
  s = s & "$B$36:$Bm$36,$B$39:$Bm$39,$B$42:$Bm$42,$B$45:$Bm$45,$B$48:$Bm$48,$B$51:$Bm$51,$B$54:$Bm$54,$B$57:$Bm$57,$B$60:$Bm$60,$B$63:$Bm$63,$B$66:$Bm$66,$B$69:$Bm$69"
  s = s & "$B$72:$BO$72,$B$75:$BO$75,$B$78:$BO$78,$B$81:$BO$81,$B$84:$BO$84,$B$87:$BO$87,$B$90:$BO$90,$B$93:$BO$93,$B$96:$BO$96"
  Set r = sht.Range(s) 'THIS IS WHERE I GET THE ERROR..

 'SO I TRIED THE CODE BELOW BUT IT STILL WON'T PRINT THE WHOLE STRING IN THE DEBUG AREA!!

  Dim r1, r2, r3 As Range
  s = ""
  Set r1 = sht.Range("$b$6:$bm$6,$B$9:$Bm$9,$B$12:$Bm$12,$b$15:$bm$15,$B$18:$Bm$18,$b$21:$bm$21,$b$24:$bm$24,$b$27:$bm$27,$b$30:$bm$30,$b$33:$bm$33")
  Set r2 = sht.Range("$B$36:$Bm$36,$B$39:$Bm$39,$B$42:$Bm$42,$B$45:$Bm$45,$B$48:$Bm$48,$B$51:$Bm$51,$B$54:$Bm$54,$B$57:$Bm$57,$B$60:$Bm$60,$B$63:$Bm$63,$B$66:$Bm$66,$B$69:$Bm$69")
  Set r3 = sht.Range("$B$72:$BO$72,$B$75:$BO$75,$B$78:$BO$78,$B$81:$BO$81,$B$84:$BO$84,$B$87:$BO$87,$B$90:$BO$90,$B$93:$BO$93,$B$96:$BO$96")
  Set r = Union(r1, r2, r3)
  Debug.Print r.Address 'THIS WILL PRINT THE ADDRESS PARTIALLY:
'$B$6:$BM$6,$B$9:$BM$9,$B$12:$BM$12,$B$15:$BM$15,$B$18:$BM$18,$B$21:$BM$21,$B$24:$BM$24,$B$27:$BM$27,$B$30:$BM$30,$B$33:$BM$33,$B$36:$BM$36,$B$39:$BM$39,$B$42:$BM$42,$B$45:$BM$45,$B$48:$BM$48,$B$51:$BM$51,$B$54:$BM$54,$B$57:$BM$57,$B$60:$BM$60,$B$63:$BM$63

  Set dataRange = r

End Function

【问题讨论】:

标签: vba excel


【解决方案1】:
Public Function dataRange() As Range
  Dim sht As Worksheet, rv As Range, r As Range
  Dim i as long

  Set sht = Sheets(Format(Now, "MMM-YYYY"))

  for i=6 to 96 step 3
      Set r = sht.Range("b" & i ":bm" & i)
      if rv is nothing then
          Set rv = r
      else
          Set rv = Application.Union(rv.r)
      end if
  Next i

  Set dataRange = rv
End Function

【讨论】:

    【解决方案2】:

    范围对象存在一些限制,如您所见,需要使用 Union 函数。我不确定 2013 年到底是什么,但我似乎记得以前版本的 Excel 中有 255 个字符的限制(可能是错误的)。无论如何,这将解释分配给范围的错误,它还将解释为什么 r.Address 似乎会截断您的结果。

    在循环中使用Union 函数,如果需要调试以验证地址字符串是否准确,则需要在循环范围内的.Areas 集合上分配回字符串变量:

    Sub foo()
        Dim s As String
        Dim r As Range
        Dim i As Integer
        Dim a As Range
    
        s = ""
    
    
        Set r = Range("B6:BM9") 'initial range
    
        For i = 9 To 96 Step 3
            Set r = Union(r, Range("$B$" & i & ":$BM$" & i))
        Next
    
        'If you need to *see* the range address, you'll need to reconstruct it
    
        For Each a In r.Areas
            If Not s = vbNullString Then
                s = s & "," & a.Address
            Else
                s = a.Address
            End If
        Next
    
        Debug.Print r.Address
    
        Debug.Print s
    
    End Sub
    

    这将为r(截断)打印以下内容:

    $B$6:$BM$9,$B$12:$BM$12,$B$15:$BM$15,$B$18:$BM$18,$B$21:$BM$21,$B$24:$BM$24,$B$27:$BM$27,$B$30:$BM$30,$B$33:$BM$33,$B$36:$BM$36,$B$39:$BM$39,$B$42:$BM$42,$B$45:$BM$45,$B$48:$BM$48,$B$51:$BM$51,$B$54:$BM$54,$B$57:$BM$57,$B$60:$BM$60,$B$63:$BM$63,$B$66:$BM$66
    

    这将为s打印以下内容

    $B$6:$BM$9,$B$12:$BM$12,$B$15:$BM$15,$B$18:$BM$18,$B$21:$BM$21,$B$24:$BM$24,$B$27:$BM$27,$B$30:$BM$30,$B$33:$BM$33,$B$36:$BM$36,$B$39:$BM$39,$B$42:$BM$42,$B$45:$BM$45,$B$48:$BM$48,$B$51:$BM$51,$B$54:$BM$54,$B$57:$BM$57,$B$60:$BM$60,$B$63:$BM$63,$B$66:$BM$66,$B$69:$BM$69,$B$72:$BM$72,$B$75:$BM$75,$B$78:$BM$78,$B$81:$BM$81,$B$84:$BM$84,$B$87:$BM$87,$B$90:$BM$90,$B$93:$BM$93,$B$96:$BM$96
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多