TOP

VBA-Ders 13.3. Dizileri kullanma (Arrays) (Alıştırmalar)

Dizileri kullanma alıştırması yapmak için, dizilerin hız avantajını adım adım göstermek amacıyla kullandığımız makronun kendi versiyonunu oluşturacağız...


Bu alıştırmanın başlangıç noktası şu şekildedir (veri kümesinin 1000 satıra düşürüldüğünü göreceksiniz):

Buradan Excel örnek dosyasını indirebilirsiniz: arrays_exercise.xls

Alıştırma Amacı: Prosedür, veri kümesindeki veriler arasında döngü yapmalı ve her yıl ve her müşteri numarası için EVET veya HAYIR yanıtlarının sayısını saymalı (kullanıcının seçimine bağlı olarak EVET veya HAYIR) ve bu miktarı belirtilen hücreye girmelidir. çalışma sayfası.

"DS" çalışma sayfasındaki verileri bir diziye kaydetmek için aşağıdaki makroyu tamamlayın:

  1. Sub actualize()  
  2.      Dim last_row As Integer  
  3.        
  4.      'Veri kümesinin son satırı  
  5.      '...  
  6.           
  7.      'Bir veri kümesini dinamik bir diziye kaydetme  
  8.      Dim array_db()  
  9.      '...  
  10.           
  11. End Sub  

İşte bir örnek çözüm:

  1. Sub actualize()  
  2.      Dim last_row As Integer  
  3.        
  4.      'Veritabanının son satırı  
  5.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
  6.   
  7.      'Bir veri kümesini dinamik bir diziye kaydetme  
  8.      Dim array_db()  
  9.      ReDim array_db(last_row - 2, 2)  
  10.        
  11.      For row_number = 2 To last_row  
  12.          array_db(row_number - 2, 0) = Sheets("DS").Range("A" & row_number)  
  13.          array_db(row_number - 2, 1) = Sheets("DS").Range("B" & row_number)  
  14.          array_db(row_number - 2, 2) = Sheets("DS").Range("C" & row_number)  
  15.      Next  
  16. End Sub  

Bu aslında önceki derste yaptıklarımızı tekrarlıyor…

Ancak şimdi aşağıdaki eylemleri ekleyerek makromuzu değiştirmemiz gerekiyor:

  • Kullanıcının seçimini belirleyin ("EVET" veya "HAYIR");
  • Dizinin boyutunu belirlemek için veri setindeki "EVET" veya "HAYIR" yanıtlarının sayısını sayın (Redim);
  • Veri kümesinden yalnızca dizide "EVET" veya "HAYIR" yanıtlarını içeren satırları kaydederiz (bu, üçüncü sütundaki verileri kaydetmeye gerek olmadığı anlamına gelir).
  • İşte bir örnek çözüm:

    1. Sub actualize()  
    2.      Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer  
    3.        
    4.      'Veritabanının son satırı  
    5.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
    6.   
    7.      'Arama değeri (YES veya NO)  
    8.      If Sheets("RES").OptionButton_yes.Value = True Then  
    9.          search_value = "YES"  
    10.      Else  
    11.          search_value = "NO"  
    12.      End If  
    13.        
    14.      'Yanıt sayısı YES veya NO  
    15.      rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)  
    16.        
    17.      'Veri kümesini diziye kaydetme  
    18.      Dim array_db()  
    19.      ReDim array_db(rows_number - 1, 1)  
    20.   
    21.      insert_row = 0  
    22.        
    23.      For row_number = 2 To last_row  
    24.          value_yes_no = Sheets("DS").Range("C" & row_number)  
    25.            
    26.          If value_yes_no = search_value Then  
    27.              array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)  
    28.              array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)  
    29.              insert_row = insert_row + 1  
    30.          End If  
    31.      Next  
    32. End Sub  

    Kullanıcının seçimine göre arama, prosedürün başında aşağıdaki kodla belirlenir:

    1. 'Arama değeri (YES veya NO)  
    2. If Sheets("RES").OptionButton_yes.Value = True Then  
    3.     search_value = "YES"  
    4. Else  
    5.     search_value = "NO"  
    6. End If  

    "EVET" veya "HAYIR" yanıtlarının sayısını belirlemek için CountIF işlevini kullanacağız:

    1. 'Yanıt sayısı YES veya NO  
    2. rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)  

    Dizi, EVET veya HAYIR yanıtlarının sayısına uyacak şekilde yeniden boyutlandırıldı ve iki sütuna indirildi:

    1. ReDim array_db(rows_number - 1, 1)  

    Bu veriler artık üçüncü sütunu kullanıcının seçimiyle eşleştiğinde dizide saklanacaktır:

    1. 'Bir diziye sayı ekleme  
    2. insert_row = 0  
    3.   
    4. 'Veri seti işleme  
    5. For row_number = 2 To last_row  
    6.     'C sütunu değeri (YES veya NO)  
    7.     value_yes_no = Sheets("DS").Range("C" & row_number)  
    8.       
    9.     'Değer kullanıcının seçimiyle eşleşiyorsa dize dizide saklanır  
    10.     If value_yes_no = search_value Then  
    11.         'Değeri A sütununa kaydetme  
    12.         array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)  
    13.         'Değerin B sütununa kaydedilmesi  
    14.         array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)  
    15.         'Bir satır kaydedildi => dizideki ekleme numarası 1 artırıldı  
    16.         insert_row = insert_row + 1  
    17.     End If  
    18. Next  

    Dizimiz yalnızca ilgilendiğimiz verileri içerir.

    Geriye kalan tek şey:

  • "RES" çalışma sayfasındaki tablonun her bir öğesini 2 döngü kullanarak işleyin (dama tahtası alıştırmasıyla aynı fikir);
  • Her hücre için her müşteri numarasına göre bu sayfaya her yıl için toplam olay sayısını ekleyin.
  • İşte bir örnek çözüm:

    1. 'Yanıtların sayısı "YES"/"NO"  
    2. For no_years = 2011 To 2026  
    3.     For no_client = 1 To 30  
    4.         counter = 0  
    5.           
    6.         For i = 0 To UBound(array_db)  
    7.             If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    8.                 counter = counter + 1  
    9.             End If  
    10.         Next  
    11.           
    12.         Cells(no_years - 2009, no_client + 1) = counter  
    13.     Next  
    14. Next  

    Sorunu ayrıntılı olarak açıklayan yorumlarla çözüldü:

    1. 'Her satır için döngü  
    2. For no_years = 2011 To 2026  
    3.   
    4.     'Her sütun için döngü  
    5.     For no_client = 1 To 30  
    6.         'Sayaç sıfırlama  
    7.         counter = 0  
    8.           
    9.         'Dizi işleme  
    10.         For i = 0 To UBound(array_db)  
    11.             'Tablodaki satırın yıl ve müşteri numarasına uygun olup olmadığının kontrol edilmesi  
    12.             If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    13.                 'Yıl ve müşteri numarası eşleşirse sayaç 1 artar  
    14.                 counter = counter + 1  
    15.             End If  
    16.         Next  
    17.           
    18.         'Dizi işlendikten sonra sonuç ilgili hücreye girilir.  
    19.         Cells(no_years - 2009, no_client + 1) = counter  
    20.     Next  
    21. Next  

    Ve son olarak makromuzun tamamının kodu:

    1. Sub actualize()  
    2.      Dim last_row As Integer, search_value As String, insert_row As Integer, value_yes_no As String, rows_number As Integer, counter As Integer  
    3.        
    4.      'İçeriği silme  
    5.      Range("B2:AE17").ClearContents  
    6.        
    7.      'Veri setindeki son satır  
    8.      last_row = Sheets("DS").Range("A1").End(xlDown).Row  
    9.   
    10.      'Arama değeri (YES veya NO)  
    11.      If Sheets("RES").OptionButton_yes.Value = True Then  
    12.          search_value = "YES"  
    13.      Else  
    14.          search_value = "NO"  
    15.      End If  
    16.        
    17.      'Yanıt sayısı YES veya NO  
    18.      rows_number = WorksheetFunction.CountIf(Sheets("DS").Range("C2:C" & last_row), search_value)  
    19.        
    20.      'Değerleri bir diziye kaydetme  
    21.      Dim array_db()  
    22.      ReDim array_db(rows_number - 1, 1)  
    23.   
    24.      insert_row = 0  
    25.        
    26.      For row_number = 2 To last_row  
    27.          value_yes_no = Sheets("DS").Range("C" & row_number)  
    28.            
    29.          If value_yes_no = search_value Then  
    30.              array_db(insert_row, 0) = Sheets("DS").Range("A" & row_number)  
    31.              array_db(insert_row, 1) = Sheets("DS").Range("B" & row_number)  
    32.              insert_row = insert_row + 1  
    33.          End If  
    34.      Next  
    35.        
    36.      'Cevapları sayma YES veya NO  
    37.      For no_years = 2011 To 2026  
    38.          For no_client = 1 To 30  
    39.              counter = 0  
    40.                
    41.              For i = 0 To UBound(array_db)  
    42.                  If Year(array_db(i, 0)) = no_years And array_db(i, 1) = no_client Then  
    43.                      counter = counter + 1  
    44.                  End If  
    45.              Next  
    46.              Cells(no_years - 2009, no_client + 1) = counter  
    47.          Next  
    48.      Next  
    49. End Sub  

    Buradan Excel örnek dosyasını indirebilirsiniz: arrays_exercise_completed.xls