【问题标题】:VBA Unique Sum CodeVBA 唯一和代码
【发布时间】:2015-05-04 04:27:30
【问题描述】:

我在 A 栏中有姓氏,在 B 栏中有名字,在 C 栏中有日期,在 D 栏中有工作时间。

例如

Surname First Name Date      Hours  
COX     Daniel     3/03/2015 6  
COX     Daniel     3/03/2015 4      
COX     Daniel     4/03/2015 3.5
COX     Daniel     4/03/2015 4  
COX     Daniel     4/03/2015 2.5    
COX     Daniel     4/03/2015 0      

我想将每个人每天工作的小时数汇总到一张新表格中。

Surname First Name Date      Hours
COX     Daniel     3/03/2015 10
COX     Daniel     4/03/2015 10

我有一个可以运行的代码,但是它非常冗长,我想看看我可以如何改进我的编码。我的代码还受到特定日期的条目数量的限制(我最多完成了 6 个条目);可能还有更多。

Sub WorkHours()

Application.ScreenUpdating = False

Dim R As Integer
For R = ActiveSheet.UsedRange.Rows.Count To 1 Step -1

'Sort Data by Date and then by Surname
Sheets("Sheet1").Select
Worksheets("Sheet1").Columns("A:N").Sort key1:=Range("C2"), order1:=xlAscending, Header:=xlYes
Worksheets("Sheet1").Columns("A:N").Sort key1:=Range("A2"), order1:=xlAscending, Header:=xlYes

'Sum Work Hours for One Day
Worksheets("Sheet1").Select
If Range("C" & R) = Range("C" & (R + 1)) And Range("C" & R + 1) = Range("C" & (R + 2)) And Range("C" & R + 2) = Range("C" & (R + 3)) And Range("C" & R + 3) = Range("C" & (R + 4)) And Range("C" & R + 4) = Range("C" & (R + 5)) And Range("C" & R + 5) <> Range("C" & (R + 6)) Then
Range("C" & R).Select
ActiveCell.Offset(5, 2) = Application.Sum(Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(5, 1)))
End If
If Range("C" & R) = Range("C" & (R + 1)) And Range("C" & R + 1) = Range("C" & (R + 2)) And Range("C" & R + 2) = Range("C" & (R + 3)) And Range("C" & R + 3) = Range("C" & (R + 4)) And Range("C" & R + 4) <> Range("C" & (R + 5)) Then
Range("C" & R).Select
ActiveCell.Offset(4, 2) = Application.Sum(Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(4, 1)))
End If
If Range("C" & R) = Range("C" & (R + 1)) And Range("C" & R + 1) = Range("C" & (R + 2)) And Range("C" & R + 2) = Range("C" & (R + 3)) And Range("C" & R + 3) <> Range("C" & (R + 4)) Then
Range("C" & R).Select
ActiveCell.Offset(3, 2) = Application.Sum(Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(3, 1)))
End If
If Range("C" & R) = Range("C" & (R + 1)) And Range("C" & R + 1) = Range("C" & (R + 2)) And Range("C" & R + 2) <> Range("C" & (R + 3)) Then
Range("C" & R).Select
ActiveCell.Offset(2, 2) = Application.Sum(Range(ActiveCell.Offset(0, 1), ActiveCell.Offset(2, 1)))
End If
If Range("C" & R) = Range("C" & (R + 1)) And Range("C" & R + 1) <> Range("C" & (R + 2)) Then
Range("C" & R).Select
ActiveCell.Offset(1, 2) = Application.Sum(ActiveCell.Offset(0, 1), ActiveCell.Offset(1, 1))
End If
If Range("C" & R) <> Range("C" & (R + 1)) Then
Range("C" & R).Select
ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 1)
End If
Next R

'Copy Sheet
Sheets("Sheet1").Columns(1).Copy Destination:=Sheets("Sheet2").Columns(1)
Sheets("Sheet1").Columns(2).Copy Destination:=Sheets("Sheet2").Columns(2)
Sheets("Sheet1").Columns(3).Copy Destination:=Sheets("Sheet2").Columns(3)
Sheets("Sheet1").Columns(5).Copy Destination:=Sheets("Sheet2").Columns(4)

'Delete Empty Hours Columns
Sheets("Sheet2").Select`

On Error Resume Next
Columns("D").SpecialCells(xlCellTypeBlanks).EntireRow.Delete`

'AutoFit Columns
Cells.Select
Cells.EntireColumn.AutoFit

Application.ScreenUpdating = True

End Sub

【问题讨论】:

    标签: vba loops sum


    【解决方案1】:

    您应该命名您的单元格范围。然后你应该保存你的工作簿,然后点击

    数据>来自其他来源>来自 Microsoft Query

    然后您应该选择 Excel 文件,好的,然后导航到您的 Excel 文件。您应该选择您的范围,然后单击确定。然后,放入以下 ​​SQL 语句,针对您的范围进行更新

    SELECT Values.Surname, Values.[First Name], Values.Date, SUM(Values.Hours) _
     FROM Values Value GROUP BY Values.Surname, Values.[First Name], Values.Date
    

    【讨论】:

    • 谢谢,注意!但是,我对更好的编码方式更感兴趣。而不是使用多个 IF 语句,而是使用 SUMIF 类型的循环来检查日期和姓氏,然后相应地求和..
    • 我不确定我是否理解您检查日期和姓氏的意思。您能否澄清日期或姓氏的排序或分组?这些可以通过 SQL 比 VBA 代码更容易完成,至少在这个例子中是这样。
    • 姓 名 日期 小时 COX D 03/03/15 6 COX D 03/03/15 4 COX D 04/03/15 3.5 COX D 04/03/15 4 COX D 04/03 /15 2.5 COX D 04/03/15 0 DALLY E 02/03/15 3.5 DALLY E 02/03/15 3 DALLY E 02/03/15 3.5 DALLY E 03/03/15 6 DALLY E 03/03/15 4 DALLY E 04/03/15 3.5 DALLY E 04/03/15 4 DALLY E 04/03/15 2.5 DALLY E 04/03/15 0 DALLY E 05/03/15 5 DALLY E 05/03/15 5 DALLY E 06/03/15 3.5 DOBBIE J 02/03/15 3.5 DOBBIE J 02/03/15 3 DOBBIE J 02/03/15 3.5 DOBBIE J 03/03/15 6 DOBBIE J 03/03/15 4 DOBBIE J 04 /03/15 3.5 DOBBIE J 04/03/15 4 DOBBIE J 04/03/15 2.5 DOBBIE J 04/03/15 0 DOBBIE J 05/03/15 5
    • 基本上有一些员工需要我计算特定日期的小时数。它只是按日期排序,然后按名称排序。对 SQL 不熟悉,但谢谢老兄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2023-04-04
    • 2011-08-19
    相关资源
    最近更新 更多