Aby stworzyć dynamiczną zmienną trzeba wykorzystać tablicę. Przez dynamiczną zmienną rozumiem zmienną, która przyjmuje jakąś wartość numeryczną do określenia np. numeru wiersza.
Aby wykorzystać dynamiczną zmienną bardzo pomogła mi strona www.mrexcel.com.
Oryginalny kod z www.mrexcel.com:
' Source: https://www.mrexcel.com/forum/excel-questions/524440-dynamic-variable-name-vba.html Dim i, x Dim Pos(1 To 5) As Integer Pos(1) = 10 Pos(2) = 19 Pos(3) = 25 Pos(4) = 36 Pos(5) = 42 For i = 1 To 5 x = Cells(Pos(i), 1).value Next i
Niestety pisząc jakiś czas temu makro nie za dobrze opisałem kod. To właśnie jest przykład kiedy po jakimś czasie siadasz do napisanego już makra i siedzisz godzinami, aby zrozumieć kod – który kiedyś przecież sam napisałeś. Dlatego poniżej pokaże uproszczony kod z dwóch powodów:
– nie zrozumiałem do końca kodu, który wcześniej sam napisałem z powodu złego opisu i zaawansowania kodu 🙁
– obowiązuje mnie klauzula poufności – więc nie przedstawię oryginalnych danych oraz kodu który miał wykonać określoną pracę.
Dane z arkusza do testów dynamicznej zmiennej (wklej do komórki A1):
ID | Item | Cash [$] |
---|---|---|
A. | Poznań | 1000 |
2 | Profit | 80 |
1 | Cost Saving | 120 |
3 | Expenses | 800 |
B. | Wrocław | 900 |
2 | Profit | 60 |
3 | Expenses | 720 |
1 | Cost Saving | 120 |
Założenia testu wykorzystania dynamicznej zmiennej (spokojnie można to zrobić w Pivocie? – ale ja akurat nie mogłem):
– musimy przeszukać całą listę źródłowa
– musimy wyciągnąć nazwę miasta, budżet i oszczędności
– Raport powinien wyglądać następująco:
* kolumna 1 = miasto (nazwa)
* kolumna 2 = budżet (wartość)
* kolumna 3 = oszczędności (wartość)
Kod budujący raport z dynamiczną zmienną ukrytą w tablicy:
Sub ChangingVariable() ' Musimy zbudować raport gdzie pokazemy tylko i wyłącznie miasto i Cost Saving oraz budżet miasta Dim RowP(1 To 2, 1) As Variant Dim i, k, ArrayCounter As Long i = 2 ArrayCounter = 1 With ThisWorkbook.ActiveSheet Erase RowP ' czyszczenie tablicy ' Główna pętla szukająca miast Do Until .Cells(i, 1) = "" If .Cells(i, 1) = "A." Or _ .Cells(i, 1) = "B." Then ' Miasta są oznaczone dużymi literami RowP(ArrayCounter, 0) = .Cells(i, 1).Row ' zapisanie numeru wiersza miasta w tablicy ' Druga piętla szukjąca Cost Saving w mieście k = i Do Until .Cells(k, 1) = "" If .Cells(k, 2) = "Cost Saving" Then ' Znaleziono Cost Savings - dodanie wartości wiersza do 2 poziomu tablicy RowP(ArrayCounter, 1) = .Cells(k, 2).Row i = k ArrayCounter = ArrayCounter + 1 Exit Do Else ' Nic sie nie dzieje End If k = k + 1 Loop Else ' nic sie nie dzieje End If i = i + 1 Loop ' Budowanie raportu - dodawanie nagłówków .Cells(1, 5) = "City" .Cells(1, 6) = "Budget" .Cells(1, 7) = "Cost Saving" ' Przykłd użycia zmieniajacej się zmiennej do określenia numeru wiersza k = 2 For i = 1 To UBound(RowP) .Cells(k, 5) = .Cells(RowP(i, 0), 2) 'dodawanie miasta .Cells(k, 6) = .Cells(RowP(i, 0), 3) 'dodawanie budżetu .Cells(k, 7) = .Cells(RowP(i, 1), 3) 'dodawanie cost saving k = k + 1 Next i End With End Sub
Interesujący nas fragment używania dynamicznej zmiennej do określenia numeru wiersza jest tutaj:
' Przykład użycia zmieniającej się zmiennej do określenia numeru wiersza k = 2 For i = 1 To UBound(RowP) .Cells(k, 5) = .Cells(RowP(i, 0), 2) 'dodawanie miasta .Cells(k, 6) = .Cells(RowP(i, 0), 3) 'dodawanie budżetu .Cells(k, 7) = .Cells(RowP(i, 1), 3) 'dodawanie cost saving k = k + 1 Next i