【问题标题】:Sum the total of a column based on a value disregarding duplicate in another column - access or excel根据不考虑另一列中的重复项的值对一列的总和求和 - 访问或 Excel
【发布时间】:2019-03-07 17:07:20
【问题描述】:

我一直在搜索基于“提交”是唯一的“关键”列的数据库中“更正”总数的总和。

我找到了一种在 excel 中计算所需内容的方法,但在 VBA 上使用时,计算变得不切实际,因为在 9000 行的文件中运行需要超过 50 分钟,这只是一个示例。

我发现的 excel 公式是带有 COUNTIF 的 SUMPRODUCT,如下所示:

=SUMPRODUCT(($T$2:$T$40=T2)*$I$2:$I$40/COUNTIFS($N$2:$N$40,$N$2:$N$40)) (where T = Key; I= Corrections and N= Submissions)

由于我在添加到 VBA 时无法使用 excel 来减少时间,所以我想知道是否可以将其添加到我从中获取原始数据的 access 数据库中。

【问题讨论】:

  • A) 我不会在 excel 中同时使用 sumproduct 和 countif (至少不是你如何使用它)......你有能力使用 if 语句来消除数据并可以循环细胞到细胞,这应该需要一两秒钟。 B) 你的县发生了什么事?
  • 我无法与 Access 方交谈,但我建议如果您打算在 VBA 中尝试此操作,1) 确定二维数组中的唯一键列表,2 )逐行遍历您的工作表,3)在唯一数组中查找键并添加到所述数组的第二个元素,4)输出数组。这应该节省一些额外的努力,并将数学保留在 VBA 中以节省时间而不是更新/等。在 Excel 中
  • 嗨 @Cyril,谢谢你的输出,我的文件有 35 列和超过 52K 行,我在其他列中还有几个 sumifs 用于时间和其他特定计数,不在这个例子中,所有vba 一起只花了 5 分钟来运行 52K 行并填充所有内容,但是当我意识到不应该计算“提交”上的重复时,我不得不添加 sumproduct,因为我必须将计数基于特定的“键”。一旦我将此计算添加到 excel 中,运行 9k 行的样本需要 50 多分钟。
  • 你能分享VBA代码吗?我无法连接这些点。在哪里搜索什么,检查什么?您是如何获得更正总数列中的数据的?

标签: excel vba ms-access


【解决方案1】:

如果您想在 MS Access 中完成此操作,可以使用以下查询:

select q.key, sum(q.corrections) as [Total of Corrections]
from (select distinct t.submission, t.corrections, t.key from YourTable t) q
group by q.key

(更改 YourTable 以适合您的表名)

如果您想将总数作为原始数据的一部分输出,根据您的屏幕截图,您可以使用:

select t.*, s.[total of corrections]
from YourTable t inner join 
(
    select q.key, sum(q.corrections) as [total of corrections]
    from (select distinct t.submission, t.corrections, t.key from YourTable t) q
    group by q.key
) s on t.key = s.key

(同样,更改 YourTable 的两个匹配项以适合您的表名)

【讨论】:

    【解决方案2】:

    VBA 根据要求,这是我第一次尝试创建这样的东西,所以请原谅我的混乱,下面的所有内容都是使用这样的论坛放在一起的,我只是被上述场景卡住了,所以我决定增加我的列并分隔公式以在 excel 中工作。 如果找到重复项,我会创建一个计数,并在最后使用新列划分每次提交的更正总数。非常感谢您的帮助:

    Sub ImportData()
    
    Dim C_Sheet As String, C_LastRow As Long, D_LastRow As Long
    
    C_Sheet = "ProductivityFinal"
    C_LastRow = Sheets(C_Sheet).Range("N:N").End(xlDown).Row 'count col for Claim ID (no blank expected)
    'C_LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    Dim TmpFolder As String, TmpFile As String, BUfile As String
    
    TmpFolder = "X:\Productivity Report\" 'live folder
    
    TmpFile = "ProductivityFinal.xlsx"
    BUfile = "BU_ProductivityFinal.xlsx"
    
    If Dir(TmpFolder & TmpFile) = "" Then 'check if temp file exists
        MsgBox "No data file exists. Please run report."
    Exit Sub
    End If
    
    If MsgBox("It may take some time. Closing unnecessary files would help to speed up." & vbCrLf & "Continue?", vbOKCancel) = vbCancel Then
        Exit Sub
    End If
    
    Sheets("Summary").Select
    Call Shaper1
    Range("A1").Select
    
    Application.ScreenUpdating = False
    Application.Calculation = xlManual
    
    Workbooks.Open TmpFolder & TmpFile
    D_LastRow = Cells(Rows.Count, 14).End(xlUp).Row
    
    'Clearing data sheets before import
    ThisWorkbook.Activate
    Sheets(C_Sheet).Select
    Call ClearTable1
    
    'Fetch data and paste
    Workbooks(TmpFile).Activate
        Sheets("ProductivityFinal").Select
        Range("A2:T" & D_LastRow).Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
    ThisWorkbook.Activate
        Sheets(C_Sheet).Select
        Range("A2").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        Range("A2").Select
    
    '--Sorting--
    Call SortingTable
    '-----------
    
    
    
    
    Workbooks(TmpFile).Activate
    
    'Take backup and delete original temp file.
    On Error Resume Next
    Application.DisplayAlerts = False
    Workbooks(TmpFile).SaveAs Filename:=TmpFolder & BUfile
    Application.DisplayAlerts = True
    Workbooks(BUfile).Close
    On Error GoTo 0
    
    Kill TmpFolder & TmpFile
    
    
    Call HeaderAndFormula
    
    
    Sheets("Summary").Select
    Call RefreshingPivot
    '--------------
    
    
    Application.ScreenUpdating = True
    'Application.Calculation = xlCalculationAutomatic
    
    Call Shaper4
    MsgBox "Updated"
    
    End Sub
    
    Sub HeaderAndFormula()
    
    Dim C_Sheet As String, C_LastRow As Long
    C_Sheet = "ProductivityFinal"
    
    C_LastRow = Sheets(C_Sheet).Range("N:N").End(xlDown).Row
    Sheets("Config").Range("B4").Value = C_LastRow
    
    'Header
    Sheets(C_Sheet).Range("A1:AE1").Value = Sheets("Config").Range("A10:AE10").Value
    
    'Formulas
    
    Sheets(C_Sheet).Range("A1").Select
    
    Sheets(C_Sheet).Range("U2").Value = "=O2/I2"
    Sheets(C_Sheet).Range("W2").Value = "=V2/G2"
    Sheets(C_Sheet).Range("Z2").Value = "=X2*1"
    Sheets(C_Sheet).Range("AA2").Value = "=TIMEVALUE(M:M)"
    Sheets(C_Sheet).Range("AE2").Value = "=AA2-AB2-AD2"
    
    
    Sheets(C_Sheet).Range("X2").Value = "=IF(P2=Q2,IF(T3=T2,IF(K3<J2,(K2-J2),""STARTED BEFORE SUBMITTING LAST CLAIM""),IF(P2=Q2,(K2-J2))),""Assigned Overnight"")"
    Sheets(C_Sheet).Range("Y2").Value = "=IF(T3=T2,IF(J2-K3<0,""ERROR"",J2-K3),""FIRST CLAIM OF THE DAY"")"
    Sheets(C_Sheet).Range("AB2").Value = "=SUMIF(T:T,T2,Z:Z)"
    Sheets(C_Sheet).Range("AC2").Value = "=IF(Y2=""FIRST CLAIM OF THE DAY"", 0, Y2*1)"
    Sheets(C_Sheet).Range("AD2").Value = "=SUMIF(T:T,T2,AC:AC)"
    
    'Sheets(C_Sheet).Range("AF2").Value = "=I2/COUNTIFS(T:T,T2,N:N,N:N)"
    Sheets(C_Sheet).Range("AF2").Value = "=I2/COUNTIFS($T$2:INDIRECT(""$T$"" & Config!$B$4),T2,$N$2:INDIRECT(""$N$"" & Config!$B$4),$N$2:INDIRECT(""$N$"" & Config!$B$4))"
    
    'Sheets(C_Sheet).Range("V2").Value = "=SUMIF(T:T,T2,I:I)"
    'Sheets(C_Sheet).Range("V2").Value = "=SUMPRODUCT(($T$2:INDIRECT(""$T$"" & Config!$B$4)=T2)*$I$2:INDIRECT(""$I$"" & Config!$B$4)/COUNTIFS($N$2:INDIRECT(""$N$"" & Config!$B$4),$N$2:INDIRECT(""$N$"" & Config!$B$4)))"
    
    'Sheets(C_Sheet).Range("V2").Value = "=SUMIF(T:T,T2,AF:AF)"
    Sheets(C_Sheet).Range("V2").Value = "=SUMIF($T$2:INDIRECT(""$T$"" & Config!$B$4),T2,$AF$2:INDIRECT(""$AF$"" & Config!$B$4))"
    
    
    'Autofill
    'N:14, U:21 , AF: 32
    Range("U2:AF2").AutoFill Destination:=Range(Cells(2, 21), Cells(Rows.Count, 14).End(xlUp).Offset(0, 18))
    
    
    Sheets("Summary").Select
    Application.ScreenUpdating = True
    Call Shaper2
    
    Call Shaper3
    Sheets("Summary").Select
    Application.ScreenUpdating = False
    Sheets(C_Sheet).Select
    
    
    'Sheets("ProductivityFinal").Range("U:AF").Calculate
    Sheets("ProductivityFinal").Range("U2:AF" & Cells(Rows.Count, 14).End(xlUp).Row).Calculate
    
    
    'Recover Pivot Reference
    
    
    Sheets("Summary").PivotTables("PivotTable1").ChangePivotCache ActiveWorkbook. _
        PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "ProductivityFinal!$A$1:$AE$" & C_LastRow, Version:=xlPivotTableVersion14)
    
    End Sub
    Sub ClearTable1()
    Sheets("ProductivityFinal").Select
    If Range("N2") = "" Then
    Exit Sub
    End If
    
    Rows("2:1048561").Select
    Selection.Delete Shift:=xlUp
    Range("U2:AE2").ClearContents 'remove formula
    Sheets("ProductivityFinal").Range("A2:T2").Value = Sheets("Config").Range("A15:T15").Value 'feed sample data
    End Sub
    
    Sub RefreshingPivot() 'all pivot tables
    'Dim PT As PivotTable   
    'Dim WS As Worksheet
    '
    '    For Each WS In ThisWorkbook.Worksheets
    '        For Each PT In WS.PivotTables
    '          PT.RefreshTable
    '        Next PT
    '    Next WS
    
    'Sheets("Summary").PivotTables("PivotTable1").PivotCache.Refresh
    
    ActiveWorkbook.RefreshAll
    
    End Sub
    
    Sub SortingTable() 'sort *** [Key](A to Z) first then [Since Dt](Z to A).
    
    'Format cells----
    Columns("J:K").Select
    Selection.NumberFormat = "dd/mm/yyyy"
    Columns("P:Q").Select
    Selection.NumberFormat = "dd/mm/yyyy"
    Columns("W:W").Select
    Selection.NumberFormat = "0.00%"
    Columns("X:AE").Select
    Selection.NumberFormat = "hh:mm:ss"
    '----
    
    
    Range("A1:AE1").AutoFilter
    
    ActiveWorkbook.Worksheets("ProductivityFinal").AutoFilter.Sort.SortFields.Clear
    
    ActiveWorkbook.Worksheets("ProductivityFinal").AutoFilter.Sort.SortFields.Add _
        Key:=Range("T1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _
        :=xlSortNormal
    With ActiveWorkbook.Worksheets("ProductivityFinal").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    ActiveWorkbook.Worksheets("ProductivityFinal").AutoFilter.Sort.SortFields.Add _
        Key:=Range("J1"), SortOn:=xlSortOnValues, Order:=xlDescending, _
        DataOption:=xlSortNormal
    
    With ActiveWorkbook.Worksheets("ProductivityFinal").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Range("A1:AE1").AutoFilter
    End Sub
    Sub Shaper1() 'Import logo to appear
    Sheets("Summary").Shapes("Rectangle 13").Left = 500
    End Sub
    Sub Shaper2() 'Import logo to disappear
    Sheets("Summary").Shapes("Rectangle 13").Left = 5000
    Sheets("Summary").Shapes("Rectangle 13").Top = 100
    End Sub
    Sub Shaper3() 'Calc logo to appear
    Sheets("Summary").Shapes("Rectangle 14").Left = 500
    End Sub
    Sub Shaper4() 'Calc logo to disappear
    Sheets("Summary").Shapes("Rectangle 14").Left = 5000
    Sheets("Summary").Shapes("Rectangle 14").Top = 100
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2016-01-16
      • 1970-01-01
      相关资源
      最近更新 更多