Использование сборника и словаря класса V в VBA - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать информационную панель для кого-то, чтобы они могли сравнивать данные за предыдущие годы. Для начала я добавил макрос, который позволяет им искать как новые, так и старые данные. Затем макрос открывает эти файлы. примерная фотография с данными представлена ​​на рисунке 1.

Данные - это число посещений каждого объекта каждый месяц, сравнивая текущий год с предыдущим годом.

Теперь я хочу изменить порядок данных, чтобы эффективно использовать сводные таблицы для отображения того, что мне нужно. Однако я не уверен, как лучше это сделать. У меня есть некоторый опыт VBA, но не со словарями и коллекциями / классами.

Моя идея состояла в том, чтобы использовать класс для каждого места и затем иметь переменную в этом классе для каждого месяца. Затем сохраните данные каждого месяца в переменную. Например, Venue1.Jun = 700. Однако мне нужно было бы сделать это дважды для старых и новых данных.

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

Снова я попытался транспонировать и получил на полпути, но код очень неэффективен с большим количеством объявленных переменных и т. Д. c.

Как лучше всего go продолжить это? Ниже я ввел свой код, который предназначен для транспонирования данных, о которых говорилось до

Исходные данные

Image1  OriginalData

Требуемый вывод

Image2, RequiredOutput

Sub OldDataBrowser()
Dim OldDataDocPath As String
OldDataDocPath = Application.GetOpenFilename(, , "File Document Path Browser")

If OldDataDocPath = "False" Then
    OldDataDocPath = ""
End If

ThisWorkbook.Sheets("FileImport").range("B3").Value = OldDataDocPath

End Sub
Sub NewDataBrowser()
Dim DocPath As String
NewDataDocPath = Application.GetOpenFilename(, , "File Document Path Browser")

If NewDataDocPath = "False" Then
    NewDataDocPath = ""
End If

ThisWorkbook.Sheets("FileImport").range("B6").Value = NewDataDocPath

End Sub

Sub ExtractData()

Dim NewDataLocation As String: NewDataLocation = ThisWorkbook.Sheets("FileImport").range("B6").Value
Dim OldDataLocation As String: OldDataLocation = ThisWorkbook.Sheets("FileImport").range("B3").Value

Dim OldDataWb As Workbook: Set OldDataWb = Workbooks.Open(OldDataLocation)
Dim OldDataWs As Worksheet: Set OldDataWs = OldDataWb.Sheets("T1+T2")

Dim NewDataWb As Workbook: Set NewDataWb = Workbooks.Open(NewDataLocation)
Dim NewDataWs As Worksheet: Set NewDataWs = NewDataWb.Sheets("T1+T2")

Dim OutputtedWs As Worksheet: Set OutputtedWs = ThisWorkbook.Sheets("Raw Data")

Dim OldDataYear As String: OldDataYear = OutputtedWs.Cells(3, "C").Value
Dim NewDataYear As String: NewDataYear = OutputtedWs.Cells(6, "C").Value

Dim OldDataLastColNum As Long: OldDataLastColNum = NewDataWs.Cells(3, NewDataWs.Columns.Count).End(xlToLeft).Column
Dim OldDataLastColLet As String: OldDataLastColLet = Split(Cells(1, OldDataLastColNum).Address, "$")(1)

Dim OutputtedWsHeader As Variant: OutputtedWsHeader = Array("Venue", "Month", "Activity for " & OldDataYear & "", "Activity for " & NewDataYear & "", "Monthly % Change")
Dim Months As Variant: Months = Array("January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

Dim StartofData As String: StartofData = "Total visits by children and young people from UK"
Dim EndofData As String: EndofData = "Total UK visits"

Dim OldDataRangeStart As Variant: Set OldDataRangeStart = OldDataWs.range("A:A").Find(what:=StartofData, Lookat:=xlWhole)
Dim OldDataRangeEnd As Variant: Set OldDataRangeEnd = OldDataWs.range("A:A").Find(what:=EndofData, Lookat:=xlWhole)

Dim OldDatarange As range: Set OldDatarange = OldDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)
Dim newdatarange As range: Set newdatarange = NewDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)

Dim VenueArray As Variant
VenueArray = OldDataWs.range("A" & OldDataRangeStart.Row & ":A" & OldDataRangeEnd.Row)

OutputtedWs.range("A1").Resize(1, 5).Value = OutputtedWsHeader


Dim NumberofVenues, Numberofmonths As Long
NumberofVenues = UBound(VenueArray) - LBound(VenueArray)
Debug.Print (NumberofVenues)
Numberofmonths = UBound(Months) - LBound(Months)
Debug.Print (Numberofmonths)
'Debug.Print VenueArray(4)

OldDataWb.Close
NewDataWb.Close


'Loop through venues in array
For j = 1 To NumberofVenues
    Dim MonthLrow As Long: MonthLrow = OutputtedWs.range("B" & Rows.Count).End(xlUp).Row + 1
        'Loop through rows to add the venue in column A and the month in column B
        For i = MonthLrow To (NumberofVenues + MonthLrow)
            OutputtedWs.Cells(i, 1).Value = VenueArray(j, 1).Value
            OutputtedWs.Cells(i, 2).Value = Months(i, 1).Value
            i = i + 1
        Next i

    j = j + 1
Next j

'Loop throughh and add each row to array, than transpose the data.


End Sub

ОБНОВЛЕННЫЙ КОД

Sub OldDataBrowser()
Dim OldDataDocPath As String
OldDataDocPath = Application.GetOpenFilename(, , "File Document Path Browser")

If OldDataDocPath = "False" Then
    OldDataDocPath = ""
End If

ThisWorkbook.Sheets("FileImport").range("B3").Value = OldDataDocPath

End Sub
Sub NewDataBrowser()
Dim DocPath As String
NewDataDocPath = Application.GetOpenFilename(, , "File Document Path Browser")

If NewDataDocPath = "False" Then
    NewDataDocPath = ""
End If

ThisWorkbook.Sheets("FileImport").range("B6").Value = NewDataDocPath

End Sub

Sub ExtractData()

Dim NewDataLocation As String: NewDataLocation = ThisWorkbook.Sheets("FileImport").range("B6").Value
Dim OldDataLocation As String: OldDataLocation = ThisWorkbook.Sheets("FileImport").range("B3").Value

Dim OldDataWb As Workbook: Set OldDataWb = Workbooks.Open(OldDataLocation)
Dim OldDataWs As Worksheet: Set OldDataWs = OldDataWb.Sheets("T1+T2")

Dim NewDataWb As Workbook: Set NewDataWb = Workbooks.Open(NewDataLocation)
Dim NewDataWs As Worksheet: Set NewDataWs = NewDataWb.Sheets("T1+T2")

Dim OutputtedWs As Worksheet: Set OutputtedWs = ThisWorkbook.Sheets("Raw Data")

Dim OldDataYear As String: OldDataYear = OutputtedWs.Cells(3, "C").Value
Dim NewDataYear As String: NewDataYear = OutputtedWs.Cells(6, "C").Value

Dim OldDataLastColNum As Long: OldDataLastColNum = NewDataWs.Cells(3, NewDataWs.Columns.Count).End(xlToLeft).Column
Dim OldDataLastColLet As String: OldDataLastColLet = Split(Cells(1, OldDataLastColNum).Address, "$")(1)

Dim OutputtedWsHeader As Variant: OutputtedWsHeader = Array("Venue", "Month", "Activity for " & OldDataYear & "", "Activity for " & NewDataYear & "", "Monthly % Change")
Dim Months As Variant: Months = NewDataWs.range("B3:" & OldDataLastColLet & "3")

Dim StartofData As String: StartofData = "Total visits by children and young people from UK"
Dim EndofData As String: EndofData = "Total UK visits"

Dim OldDataRangeStart As Variant: Set OldDataRangeStart = OldDataWs.range("A:A").Find(what:=StartofData, Lookat:=xlWhole)
Dim OldDataRangeEnd As Variant: Set OldDataRangeEnd = OldDataWs.range("A:A").Find(what:=EndofData, Lookat:=xlWhole)

Dim OldDatarange As range: Set OldDatarange = OldDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)
Dim newdatarange As range: Set newdatarange = NewDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)

Dim NewDataVenueArray As Variant
NewDataVenueArray = NewDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)


Dim OldDataVenueArray As Variant
OldDataVenueArray = OldDataWs.range("A" & OldDataRangeStart.Row & ":" & OldDataLastColLet & OldDataRangeEnd.Row)

OutputtedWs.range("A1").Resize(1, 5).Value = OutputtedWsHeader


Dim NumberofVenues As Long
Dim Numberofmonths As Long
NumberofVenues = UBound(NewDataVenueArray) - LBound(NewDataVenueArray)
Numberofmonths = UBound(Months) - LBound(Months)

OldDataWb.Close
NewDataWb.Close

'Loop through venues in array
For j = 1 To NumberofVenues
    Dim MonthLrow As Long: MonthLrow = OutputtedWs.range("B" & Rows.Count).End(xlUp).Row + 1
        'Loop through rows to add the venue in column A and the month in column B
        a = 1
        'Loop through and add each row to array, than transpose the data.
        For i = MonthLrow To (NumberofVenues + MonthLrow)
            OutputtedWs.Cells(i, 1).Value = NewDataVenueArray(j, 1).Value
            OutputtedWs.Cells(i, 2).Value = Months(1, a).Value
            OutputtedWs.Cells(i, 3).Value = OldDataVenueArray(j, a).Value
            OutputtedWs.Cells(i, 4).Value = NewDataVenueArray(j, a).Value
            a = a + 1
            i = i + 1
        Next i

    j = j + 1
Next j

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