【问题标题】:Error 1004 unable to get Index property from WorksheetFunction错误 1004 无法从 WorksheetFunction 获取 Index 属性
【发布时间】:2011-12-16 18:14:23
【问题描述】:

我有点坚持这个任务。我有一个宏,它可以从两个不同的工作簿中检索要处理的两个数据范围,并将它们填充到两个 Variant 中。收集是成功的,因为我可以在本地窗口中调试和检查它们,一个是 data1(变量 1 到 79)和其他 data2(变量 1 到 10)。这就是我获取数据的方式1

 With wbExterno.Sheets(1)
data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With

现在我想将相关元素从 data1 复制到一个新数组中,将其命名为 Dim newData as Variant。我已经 checked in SO 关于这个,这就是我得到的

Dim filterCount As Integer
    counter = 0
    filterCount = 1    
' Para cada elemento en el array...
        For i = 1 To UBound(data1)

            'Comparar el campo fecha...
            tmpTest = data1(i, 1)

            ' ...con la fecha del ejercicio
            If (comparacionActual.FechaEjercicio = tmpTest) Then
                'MsgBox "iguales!"

                'se crea un array filtrado con los elementos pertinentes
                filter1(filterCount) = Application.WorksheetFunction.Index(data1, 0, i)

                PlusOne filterCount 'this is a custom function that increments in 1
            End If
        Next

        ' se informa el resultado del filtrado
        MsgBox "Copied: " & filterCount & " rows."

它引发错误 1004 无法从工作表函数获取索引属性。我在这里做错了什么?我应该将输入过滤到 data1 中吗?那样容易吗?更快?

编辑:我已经在具有相同数据(无 VBA)的工作表中尝试了该方法,它仅适用于翻译后的方法名称(=西班牙语中的 Index() 是 =Indice() )。除此之外,它奏效了。但是,尝试将 data1 设置为范围和变体并且......它没有用。 另外,我检查了一个断点,data1 是一个 Variant/Variant(78) 并且每个元素 (data1(i) ) 是一个包含每一行的 Variant (1 到 8)

编辑 2:在答案中建议的测试之后,我尝试了一种更老式的方法:

With wbInterno.Sheets(1)
    data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
    filter1 = wbMe.Worksheets.Add.Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
End With

'... some other stuff

' Field by field
For j = LBound(data1, 2) To UBound(data1, 2)
    'MsgBox "check" & data1(i, j)
    filter1(filterCount, j) = data1(i, j)
Next

它实际上是逐个字段设置新数组中我需要的行。我将不回答这个问题;也许我们可以找到更好的方法。

解决方案我最后使用的代码是这个:

     ' Define array with a range. Initialize destination array with the same size.
     data1 = .Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value
     filter1 = wbMe.Sheets("tmp").Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow).Value

...一些与此无关的代码然后

     Dim tmpTest As Variant
        Dim filterCount As Integer
        filterCount = 1
        ' integer used for presentation only 
        conteoRegistros = 0        
' for each element in array...
        For i = 1 To UBound(data1)
            'Compare a certain field...
            tmpTest = data1(i, 1)
            ' ...with some other variable. If so...
            If (comparacionActual.FechaEjercicio = tmpTest) Then
                '...copy column by column into new
                For j = LBound(data1, 2) To UBound(data1, 2)
                    'MsgBox "check" & data1(i, j)
                    filter1(filterCount, j) = data1(i, j)
                Next

                PlusOne filterCount
                PlusOne conteoRegistros
            End If
        Next

【问题讨论】:

  • 那么你的变量 filter1 的尺寸是多少?
  • 我将 filter1 设置为 Variant()。我应该给它尺寸吗?就像设置一个同样大但空白的范围?
  • 当然,上面 index 的第一个参数应该是一个数组(范围),但 data1 是您定义的值。见msdn.microsoft.com/en-us/library/ff197581.aspx
  • 如果我将 data1 设置为 .Range(tmpStr + ":" & ...),没有该值,它仍然会引发同样的错误。
  • 设置断点并检查传递给索引函数的内容,然后在工作表中对其进行测试以查看问题所在。

标签: arrays vba worksheet-function variant


【解决方案1】:

好的,我有时间看看。如果您的Index 函数没有正确的参数,那么它将抛出error 1004。假设您的范围是单个单元格,那么当您在第 2 列中查找值时,它不会提供任何内容(即error 1004)。但是第 1 列第 1 行会返回正确的结果。

所以在您的代码中确保变量i 没有被超出。所以这就是你的代码有什么问题:

For i = 1 To UBound(data1)

应该是

For i = 1 To UBound(data1, 2)

所以它不会超过数组中的列数。

【讨论】:

  • 太棒了!我会在一段时间内检查一下,我会告诉你:)
  • 这会获取第一行,然后逐列,对吗?我想要做的是将一些行复制到一个新的 Variant 数组中,我只能在第二次编辑中使用代码。谢谢
  • 我提供的最后一段代码仅用于说明目的,并不供您复制和使用。您要复制的代码是“应该是”单词后面的代码。这就是问题所在,您正在循环遍历数组的行而不是列。这应该使代码工作,因为您将为index 函数输入有效数据。目前您输入的数据无效。我将删除说明性代码以免混淆您。
  • 确实,我是这么理解的。 :) 如您所见,在我对问题所做的最后一次更新中(上周五),我将代码设置为在数组中运行,就像您所说的那样。谢谢
  • 那我已经正确回答了你原来的问题。请这样标记。
【解决方案2】:

正如 Remou 指出的,第一个参数应该是一个范围。

但是,除了删除 .value 之外,您还需要稍微修改代码。

data1 需要作为 Range 变暗,并使用 Set 关键字分配,如下所示:

Dim data1 as Range
Set data1 = wbExterno.Sheets(1).Range(tmpStr + ":" & ToolboxMod.Number2Char(lastCol) & lastRow)

【讨论】:

  • 我还必须创建新变量 Dim test as variant 以执行 For i = 1 To UBound(test) 并通过数组运行。最后,它引发了同样的错误:(
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多