Как использовать VBA для реализации сводных таблиц и сопоставить его со значением столбца из другого листа - PullRequest
0 голосов
/ 26 ноября 2018

То, что я пытаюсь сделать, глупо просто, когда я делаю это вручную, но я пытаюсь автоматизировать это.Я не эксперт, поэтому я сначала пытаюсь понять свою логику, а затем могу написать строительные блоки кода для достижения этого.

Что у меня есть

ниже то, что я имею до сих пор.

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, копирует столбцы A и B, вставляет его в книгу AttendanceDiscrepencyReporterРабочий лист Dashboard.

Что я хочу, чтобы он сделал дальше

  1. Прочитайте рабочий лист InputSheet "Покинуть"
  2. У меня естьxlsm, откуда я запускаю этот макрос.У этого xlsm есть поля даты начала и окончания.Я храню их в переменных Start и Last как дату.

Моя логика:

  1. Объявить переменную TLeaves как целое число и инициализировать в ноль
  2. ЕслиДата начала в листе «Выход»:> = Начальная переменная &&
  3. Если дата окончания в листе «Выход» равна <= Последняя переменная THEN </li>
  4. Цикл по листу «Панель инструментов» AttendanceDiscrepencyReporterСтолбец A (он имеет уникальное вхождение всех идентификаторов электронной почты) и сравните его со столбцом G рабочей таблицы «Покинуть» (который также содержит идентификаторы электронной почты, но не уникальные. Для каждого отпуска сотрудника у него будет строка).Если совпадение найдено, увеличьте TLeaves на 1.
  5. Также необходимо классифицировать тип выхода (столбец F) - это то, где мой мозг перестает понимать.Мне было бы легко сделать Pivot вручную по идентификатору электронной почты сотрудника и типу отпуска.Я визуализирую это в VBA.
  6. К концу цикла для первого идентификатора электронной почты, наконец, напишите значение TLeave в столбце C. листа "Dahboard". У меня возникают трудности с определением в цикле, какой строки это значениеперейдем к.

Я пытаюсь использовать синтаксис цикла vba Google и узнать, но если кто-то может дать мне преимущество в том, как сделать эти 5 шагов, то это будет полезно.

Вот снимок экрана с моим рабочим листом Leave - https://pasteboard.co/HOTYAXE.png Отсюда я запускаю свой отчет - https://pasteboard.co/HOTZepE.png

Я также думаю о том, чтобы иметь целочисленные переменные для всех типов отпуска отдельно, а затем использовать простоодин TLeaves (всего листьев).Таким образом, я могу записать отдельные итоги на листе назначения в виде столбцов c, d, e и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...