Dymamiczna zmienna

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.