【问题标题】:Avoid elements from an array that does not meet criteria避免数组中不符合条件的元素
【发布时间】:2018-03-26 11:19:03
【问题描述】:

好的...下面的行将数组 myArr 的内容放在单元格 A1 中

sh.Range("A1").Resize(cnt, 7).Value = myArr

以下是上述行输出的一些示例记录

18  5   1   23  15  7   6
23  5   3   10  18  20  15
19  10  25  12  21  15  23
10  14  11  9   7   25  20
24  15  23  20  11  17  2
7   15  3   16  24  22  13
14  4   15  13  6   23  2
20  11  22  24  14  3   6
17  5   13  15  19  6   22
9   13  15  7   24  3   6

在此行之前,我需要一个条件,但不知道如何编写语法。 我想将第一个元素 (lbound) 的所有 7 个值相加并检查总和并对所有元素执行此操作,直到 (ubound)。如果总数等于 100,则运行上述行

解决第一个查询后,我还有一个第二个查询,仅列出总数为 100 的元素的数量、总和为 80 的元素数量以及依此类推......通过添加另一个从第一个数组获取信息的数组。计数将在 75 到 125 之间。预期输出应为

75 1
76 0
77 2
.
.
.
125 1

这就是我正在尝试的

Sub foo()
Dim myArr(1 To 10)
Dim cnt As Integer, i As Integer
myArr(1) = "18,5,1,23,15,7,6"
myArr(2) = "23,5,3,10,18,20,15"
myArr(3) = "19,10,25,12,21,15,23"
myArr(4) = "10,14,11,9,7,25,20"
myArr(5) = "24,15,23,20,11,17,2"
myArr(6) = "7,15,3,16,24,22,13"
myArr(7) = "14,4,15,13,6,23,2"
myArr(8) = "20,11,22,24,14,3,6"
myArr(9) = "17,5,13,15,19,6,22"
myArr(10) = "9,13,15,7,24,3,6"
For i = 1 To UBound(myArr)
With Application.WorksheetFunction.Sum = .Sum(.Index(myArr, i, 0))
    'if ....
        '....
    'endif
End With
Range("A1").Resize(cnt, 7).Value = myArr
End Sub

【问题讨论】:

  • 向我们展示您到目前为止编写的代码,并告诉我们您遇到的问题。
  • 按元素是指行吗?如果循环行是每行 = 100 还是每行总计 = 100?后者似乎更有意义。一些示例数据会有所帮助。
  • 感谢您的回复。该代码与我面临的问题无关。我在工作表中得到了 A1:G250 范围内的结果,这是问题中提到的行的输出。我唯一的问题是,不是只填充 250 行,而是只填充总行数为 100 的几行。
  • 是的......按元素,我的意思是行。 A1:G1 的总和应该是 100。如果不是,则不要列出它。我想在阵列准备好甚至在工作表中列出之前执行此操作。第二个查询是,不是列出值,而是列出与其值对应的每一行的总和。我希望我已经解释清楚了。
  • 我已添加示例数据供您参考

标签: vba excel excel-2010 excel-2007


【解决方案1】:

请参阅此处聊天的第 1 部分和第 2 部分:Comments moved to chat 这会将您的字符串拆分为其元素,转换为整数和总和。然后它执行检查,查看 if = 100,如果是,则添加到一个数组,然后可以将其写入工作表。我不禁认为可能有一种比使用这么多数组更有效的方法,但还没有想到。

Sub foo()

Dim myArr(1 To 10)
Dim TotalsArr(1 to 10) 
Dim cnt As Integer, i As Integer

myArr(1) = "18,5,1,23,15,7,6"
myArr(2) = "23,5,3,10,18,20,15"
myArr(3) = "19,10,25,12,21,15,23"
myArr(4) = "10,14,11,9,7,25,20"
myArr(5) = "24,15,23,20,11,17,2"
myArr(6) = "7,15,3,16,24,22,13"
myArr(7) = "14,4,15,13,6,23,2"
myArr(8) = "20,11,22,24,14,3,6"
myArr(9) = "17,5,13,15,19,6,22"
myArr(10) = "9,13,15,7,24,3,6"

Dim tempArr as Variant
Dim Val as Variant
Dim Total as Long
Dim Counter As Long
Dim FinalArr()

第 1 部分:计算项目总数并检查是否 =100,然后添加到结果数组。

Counter = 0
For i = LBound(myArr) to UBound(myArr)
    Total = 0
    tempArr = Split(myArr(i),",")

    For Each Val in tempArr
        Total = Total + Val
    Next Val
    If Total = 100 Then
        ReDim Preserve FinalArr(Counter)
        FinalArr(Counter) = myArr(i)
        Counter = Counter + 1
    End If

    TotalsArr(i) = Total 'store totals for later use in dictionary
Next i    

For i = LBound(FinalArr) to UBound(FinalArr)
    Debug.Print FinalArr(i)
Next i

第 2 部分:计算每个不同的总数。 我们将使用字典来存储每个键的计数(总数)并在再次找到相同键时将其值加一(即计数)进行覆盖

Dim totalsDict As Scripting.Dictionary 'Tools > references > add in microsoft scripting runtime
Dim key as Variant

Set totalsDict = New Scripting.Dictionary

'If prepopulating with totals to check for in range 75 to 125 ( otherwise comment out next 3 code lines

For i = 75 to 125
    totalsdict.Add i , 0
Next i

For i = LBound(TotalsArr) to UBound(TotalsArr)
        totalsDict(TotalsArr(i)) = totalsDict(TotalsArr(i)) + 1 'will overwrite adding one to value
Next i

For Each key in totalsdict.Keys
    Debug.print key, "," , totalsDict(key)
Next key

End Sub

【讨论】:

  • 这正是我想要的。非常感谢您为我付出的时间和精力。上帝保佑!
  • 如果数组是多维数组以避免/消除 tempArr 的使用,我正在努力重写代码。您能否解释一下如果数组是 10 行 7 列,那么您将如何编辑代码?还有什么会在For Each key in totalsdict.Keys 内部将结果保存在二维数组中并最终将整个数组结果输出到 A1 中?谢谢
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 2019-02-09
  • 2017-12-09
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多