【问题标题】:Getting a 'Range' of object '_Global' failed (Run-Time Error 1004) when running an Excel macro运行 Excel 宏时获取对象“_Global”的“范围”失败(运行时错误 1004)
【发布时间】:2020-04-09 12:23:12
【问题描述】:

这些是宏的步骤:

  1. 这个宏应该选择A1并将其作为空格输入以重复excel表中的随机变量。

  2. 从随机输入中选择输出并复制。

  3. 选择一个位置来输出复制的日期,在本例中为“第 200 行,第 (n) 列”,然后在 n 迭代时将每组结果粘贴到一个新列中。

我收到 1004 范围错误,我不知道如何解决它。我错过了什么?

Sub newloop()
'
' newloop Macro
'

Dim n As Integer

n = 1
Do Until n = 5
Range("A1").Select
ActiveCell.FormulaR1C1 = ""
Range("AA25,AA47,AA69,AA91,AA113,AA135,AA157,AA179,AA201,AA223,AA245,AA267,AA289").Select
Selection.Copy
Range("R200C" & n).Select
ActiveSheet.Paste
n = n + 1
Loop

End Sub

【问题讨论】:

  • 我相信是.Copy 行。您不能复制不连续的范围。
  • @BruceWayne 你可以!这部分工作正常,Excel 中的 VBA 调试器指向 Range("R200C" & n).Select 作为问题。
  • Range("R200C" & n).Select 应该是什么范围?

标签: excel vba


【解决方案1】:

除了修复范围语法错误之外,您还可以避免在每次迭代时更改 A1 单元格,因为每次复制/粘贴操作都会触发工作表计算:

Sub newloop()
    Dim n As Integer

    Range("A1").Value = "" ' trigger first sheet calculation
    With Range("AA25,AA47,AA69,AA91,AA113,AA135,AA157,AA179,AA201,AA223,AA245,AA267,AA289") ' reference input range
        For n = 1 To 5
            .Copy Cells(200, n) ' copy referenced range and paste it to current nth column from row 200 downwards
        Next
    End With
End Sub

更好的是,直接通过Calculate方法来计算表:

Sub newloop()
    Dim n As Integer

    ActiveSheet.Calculate
    With Range("AA25,AA47,AA69,AA91,AA113,AA135,AA157,AA179,AA201,AA223,AA245,AA267,AA289")
        For n = 1 To 5
            .Copy Cells(200, n)
        Next
    End With
End Sub

【讨论】:

  • 谢谢,这太完美了!
【解决方案2】:

Range() 不支持将 R1C1 表示法作为参数。因此,改变:

Range("R200C" & n).Select

与:

Cells(200,n).Select

错误就会消失。

【讨论】:

    【解决方案3】:

    解决方案

    在代码开头使用常量是一个好习惯,这样你就可以 快速更改某些内容并观察代码的行为,例如您想要将数据粘贴到第 500 行,或者您想要 10 倍的结果而不是 5,或者您想要添加另一个单元格区域...

    Sub NewLoop()
    
      Const cStrRange As String = "AA25,AA47,AA69,AA91,AA113,AA135,AA157," & _
                                  "AA179,AA201,AA223,AA245,AA267,AA289"
      Const cLngRow As Long = 200
      Const cN As Integer = 5
    
      Dim oRng As Range
      Dim n As Integer
    
      Set oRng = Range(cStrRange)
    
      For n = 1 To cN
        Range("A1").FormulaR1C1 = ""
        oRng.Copy Cells(cLngRow, n)
      Next
    
    End Sub
    

    没有抓住重点

    当你不仔细阅读OP的意愿时:

    模范,短而短

    Option Explicit
    
    Sub NewLoopExemplary()
    
      Const cStrA As String = "A1"
      Const cStrRange As String = "AA25,AA47,AA69,AA91,AA113,AA135,AA157," & _
                                  "AA179,AA201,AA223,AA245,AA267,AA289"
      Const cLngRow As Long = 200
      Const cN As Integer = 5
    
      Dim oRng As Range
    
      Range(cStrA).FormulaR1C1 = ""
      Set oRng = Range(cStrRange)
      oRng.Copy Cells(cLngRow, 1).Resize(1, cN)
    
    End Sub
    
    Sub NewLoopShort()
      Const n As Integer = 5
      Range("A1").FormulaR1C1 = ""
      Range("AA25,AA47,AA69,AA91,AA113,AA135,AA157,AA179,AA201,AA223,AA245,AA267," _
          & "AA289").Copy Cells(200, 1).Resize(1, n)
    End Sub
    
    Sub NewLoopShorter()
      Range("A1").FormulaR1C1 = ""
      Range("AA25,AA47,AA69,AA91,AA113,AA135,AA157,AA179,AA201,AA223,AA245,AA267," _
          & "AA289").Copy Cells(200, 1).Resize(1, 5)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多