2011-09-26 89 views
0

我有下面的宏,让脚本超出范围的错误在If arr(0) <> opt Then arr(0) = VAL_DIFFExcel宏标超出范围的错误

,如果我看到一个数组的长度它显示2.我不明白为什么我不能够访问arr(0),据我所知数组总是以0开始。我能够打印arr(1),arr(2)值。

下面的宏能够找到相似的记录并复制到sheet2.Here我也想用sheet1中的颜色来突出显示。请帮帮我。

Option Base 1 
Sub Tester() 

    Const COL_ID As Integer = 1 
    Const COL_SYSID As Integer = 2 
    Const COL_STATUS As Integer = 4 
    Const COL_OPTION As Integer = 3 
    Const VAL_DIFF As String = "XXdifferentXX" 

    Dim d As Object, sKey As String, id As String 
    Dim rw As Range, opt As String, rngData As Range 
    Dim rngCopy As Range, goodId As Boolean 
    Dim FirstPass As Boolean, arr 

     With Sheet1.Range("A1") 
      Set rngData = .CurrentRegion.Offset(1).Resize(_ 
          .CurrentRegion.Rows.Count - 1) 
     End With 
     Set rngCopy = Sheet1.Range("F2") 

     Set d = CreateObject("scripting.dictionary") 
     FirstPass = True 

    redo: 
     For Each rw In rngData.Rows 

      sKey = rw.Cells(COL_SYSID).Value & "<>" & _ 
        rw.Cells(COL_STATUS).Value 

      If FirstPass Then 
       'Figure out which combinations have different option values 
       ' and at least one record with id=US or CHN 
       id = rw.Cells(COL_ID).Value 
       goodId = (id = "US" Or id = "CHN") 
       opt = rw.Cells(COL_OPTION).Value 

       If d.exists(sKey) Then 
        arr = d(sKey) 'can't modify the array in situ... 
        If arr(1) <> opt Then arr(1) = VAL_DIFF 
        If goodId Then arr(2) = True 
        d(sKey) = arr 'return [modified] array 
       Else 
        d.Add sKey, Array(opt, goodId) 
       End If 

      Else 
       'Second pass - copy only rows with varying options 
       ' and id=US or CHN 
       If d(sKey)(2) = VAL_DIFF And d(sKey)(1) = True Then 
        rw.Copy rngCopy 
        Set rngCopy = rngCopy.Offset(1, 0) 
       End If 
      End If 

     Next rw 
     If FirstPass Then 
      FirstPass = False 
      GoTo redo 
     End If 

    End Sub 
+0

您是否尝试过在数组中调用Lbound和Ubound并在引用它们之前查看真正的边界是否正确? – Brad

回答

2

停止在模块顶部使用选项库1。它似乎可以让事情变得更容易,但最终只会导致混乱。我已经给你提供了着色范围的答案 - 请尝试在发布之前先查看并试用它们。

+0

感谢您的建议,当我删除或更改为选项基地0.在这两种情况下,我存在的代码无法正常工作。 – Raj

+0

然后只需调整您发布的代码中的索引即可。 0 - > 1和1 - > 2 –

+0

您好,现在我在这里得到错误d(sKey)(0)= VAL_DIFF和d(sKey)(1)= True.if我chnaged o-> 1和1 - > 2.输出不如预期。 – Raj

0

要检查数组的下限位置,请使用Lbound(arr)

此外,您没有将arr初始化为数组。像这样初始化它: Dim arr() As Variant

您还可以指定数组的较低维度和较高维度。 Dim arr(3 To 10) As Variant。这将创建一个从零开始的7个元素的数组。我建议通过Google搜索学习更多关于VBA中的数组的知识。

+0

:即使在数组初始化后,我也会得到相同的错误。 – Raj

+0

我不认为这个问题与任何索引问题有关,Raju。它看起来像代码只需要重写。你有一个数组的字典对象。你可能想制作一个2D数组。 Dim arr(0 To 1000,0 To 2)As Variant:arr(0)= d(sKey)(0):arr(1)= d(sKey)(1)[...]你想做什么? – Bobort