【问题标题】:Get a weekly average on day macro is run获取宏运行日的每周平均值
【发布时间】:2020-07-11 10:22:33
【问题描述】:

忙于学习宏观课程。处理此类问题的最佳方法是什么:

a) 每天都会在数据表中插入一个每日值

b) 一周从星期一到星期日

c) 在任何给定时刻,如果 宏运行时,每周平均需要单独输出 床单。因此,如果今天是星期四,则周一至周三的平均值需要为 拉。

d) 我附上了一个示例数据集,但我会扩展它 稍后当我弄清楚哪些工具将是真实数据时 合适。

【问题讨论】:

  • 一种方法(许多方法中的一种)是在 A 列中定位昨天的日期。向后循环(同时对 B 列中的相应单元格求和,并可能保留天数)直到您遇到星期一。然后将总和除以天数计数器。确保不要除以零。如果遇到问题,请编写一些代码并更新您的问题。请包括代码(或导致问题的部分)。万事如意
  • 感谢回复,我会试试这个以及我需要了解循环(已经开始使用步骤-1等)

标签: excel vba


【解决方案1】:

我使用了以下 VBA 代码,我相信它会适合你

它将在另一张工作表上为您提供当前一周内日期的平均值。我按照你的要求更新了月份功能

Sub Test()
Dim LR As Integer

LR = Cells(Rows.Count, "A").End(xlUp).Row
Range("E1").Value = "=Weeknum(Today())"
Range("F1").Value = "=Month(Today())"

For i = 1 To LR
    Range("C" & i).Value = WorksheetFunction.WeekNum(Range("A" & i))
    Range("D" & i).Formula = "=Month(A" & i & ")"
Next i

Worksheets("Planilha2").Range("A1").Value = WorksheetFunction.AverageIf(Worksheets("Planilha1").Range("C:C"), Worksheets("Planilha1").Range("E1").Value, Worksheets("Planilha1").Range("B:B"))
Worksheets("Planilha2").Range("B1").Value = WorksheetFunction.AverageIf(Worksheets("Planilha1").Range("D:D"), Worksheets("Planilha1").Range("F1").Value, Worksheets("Planilha1").Range("B:B"))

End Sub

【讨论】:

  • 从你的代码看来是对的,分享错误代码,看看你的情况出了什么问题。一个月的完成到同样的逻辑,我更新了答案,看看
  • Month 函数在Worksheets.Function 上不可用,这就是为什么我使用另一种方法的原因,请查看链接以查看https://docs.microsoft.com/en-us/office/vba/excel/concepts/events-worksheetfunctions-shapes/list-of-worksheet-functions-available-to-visual-basic 上可用的所有公式
  • 是的,我用了这个月的数据透视表。谢谢回复。我添加了一个标题行,但我在这一行出现错误,因为我更改了范围(数据表的第一行是列标题)Worksheets("Consolidation report").Range("D66").Value = WorksheetFunction.AverageIf(Worksheets("Sheet1").Range("C2:C"), Worksheets("Sheet1").Range("E1").Value, Worksheets("Sheet1").Range("B2:B"))
  • 错误为1004 无法获取worksheetfunction类的AverageIf属性
  • 运行 vba 代码后能否与工作表的打印屏幕共享?
【解决方案2】:

使用 adodb 会很好。标题是 MYDay,数量。

Sub exeSQLgetdata()
 
    Dim Rs As Object
    Dim strConn As String
    Dim i As Integer
    Dim Fn As String
    Dim Ws As Worksheet, toWs As Worksheet
    Dim strSQL As String, sWsname As String
    Dim vDB As Variant
    Dim rngWeek As Range
    Dim st, et
    
    st = Timer
    
    Set Ws = Sheets(1)  '<~~ data Sheet
    Set toWs = Sheets(2) '<~~ Report Sheet
    
    sWsname = "[" & Ws.Name & "$]"
    
    Fn = ThisWorkbook.Path & "\" & "Database9.accdb"
    
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=Excel 12.0;"
 
    Set Rs = CreateObject("ADODB.Recordset")
    
    strSQL = "SELECT DATEPART('W', MYDay, 1) as WeekDay, AVG(Quantity) AS AVERAGE FROM " & sWsname & " GROUP BY DATEPART('W', MYDay,1) "
    
    Rs.Open strSQL, strConn
    
    If Not Rs.EOF Then
        With toWs
            For i = 0 To Rs.Fields.Count - 1
                .Cells(1, i + 1) = Rs.Fields(i).Name
            Next i
            .UsedRange.Offset(1).Clear
            .Range("a2").CopyFromRecordset Rs
            Set rngWeek = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
            vDB = rngWeek
            For i = 1 To UBound(vDB, 1)
                vDB(i, 1) = Format(vDB(i, 1), "ddd", vbSunday)
            Next i
            rngWeek = vDB
        End With
    End If
    Rs.Close
    Set Rs = Nothing
    et = Timer
    
    Debug.Print "Get Data time : " & et - st & " seconds" 
End Sub

上面的代码是按工作日平均的。每周平均值如下。

Sub exeSQLgetdata2()
 
    Dim Rs As Object
    Dim strConn As String
    Dim i As Integer
    Dim Fn As String
    Dim Ws As Worksheet, toWs As Worksheet
    Dim strSQL As String, sWsname As String
    Dim vDB As Variant
    Dim rngWeek As Range
    Dim st, et
    
    st = Timer
    
    Set Ws = Sheets(1)  '<~~ data Sheet
    Set toWs = Sheets(2) '<~~ Report Sheet
    
    sWsname = "[" & Ws.Name & "$]"
    
    Fn = ThisWorkbook.Path & "\" & "Database9.accdb"
    
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=Excel 12.0;"
 
    Set Rs = CreateObject("ADODB.Recordset")
    '2 : Monday to Sunday,  1: Sunday to Saturday
    strSQL = "SELECT DATEPART('WW', MYDay, 2) as WeekNum, AVG(Quantity) AS AVERAGE FROM " & sWsname & " GROUP BY DATEPART('WW', MYDay,2) "
    
    Rs.Open strSQL, strConn
    
    If Not Rs.EOF Then
        With toWs
            For i = 0 To Rs.Fields.Count - 1
                .Cells(1, i + 1) = Rs.Fields(i).Name
            Next i
            .UsedRange.Offset(1).Clear
            .Range("a2").CopyFromRecordset Rs
'            Set rngWeek = .Range("a2", .Range("a" & Rows.Count).End(xlUp))
'            vDB = rngWeek
'            For i = 1 To UBound(vDB, 1)
'                vDB(i, 1) = Format(vDB(i, 1), "ddd", vbSunday)
'            Next i
'            rngWeek = vDB
        End With
    End If
    Rs.Close
    Set Rs = Nothing
    et = Timer
    
    Debug.Print "Get Data time : " & et - st & " seconds" 
End Sub

数据表 (1) 图片

Resut Sheet sheet(2) 图片

【讨论】:

  • 谢谢,这看起来有点复杂,因为我刚开始使用 VBA :) 但会看看它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多