【问题标题】:Print multi dimensional array onto excel sheet VBA将多维数组打印到excel表VBA中
【发布时间】:2021-02-14 21:04:31
【问题描述】:

我正在尝试创建一个 for 循环,它需要我几周的时间,然后是另一个 for 循环,它查看我的产品以计算今年、去年的销售额,然后是差异。除了本周之外,我所有的星期都得到 0,知道我的代码有什么问题吗?谢谢

Sub Weekly_Recap()
Dim h, d As Worksheet
Dim myarray(), answers() As Variant
'Dim week, datarange As Range
Dim D1, i As Long


Set h = Worksheets("Helper")
Set d = Worksheets("Data")


myarray = d.Range("P2:P51")

D1 = UBound(myarray, 1)

ReDim answers(1 To D1, 1 To 3)

For i = 1 To D1

    If myarray(i, 1) <= h.Range("A1") Then
    
    For j = 1 To 17
    
        answers(i, 1) = Application.WorksheetFunction.SumIfs(d.Range("G:G"), d.Range("B:B"), myarray(i, 1), d.Range("F:F"), h.Cells(j, 4))
        answers(i, 2) = Application.WorksheetFunction.SumIfs(d.Range("H:H"), d.Range("B:B"), myarray(i, 1), d.Range("F:F"), h.Cells(j, 4))
        answers(i, 3) = (answers(i, 1) - answers(1, 2)) / answers(i, 2)
    
            If h.Cells(j, 4) = "FLAVORED/FUNCTIONAL WATER" Then
                
                h.Range(h.Range("F2"), h.Range("F2").Offset(D1, 2)).Value = answers
                ElseIf h.Cells(j, 4) = "SALTY BAGGED/CANISTER SNACKS" Then
                
                h.Range(h.Range("K2"), h.Range("K2").Offset(D1, 2)).Value = answers
            End If
        Next j
    End If

Next i

End Sub

【问题讨论】:

  • Data 和 Helper 选项卡的屏幕截图会很有用。

标签: arrays excel vba loops


【解决方案1】:

有点难以理解你想要做什么。当我尝试在调试模式下运行您的代码时,我注意到带有偏移量的行正在覆盖前几行中的数据,这就是您得到全 0 的地方。在假设循环 i = 1 和 j = 1 中,你得到一些值,但在 i = 1 和 j = 2 中你没有(sumif 返回 0),然后你用可变答案覆盖它,然后将其粘贴到工作表中,在end 只有最后一个没有被覆盖。

【讨论】:

    【解决方案2】:

    您需要交换循环以依次计算每个产品的所有周数,否则 week1/product1 的数字将被 week1/product2 然后 week1/product3 等覆盖。

    Option Explicit
    
    Sub Sales()
    
        Dim arWeeks, NoOfWeeks As Long, iLastWeek As Long
        Dim rngSales1 As Range, rngSales2 As Range
        Dim rngWeek As Range, rngProduct As Range
        Dim iWeek As Long, sProduct As String
        Dim h As Worksheet, d As Worksheet
        Dim j As Long, i As Long
        
        Set h = Worksheets("Helper")
        Set d = Worksheets("Data")
        
        Set rngSales1 = d.Range("G:G")
        Set rngSales2 = d.Range("H:H")
        Set rngWeek = d.Range("B:B")
        Set rngProduct = d.Range("F:F")
        
        arWeeks = d.Range("P2:P51")
        iLastWeek = h.Range("A1").Value
        NoOfWeeks = UBound(arWeeks)
        
        ReDim answers(1 To NoOfWeeks, 1 To 3) 'yr1,yr2,diff
        
        For j = 1 To 17 ' products
            
            sProduct = h.Cells(j, 4)
        
            For i = 1 To NoOfWeeks ' weeks
            
                iWeek = arWeeks(i, 1)
                If iWeek <= iLastWeek Then
                
                    With Application.WorksheetFunction
                       answers(i, 1) = .SumIfs(rngSales1, rngWeek, iWeek, rngProduct, sProduct)
                       answers(i, 2) = .SumIfs(rngSales2, rngWeek, iWeek, rngProduct, sProduct)
                    End With
                
                    If answers(i, 2) <> 0 Then
                       answers(i, 3) = (answers(i, 1) - answers(1, 2)) / answers(i, 2)
                    End If
                
                End If
            Next i
            
            If sProduct = "FLAVORED/FUNCTIONAL WATER" Then
                h.Range("F2").Resize(NoOfWeeks, 3).Value = answers
            ElseIf sProduct = "SALTY BAGGED/CANISTER SNACKS" Then
                h.Range("k2").Resize(NoOfWeeks, 3).Value = answers
            End If
         
        Next j
        MsgBox "Done ", vbInformation
    
    End Sub
    
    

    【讨论】:

    • 您知道如何将答案保存到数组中,而不是放入工作簿中吗?我正在尝试按周对数据进行排序,并进行回顾,上面写着“咸味零食 YoY % 高于过去 13 周”,你知道我怎么能让它做这样的事情吗?谢谢
    • @alexa answers() 是一个产品的二维数组 (week,value),你的意思是一个 3D 数组 (product,week,value) 包含多个产品的数字吗?假设您想将第 23 周的 YoY% 与第 10 到第 22 周的 YoY% 进行比较。问题是在今年的前 13 周,您需要比较前几年和当前年份
    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多