Arrays 使用VBA在excel中排序和聚合单元格数据时遇到问题

Arrays 使用VBA在excel中排序和聚合单元格数据时遇到问题,arrays,vba,excel,bubble-sort,Arrays,Vba,Excel,Bubble Sort,我已经更新了这个 更新亮点 更改部分代码,以删除结果Sheet8.L5字段中不必要的逗号 还实施了Feelthis提出的建议 现在它只返回“1,9”,而不是所需的“1,9,29,37,50,61” 原件(职位稍有变动) 我试图从三张纸上获取细胞数据,每张纸上有五个细胞,总共有十五个细胞。删除所有零值。按数字顺序排列剩余的。将其插入到另一个工作表的单个单元格中,以逗号分隔。所有单元格数据应仅包含正整数 我在下面提供了一个数据示例和我的代码。如果有比我尝试的方式更好的方法,我愿意接受其他解决方案

我已经更新了这个

更新亮点

  • 更改部分代码,以删除结果Sheet8.L5字段中不必要的逗号
  • 还实施了Feelthis提出的建议
  • 现在它只返回“1,9”,而不是所需的“1,9,29,37,50,61”
原件(职位稍有变动)

我试图从三张纸上获取细胞数据,每张纸上有五个细胞,总共有十五个细胞。删除所有零值。按数字顺序排列剩余的。将其插入到另一个工作表的单个单元格中,以逗号分隔。所有单元格数据应仅包含正整数

我在下面提供了一个数据示例和我的代码。如果有比我尝试的方式更好的方法,我愿意接受其他解决方案

下面的代码确实在aggregateSeptermber()中返回了一个错误。返回错误的那一行有一条解释它的注释。谢谢你

Sub AggregateSeptember()

    Dim i As Integer
    Dim j As Integer
    Dim SeptemberTerm1Aggregate As String
    Dim SeptemberTerm1(0 To 14) As Integer
    Dim SeptemberTerm2() As Integer
    Dim SeptemberCols
    SeptemberCols = Array("M5", "N5", "O5", "P5", "Q5")

    For i = 0 To 14
        If i < 5 Then
            If Sheet5.Range(SeptemberCols(i)) <> 0 Then
                SeptemberTerm1(i) = Sheet5.Range(SeptemberCols(i))
            End If
        ElseIf i < 10 Then
            If Sheet6.Range(SeptemberCols(i - 5)) <> 0 Then
                'SeptemberTerm1(i - 5) = Sheet6.Range(SeptemberCols(i - 5))
                SeptemberTerm1(i) = Sheet6.Range(SeptemberCols(i - 5))
            End If
        ElseIf i < 15 Then
            If Sheet7.Range(SeptemberCols(i - 10)) <> 0 Then
                'SeptemberTerm1(i - 10) = Sheet7.Range(SeptemberCols(i - 10))
                SeptemberTerm1(i) = Sheet7.Range(SeptemberCols(i - 10))
            End If
        End If
    Next i

    ' This next line no longer returns an error
    SeptemberTerm2 = BubbleSrt(SeptemberTerm1, True)

    For j = 0 To 14
        If SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & SeptemberTerm2(j)
        If j > 0 And j < 14 And SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & ", "
    Next j

    Sheet8.Range("L5").Value = SeptemberTerm1Aggregate

End Sub

Public Function BubbleSrt(ArrayIn, Ascending As Boolean)

    Dim SrtTemp As Variant
    Dim i As Long
    Dim j As Long


    If Ascending = True Then
        For i = LBound(ArrayIn) To UBound(ArrayIn)
             For j = i + 1 To UBound(ArrayIn)
                 If ArrayIn(i) > ArrayIn(j) Then
                     SrtTemp = ArrayIn(j)
                     ArrayIn(j) = ArrayIn(i)
                     ArrayIn(i) = SrtTemp
                 End If
             Next j
         Next i
    Else
        For i = LBound(ArrayIn) To UBound(ArrayIn)
            For j = i + 1 To UBound(ArrayIn)
                If ArrayIn(i) < ArrayIn(j) Then
                    SrtTemp = ArrayIn(j)
                    ArrayIn(j) = ArrayIn(i)
                    ArrayIn(i) = SrtTemp
                End If
            Next j
        Next i
    End If

    BubbleSrt = ArrayIn

End Function 
执行后,第8页L5应=“1、9、29、37、50、61”

我完全被这个问题难住了,以前还没有写过VB,我会非常感谢你的帮助

提前感谢您的时间和考虑, 提姆

下面的数据是VBA运行之前的数据。代码运行Sheet8.L5.value=“1,9,29,37,50,61”后,如上所述。)

资料



资料


Sub-aggregateSeptermber()
作为整数的Dim i
作为整数的Dim j
昏暗的九月术语1聚合为字符串
Dim SeptemberTerm1(0到14)作为整数
Dim SeptemberTerm2()作为整数
黯淡的九月
SeptemberCols=数组(“M5”、“N5”、“O5”、“P5”、“Q5”)
对于i=0到14
如果我小于5,那么
如果表5.范围(Septembencols(i))为0,则
SeptemberTerm1(i)=表5.范围(Septemberterms(i))
如果结束
如果我小于10那么
如果表6.范围(Septembencols(i-5))为0,则
SeptemberTerm1(i-5)=表6.范围(SeptemberCols(i-5))
如果结束
如果我小于15那么
如果表7.范围(Septembencols(i-10))为0,则
SeptemberTerm1(i-10)=表7.范围(SeptemberCols(i-10))
如果结束
如果结束
接下来我
'下一行不再返回错误
SeptemberTerm2=气泡RT(SeptemberTerm1,真)
对于j=0到14
如果SeptemberTerm2(j)>0,则SeptemberTerm1Aggregate=SeptemberTerm1Aggregate和SeptemberTerm2(j)
如果j>0且j<14且SeptemberTerm2(j)>0,则SeptemberTerm1Aggregate=SeptemberTerm1Aggregate&“
下一个j
表8.范围(“L5”)。值=9月1日聚集
端接头
公共函数BubbleSrt(ArrayIn,升序为布尔值)
Dim SrtTemp作为变型
我想我会坚持多久
Dim j尽可能长
如果升序=真,则
对于i=LBound(ArrayIn)到UBound(ArrayIn)
对于j=i+1至UBound(ArrayIn)
如果ArrayIn(i)>ArrayIn(j),那么
SrtTemp=ArrayIn(j)
ArrayIn(j)=ArrayIn(i)
ArrayIn(i)=SrtTemp
如果结束
下一个j
接下来我
其他的
对于i=LBound(ArrayIn)到UBound(ArrayIn)
对于j=i+1至UBound(ArrayIn)
如果ArrayIn(i)

我已经解决了。不过,如果有人有任何想法可以通过多行循环或更有效的方式来实现这一点,那就太好了

我已经在下面发布了正确的代码。我留下了两行令人不快的文字,但如果有人想看的话,我就把它们注释掉了。我犯了愚蠢的错误

谢谢你花了很多时间在这件事上,特别是感受这件事的人

Sub AggregateSeptember()

    Dim i As Integer
    Dim j As Integer
    Dim SeptemberTerm1Aggregate As String
    Dim SeptemberTerm1(0 To 14) As Integer
    Dim SeptemberTerm2() As Integer
    Dim SeptemberCols
    SeptemberCols = Array("M5", "N5", "O5", "P5", "Q5")

    For i = 0 To 14
        If i < 5 Then
            If Sheet5.Range(SeptemberCols(i)) <> 0 Then
                SeptemberTerm1(i) = Sheet5.Range(SeptemberCols(i))
            End If
        ElseIf i < 10 Then
            If Sheet6.Range(SeptemberCols(i - 5)) <> 0 Then
                'SeptemberTerm1(i - 5) = Sheet6.Range(SeptemberCols(i - 5))
                SeptemberTerm1(i) = Sheet6.Range(SeptemberCols(i - 5))
            End If
        ElseIf i < 15 Then
            If Sheet7.Range(SeptemberCols(i - 10)) <> 0 Then
                'SeptemberTerm1(i - 10) = Sheet7.Range(SeptemberCols(i - 10))
                SeptemberTerm1(i) = Sheet7.Range(SeptemberCols(i - 10))
            End If
        End If
    Next i

    ' This next line no longer returns an error
    SeptemberTerm2 = BubbleSrt(SeptemberTerm1, True)

    For j = 0 To 14
        If SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & SeptemberTerm2(j)
        If j > 0 And j < 14 And SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & ", "
    Next j

    Sheet8.Range("L5").Value = SeptemberTerm1Aggregate

End Sub

Public Function BubbleSrt(ArrayIn, Ascending As Boolean)

    Dim SrtTemp As Variant
    Dim i As Long
    Dim j As Long


    If Ascending = True Then
        For i = LBound(ArrayIn) To UBound(ArrayIn)
             For j = i + 1 To UBound(ArrayIn)
                 If ArrayIn(i) > ArrayIn(j) Then
                     SrtTemp = ArrayIn(j)
                     ArrayIn(j) = ArrayIn(i)
                     ArrayIn(i) = SrtTemp
                 End If
             Next j
         Next i
    Else
        For i = LBound(ArrayIn) To UBound(ArrayIn)
            For j = i + 1 To UBound(ArrayIn)
                If ArrayIn(i) < ArrayIn(j) Then
                    SrtTemp = ArrayIn(j)
                    ArrayIn(j) = ArrayIn(i)
                    ArrayIn(i) = SrtTemp
                End If
            Next j
        Next i
    End If

    BubbleSrt = ArrayIn

End Function 
Sub-aggregateSeptermber()
作为整数的Dim i
作为整数的Dim j
昏暗的九月术语1聚合为字符串
Dim SeptemberTerm1(0到14)作为整数
Dim SeptemberTerm2()作为整数
黯淡的九月
SeptemberCols=数组(“M5”、“N5”、“O5”、“P5”、“Q5”)
对于i=0到14
如果我小于5,那么
如果表5.范围(Septembencols(i))为0,则
SeptemberTerm1(i)=表5.范围(Septemberterms(i))
如果结束
如果我小于10那么
如果表6.范围(Septembencols(i-5))为0,则
“SeptemberTerm1(i-5)=表6.范围(SeptemberCols(i-5))
SeptemberTerm1(i)=表6.范围(Septemberterms(i-5))
如果结束
如果我小于15那么
如果表7.范围(Septembencols(i-10))为0,则
“SeptemberTerm1(i-10)=表7.范围(SeptemberCols(i-10))
SeptemberTerm1(i)=表7.范围(Septemberterms(i-10))
如果结束
如果结束
接下来我
'下一行不再返回错误
SeptemberTerm2=气泡RT(SeptemberTerm1,真)
对于j=0到14
如果SeptemberTerm2(j)>0,则SeptemberTerm1Aggregate=SeptemberTerm1Aggregate和SeptemberTerm2(j)
如果j>0且j<14且SeptemberTerm2(j)>0,则SeptemberTerm1Aggregate=SeptemberTerm1Aggregate&“
下一个j
表8.范围(“L5”)。值=9月1日聚集
端接头
公共函数BubbleSrt(ArrayIn,升序为布尔值)
Dim SrtTemp作为变型
我想我会坚持多久
Dim j尽可能长
如果升序=真,则
对于i=LBound(ArrayIn)到UBound(ArrayIn)
对于j=i+1至UBound(ArrayIn)
如果ArrayIn(i)>ArrayIn(j),那么
SrtTemp=ArrayIn(j)
ArrayIn(j)=ArrayIn(i)
ArrayIn(i)=SrtTemp
如果结束
下一个j
接下来我
其他的
对于i=LBound(ArrayIn)到UBound(ArrayIn)
对于j=i+1至UBound(ArrayIn)
如果
Sub AggregateSeptember()

    Dim i As Integer
    Dim j As Integer
    Dim SeptemberTerm1Aggregate As String
    Dim SeptemberTerm1(0 To 14) As Integer
    Dim SeptemberTerm2() As Integer
    Dim SeptemberCols
    SeptemberCols = Array("M5", "N5", "O5", "P5", "Q5")

    For i = 0 To 14
        If i < 5 Then
            If Sheet5.Range(SeptemberCols(i)) <> 0 Then
                SeptemberTerm1(i) = Sheet5.Range(SeptemberCols(i))
            End If
        ElseIf i < 10 Then
            If Sheet6.Range(SeptemberCols(i - 5)) <> 0 Then
                'SeptemberTerm1(i - 5) = Sheet6.Range(SeptemberCols(i - 5))
                SeptemberTerm1(i) = Sheet6.Range(SeptemberCols(i - 5))
            End If
        ElseIf i < 15 Then
            If Sheet7.Range(SeptemberCols(i - 10)) <> 0 Then
                'SeptemberTerm1(i - 10) = Sheet7.Range(SeptemberCols(i - 10))
                SeptemberTerm1(i) = Sheet7.Range(SeptemberCols(i - 10))
            End If
        End If
    Next i

    ' This next line no longer returns an error
    SeptemberTerm2 = BubbleSrt(SeptemberTerm1, True)

    For j = 0 To 14
        If SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & SeptemberTerm2(j)
        If j > 0 And j < 14 And SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & ", "
    Next j

    Sheet8.Range("L5").Value = SeptemberTerm1Aggregate

End Sub

Public Function BubbleSrt(ArrayIn, Ascending As Boolean)

    Dim SrtTemp As Variant
    Dim i As Long
    Dim j As Long


    If Ascending = True Then
        For i = LBound(ArrayIn) To UBound(ArrayIn)
             For j = i + 1 To UBound(ArrayIn)
                 If ArrayIn(i) > ArrayIn(j) Then
                     SrtTemp = ArrayIn(j)
                     ArrayIn(j) = ArrayIn(i)
                     ArrayIn(i) = SrtTemp
                 End If
             Next j
         Next i
    Else
        For i = LBound(ArrayIn) To UBound(ArrayIn)
            For j = i + 1 To UBound(ArrayIn)
                If ArrayIn(i) < ArrayIn(j) Then
                    SrtTemp = ArrayIn(j)
                    ArrayIn(j) = ArrayIn(i)
                    ArrayIn(i) = SrtTemp
                End If
            Next j
        Next i
    End If

    BubbleSrt = ArrayIn

End Function