Я пытаюсь создать информационную панель для кого-то, чтобы они могли сравнивать данные за предыдущие годы. Для начала я добавил макрос, который позволяет им искать как новые, так и старые данные. Затем макрос открывает эти файлы. примерная фотография с данными представлена на рисунке 1.
Данные - это число посещений каждого объекта каждый месяц, сравнивая текущий год с предыдущим годом.
Теперь я хочу изменить порядок данных, чтобы эффективно использовать сводные таблицы для отображения того, что мне нужно. Однако я не уверен, как лучше это сделать. У меня есть некоторый опыт VBA, но не со словарями и коллекциями / классами.
Моя идея состояла в том, чтобы использовать класс для каждого места и затем иметь переменную в этом классе для каждого месяца. Затем сохраните данные каждого месяца в переменную. Например, Venue1.Jun = 700. Однако мне нужно было бы сделать это дважды для старых и новых данных.
Я также хотел бы перенести строку вертикально, чтобы все посещения были в правильные месяцы. Но я бы хотел, чтобы он был немного более надежным, поэтому используйте место в качестве ключа, чтобы он знал, какой из них ввести.
Снова я попытался транспонировать и получил на полпути, но код очень неэффективен с большим количеством объявленных переменных и т. Д. c.
Как лучше всего go продолжить это? Ниже я ввел свой код, который предназначен для транспонирования данных, о которых говорилось до
Исходные данные
Требуемый вывод
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