associative array in vba like php

后端 未结 2 471
暗喜
暗喜 2020-12-20 07:31

I need your help for building analytics in Microsoft Excel using VBA.

I have one data sheet with y columns and n lines



        
相关标签:
2条回答
  • 2020-12-20 07:46

    So I set my sheet up like this:

    Then using the following code I loaded the array and cycled through each line in the array. I added the Hours as they met the condition and displayed the result in the immediate window.

    Edit: As far as I know excel does not use column names. So the only way I could come up with is this, Where we add the first row into the array then cycle through them looking for the names in the first row of the array to get the position of that column then use the variable to find again.

    A quicker method would likely be an advanced filter with subtotals. Filter on a different page than the data. Or, the best answer would be using a pivot table.

    Sub nubuk()
    
    Dim arr() As Variant
    Dim smTtl As Double
    Dim i&
    Dim lastrow As Long
    Dim lastcolumn
    Dim t&
    Dim cntry&, stus&, hrs&
    
    With ActiveSheet
        lastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
        lastcolumn = Cells(1, .Columns.Count).End(xlToLeft).Column
        Debug.Print lastcolumn
        arr = .Range(.Cells(1, 1), .Cells(lastrow, lastcolumn)).Value
    End With
    For t = 1 To lastcolumn
        Select Case LCase(arr(1, t))
            Case "country"
                cntry = t
            Case "training status"
                stus = t
            Case "training hours"
                hrs = t
            Case Else
        End Select
    Next t
    For i = LBound(arr, 1) To UBound(arr, 1)
        If arr(i, cntry) = "USA" And arr(i, stus) = "Completed" Then
            smTtl = smTtl + arr(i, hrs)
        End If
    Next
    
    Debug.Print smTtl
    
    End Sub
    
    0 讨论(0)
  • 2020-12-20 08:03

    You can make the SQL query to the worksheet in the opened workbook (the same way as to any other workbook). In this case the query string will be as follows:

    SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';
    

    Here is the code

    Sub TestSQLRequest()
    
        Const adOpenStatic = 3
        Const adLockOptimistic = 3
        Const adCmdText = &H1
    
        Select Case LCase(Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")))
            Case ".xls"
                strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 8.0;HDR=YES;"";"
            Case ".xlsm"
                strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source='" & ThisWorkbook.FullName & "';Mode=Read;Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"
        End Select
    
        With CreateObject("ADODB.Connection")
            .Open strConnection
            With .Execute("SELECT SUM([Training Hours]) AS Myval FROM [data sheet$] WHERE Country = 'USA' AND [Training Status] = 'Completed';")
                Myval = .Fields("Myval")
            End With
            .Close
        End With
    
        MsgBox Myval
    
    End Sub
    

    Within the query string, the column names with spaces should be put into square brackets, as well as the name of the worksheet containing data followed by $. It goes without saying that the query can't access to the data, which wasn't saved to the file after some changes have been made to the sheet. Note that Excel 8.0 provider won't work on 64-bit Excel version, try to use Excel 12.0 provider instead (the second strConnection assignment).

    0 讨论(0)
提交回复
热议问题