excel - 如何使用 VBA 实现数据透视表并将其与另一个工作表中的列值匹配
问题描述
当我手动执行它时,我想要做的事情非常简单,但我正在尝试自动化它。我不是专家,所以我试图首先让我的逻辑正确,然后我可以编写代码构建块来实现这一点。
我有的
以下是我到目前为止所拥有的。
Option Explicit
Sub ReportGeneration()
'Declarations
Dim InputSheet As Workbook, AttendanceDiscrepencyReporter As Workbook
Dim Start As Date
Dim Last As Date
Dim StartFormated As String
Dim LastFormated As String
Dim InputFileName As String
Dim ADRFileName As String
Dim TWorkingDays As Integer
Dim EmpEmail As Range
Dim EmpID As Range
Dim TLeave As Range
Dim TFlexi As Range
Dim TAttendance As Range
Dim IsAtOnsite As Range
Dim CMEmail As Range
'Create the Report Workbook
Start = Range("F7").Value
Last = Range("F8").Value
StartFormated = Replace((Range("F7").Value), "/", "_")
LastFormated = Replace((Range("F8").Value), "/", "_")
TWorkingDays = Int(Range("F10").Value)
Set AttendanceDiscrepencyReporter = Workbooks.Add
ADRFileName = ThisWorkbook.Path & "\" & "DiscrepencyReport_from_" & StartFormated & "_to_" & LastFormated & ".xlsx"
With AttendanceDiscrepencyReporter
.Title = "Discrepency Report"
.Subject = "Discrepency Report"
.Sheets("Sheet1").Name = "Dashboard"
.SaveAs Filename:=ADRFileName
.Close
End With
'Open Input Workbook
InputFileName = ThisWorkbook.Path & "\" & "Master.xlsx"
Set InputSheet = Workbooks.Open(InputFileName, True, True)
Set AttendanceDiscrepencyReporter = Workbooks.Open(ADRFileName, True, False)
' Construct the Report Worksheet
'Email ID copying
InputSheet.Sheets("Base").Range("A1:A1000").Copy Destination:=AttendanceDiscrepencyReporter.Sheets("Dashboard").Range("A1")
'Employee ID copying
InputSheet.Sheets("Base").Range("B1:B1000").Copy Destination:=AttendanceDiscrepencyReporter.Sheets("Dashboard").Range("B1")
'Calculating Leaves and writing it into Report
Dim LastRow As Long
Dim LastCol As Long
LastRow = DSheet.Cells(Rows.Count, 1).End(xlUp).Row
LastCol = DSheet.Cells(1, Columns.Count).End(xlToLeft).Column
' Close Workbooks
InputSheet.Close
AttendanceDiscrepencyReporter.Save
AttendanceDiscrepencyReporter.Close
End Sub
到目前为止它做了什么
- 读取 InputSheet Workbook 的“Base”工作表,复制 A 和 B 列,将其粘贴到 AttendanceDiscrepencyReporter 工作簿的 Dashboard 工作表中。
我希望它接下来做什么
- 阅读 InputSheet 工作簿的“离开”工作表
- 我有一个 xlsm 来触发这个宏。该 xlsm 具有开始和结束日期字段。我将它们存储在 Start 和 Last 变量中作为日期。
我的逻辑是
- 将 TLeaves 变量声明为整数并初始化为零
- 如果“离开”工作表中的开始日期 >= 开始变量 &&
- 如果“离开”工作表中的结束日期 <= 最后一个变量 THEN
- 循环通过 AttendanceDiscrepencyReporter 的“仪表板”工作表的 A 列(它具有所有电子邮件 ID 的唯一出现)并将其与“离开”工作表的 G 列(也具有电子邮件 ID 但不是唯一的)进行比较。对于员工的每一次休假,它会有一行)。如果找到匹配项,则将 TLeaves 增加 1。
- 它还需要对休假类型(F 列)进行分类——这是我的大脑停止理解的地方。我很容易通过员工电子邮件 ID 和休假类型手动进行数据透视。我在 VBA 中将其可视化。
- 在第一个电子邮件 ID 的循环结束时,最后在“仪表板”表的 C 列中写入 TLeave 值。我很难在循环中识别该值将转到哪一行。
我正在尝试用谷歌搜索 vba 循环语法并学习,但如果有人可以让我先了解如何执行这 5 个步骤,那么它将很有帮助。
这是我的离开工作表的屏幕截图 - https://pasteboard.co/HOTYAXE.png 我正在从这里触发我的报告 - https://pasteboard.co/HOTZepE.png
我还考虑为所有休假类型分别设置整数变量,然后仅使用一个 TLeaves(总休假)。通过这种方式,我可以在目标工作表中将单独的总计写为 c、d、e 列等。
解决方案
推荐阅读
- php - 如何在php中选择sql查询的第n行
- javascript - 如何使用 ReactDOM.render 改变 DOM 元素?
- javascript - 单击一次后,我想禁用单击属性
- arrays - 实时视频到阵列
- asp.net-core - 如何在.net Core后面的代码中更改元素的样式
- flutter - 如何在颤动的数据表中执行搜索功能?
- python - 可重用的 SQL 示例连接字符串
- sql - 按列 ID SQL 制作重复的行号
- javascript - H.geo.LineString 的行为不像 h.geo.strip
- react-native - 如何从反应本机表单中输入字段旁边的按钮选择文件。(请参阅图片以更好地理解)