【问题标题】:VBA Excel Loop will not handle arrayVBA Excel 循环不会处理数组
【发布时间】:2017-12-26 23:49:14
【问题描述】:

****更新已解决*****感谢大家帮助我得出这个结论!******

因此,如下所示,我的代码中的所有内容都按预期进行,除了一行。

If c = myArray(x) Then

这个脚本读入一个我没有提到的文件。它从文件中读取“A”列并将每一行放入myArray。我知道该数组有效,因为当我将它循环到对话框中时,它会正确打印出数据。循环功能正确搜索每一行,如果它等于'c',它会抓取我的数据并将其放入另一张表中。我知道这很有效,因为当我输入数据时,它会按预期抓取它。我的麻烦是每当我尝试添加myArray(x) 的元素以将其与整数“c”进行比较时。它拒绝查看 x 整数以正确循环使用整数“x”的myArray()

有人可以向我解释为什么myArray(x) 无法正常循环或帮助我解决问题。我不是资深的 VBA 程序员,但我编写了相当一部分功能正常的代码。我只是觉得我错过了一个小细节,忽略了一些简单的事情。任何帮助都将不胜感激,这是出于工作目的,您将帮助他人而不仅仅是我自己。

Sub myArray()
    Dim FSO As Object, MyFile As Object
    Dim FileName As String, Arr As Variant
    Dim c As Range
    Dim j As Integer, i as Integer
    Dim Source As Worksheet, Target As Worksheet

    FileName = ""   '<--This is left intentionally blank.
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set MyFile = FSO.OpenTextFile(FileName, 1)
    Arr = Split(MyFile.ReadAll, vbNewLine)  
    Set Source = ActiveWorkbook.Sheets("Sheet1")
    Set Target = ActiveWorkbook.Sheets("Sheet2")

    i = 0
    j = 1

   For i = LBound(Arr) To UBound(Arr)
    For Each c In Source.Range("B:D")
        If c = Arr(i) Then
            Source.rows(c.Row).Copy Target.rows(j)
            j = j + 1
        End If
    Next c
Next i

End Sub

【问题讨论】:

  • 发生错误时x的值是多少??
  • 认为您应该在If c = myArray(x) Then 行添加检查以评估它是否不超过数组的上限。类似If c = myArray(x) and x &lt;= ubound(myArray) Then
  • X = 0 应该是这样。 If c = myArray(x) and x
  • 我找到了解决方案,并在上面发布了反映我真正想要的代码的代码。我需要嵌套的 for 循环。感谢大家帮助我得出这个结论。感谢@Chris Mack 帮助我进行 ubounds 和字符串转换。我现在对 vba 编程有了更多的了解。

标签: arrays vba excel for-loop


【解决方案1】:

看起来您可能会在将 x 递增到其上限之后继续检查数组,因为该循环独立于 B1:D6719 循环。

是否可以将代码修改为:

For Each c In Source.Range("B1:D6719")
    If c = CInt(myArray(x)) Then '<--Here is where my problem is, this line right here
        Source.rows(c.Row).Copy Target.rows(j)
        j = j + 1
        x = x + 1
    End If

    If x > UBound(myArray) Then Exit For
Next c

【讨论】:

  • 这对我不起作用,我也尝试了上述 shrivallabha 的两种方法。循环无法识别数组中的整数“x”,当我打印出 x 时,它应该等于 0。
  • 如果你在比较整数,你需要使用CInt,因为你的数组是一个字符串数组。查看我更新的代码。
  • 所以现在说它是数据类型不匹配,所以我尝试了 CLng 甚至 CStr。只要我查找的数字很大,数据类型就必须很长。这仍然无法按我的意愿正常运行。它不再吐出任何错误。程序运行,它仍然拒绝查看我的数组(x)并在 B:D 列中抓取包含我想要的数据的任何行并将其移动到工作表 2。当我手动输入数字时,它运行得很好。我的数组有什么问题???
  • 你能上传工作簿什么的吗?只是一些基本的东西来证明问题。
  • 如果没有 Gmail,我将无法访问它。你有 Dropbox、Google Drive 或类似的东西吗?
【解决方案2】:

尝试调用从 1 开始的数组:

    x = 1
    if c = myArray(x) then

在其他人examples of array in vba 我看到他们从 1 而不是 0 开始

【讨论】:

  • 对不起,我试过用1作为起点,确实不是这样。就像我说的那样,我的数组函数很好,它的 For 循环没有正确地通过数组进行假脱机
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2017-05-26
相关资源
最近更新 更多