将VBA范围存储在变量中

时间:2016-08-23 16:51:53

标签: excel vba excel-vba

我正在尝试在VBA中为矩阵定义动态范围,如下所示:

Dim Range1 As Range, Range2 As Range
'...
'define some indexes
'...
Set Range1 = Sheets("Sheet1").Range(Cells(rowFirst, colFirst), Cells(rowEnd,colEnd))

但是我收到运行时错误#1004,我不知道为什么以及如何修复它。

我是VBA的新手,所以我期待你能帮助我。

感谢所有人!

注意rowFirst,colFirst,rowEnd,colEnd变量不断变化,因为我需要在工作表中从矩阵移动到矩阵。

修改

感谢大家的回复,但是我仍然在同一行上收到同样的错误。 让我更深入地解释一下我正在尝试做什么。我需要采用13x91(单元格)矩阵并对其进行转置,然后我需要将所有列连接在一个单独的列中,并将结果列放在工作表2中。这样做了20次在列中前进(而不是在行中)。我在这里留下代码:

    Sub ConvertRangeToColumn()
        Dim it As Integer
        Dim rowInit As Integer, rowEnd As Integer, colInit As Integer, colEnd As Integer
        rowInit = 1
        rowEnd = 91
        colInit = 1
        colInit = 13
        For it = 1 To 20
            Dim Range1 As Range, Range2 As Range, Rng As Range
            Dim rowIndex As Integer
            xTitleId = "Automatización"
            Set Range1 = Hoja1.Range(Hoja1.Cells(rowInit, colInit), Hoja1.Cells(rowEnd, colEnd))
            Set Range2 = Sheets("Hoja2").Range(Cells(1, it))
            colInit = colInit + 13
            colEnd = colEnd + 13
            rowIndex = 0
            Application.ScreenUpdating = False
            For Each Rng In Range1.Rows
                Rng.Copy
                Range2.Offset(rowIndex, 0).PasteSpecial Paste:=xlPasteAll, Transpose:=True
                rowIndex = rowIndex + Rng.Columns.Count
            Next
            Application.CutCopyMode = False
            Application.ScreenUpdating = True
        Next it
    End Sub

注2:由于我使用西班牙语在Excel中工作,Hoja1对象意味着Sheet1

4 个答案:

答案 0 :(得分:3)

根据你的新代码三件事:

  1. Hoja1应为Worksheets("Hoja1")
  2. 您从未为colEnd分配值,但已colInit两次。
  3. 您不能在Cells()内放置一个Range()。只需使用Cells()本身。
  4. 代码:

    Sub ConvertRangeToColumn()
        Dim it As Integer
        Dim rowInit As Integer, rowEnd As Integer, colInit As Integer, colEnd As Integer
        rowInit = 1
        rowEnd = 91
        colInit = 1
        colEnd = 13
        For it = 1 To 20
            Dim Range1 As Range, Range2 As Range, Rng As Range
            Dim rowIndex As Integer
            xTitleId = "Automatización"
            Set Range1 = Worksheets("Hoja1").Range(Worksheets("Hoja1").Cells(rowInit, colInit), Worksheets("Hoja1").Cells(rowEnd, colEnd))
            Set Range2 = Worksheets("Hoja2").Cells(1, it)
            colInit = colInit + 13
            colEnd = colEnd + 13
            rowIndex = 0
            Application.ScreenUpdating = False
            For Each Rng In Range1.Rows
                Rng.Copy
                Range2.Offset(rowIndex, 0).PasteSpecial Paste:=xlPasteAll, Transpose:=True
                rowIndex = rowIndex + Rng.Columns.Count
            Next
            Application.CutCopyMode = False
            Application.ScreenUpdating = True
        Next it
    End Sub
    

答案 1 :(得分:1)

尝试下面的代码。应该使用工作表引用单元格。

       Dim Range1 As Range, Range2 As Range
       '...
      'define some indexes
         Set Range1 = Sheets("Sheet1").Range(Sheets("Sheet1").Cells(rowFirst, colFirst), Sheets("Sheet1").Cells(rowEnd,colEnd))                                           

答案 2 :(得分:1)

Sheets函数隐含地引用Sheets的{​​{1}}集合。您可能意味着使用ActiveWorkbook集合,该集合不包含“图表工作表”和其他非工作表对象。

不合格,Worksheets隐含地引用Range;同样适用于不合格的ActiveSheet电话。

Cells 要求 Range(cell1, cell2)cell1cell2调用中符合条件的工作表对象位于同一工作表中 - 如果{{ 1}}是不合格的,然后处理活动工作表将起作用。

但此处Range符合Range条件,因此RangeSheets("Sheet1")必须在同一cell1工作表上,否则你会得到你得到的错误。

此外,如果cell2位于Sheets("Sheet1")(具有正在运行的VBA代码的工作簿)中,那么您可以通过其全局对象(可以在属性<中重命名)来引用它/ em> toolwindow),使用其代码名称 - 默认情况下,Sheets("Sheet1")代表“Sheet1”工作表。

换句话说:

ThisWorkbook

答案 3 :(得分:0)

错误1004 =如果数组中的一个或多个单元格(单元格区域)包含设置为包含911个以上字符的字符串,则可能会出现此问题。

- &GT;单元格中的某个值是否超过911个字符?