首页 > 解决方案 > 如何使用 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

到目前为止它做了什么

  1. 读取 InputSheet Workbook 的“Base”工作表,复制 A 和 B 列,将其粘贴到 AttendanceDiscrepencyReporter 工作簿的 Dashboard 工作表中。

我希望它接下来做什么

  1. 阅读 InputSheet 工作簿的“离开”工作表
  2. 我有一个 xlsm 来触发这个宏。该 xlsm 具有开始和结束日期字段。我将它们存储在 Start 和 Last 变量中作为日期。

我的逻辑是

  1. 将 TLeaves 变量声明为整数并初始化为零
  2. 如果“离开”工作表中的开始日期 >= 开始变量 &&
  3. 如果“离开”工作表中的结束日期 <= 最后一个变量 THEN
  4. 循环通过 AttendanceDiscrepencyReporter 的“仪表板”工作表的 A 列(它具有所有电子邮件 ID 的唯一出现)并将其与“离开”工作表的 G 列(也具有电子邮件 ID 但不是唯一的)进行比较。对于员工的每一次休假,它会有一行)。如果找到匹配项,则将 TLeaves 增加 1。
  5. 它还需要对休假类型(F 列)进行分类——这是我的大脑停止理解的地方。我很容易通过员工电子邮件 ID 和休假类型手动进行数据透视。我在 VBA 中将其可视化。
  6. 在第一个电子邮件 ID 的循环结束时,最后在“仪表板”表的 C 列中写入 TLeave 值。我很难在循环中识别该值将转到哪一行。

我正在尝试用谷歌搜索 vba 循环语法并学习,但如果有人可以让我先了解如何执行这 5 个步骤,那么它将很有帮助。

这是我的离开工作表的屏幕截图 - https://pasteboard.co/HOTYAXE.png 我正在从这里触发我的报告 - https://pasteboard.co/HOTZepE.png

我还考虑为所有休假类型分别设置整数变量,然后仅使用一个 TLeaves(总休假)。通过这种方式,我可以在目标工作表中将单独的总计写为 c、d、e 列等。

标签: excelvba

解决方案


推荐阅读