Kategorie szkoleń | Egzaminy | Kontakt
  • 0
  • 5
  • 173

W ramach nauki chciałem stworzyć makro, które kolekcjonuje zaznaczone zakresy do kolekcji, a następnie pozwala wykonać na nich operacje.
Niestety podczas kursu EX04 (nie krytykuję, był bardzo dla mnie cenny) nie uczyliśmy się użycia klas ani enkapsulacji. Chciałbym zapytać, czy może moderatorzy Altkom mogliby mi pomóc i pokazać, jak taki kod wyglądałby w wykonaniu obiektowym.

Kod, który mam w tej chwili w module i działa tak jak powinien (zaznaczam zakres, wciskam skrót klawiaturowy i zakres zostaje zapisany w postaci tablicy i dodany do kolekcji, następnie kod wyświetla komunikat, ile obiektów jest w kolekcji:

Sub TestRange()
Dim I, J As Integer
Dim myArr() As Double
Dim Obj As New clsArray

    ReDim myArr(Selection.Rows.Count - 1, Selection.Columns.Count - 1)
    For I = 0 To Selection.Rows.Count - 1
        For J = 0 To Selection.Columns.Count - 1
          myArr(I, J) = Selection.Cells(I + 1, J + 1)
        Next J
    Next I

'test if ok, print items of array
'---------------
'For J = 0 To UBound(myArr, 1)
'        For I = 0 To UBound(myArr, 2)
'          Debug.Print myArr(J, I)
'        Next I
'Next J
'---------------

Obj.Arr = myArr


MsgBox "Sum of items in array = " & Application.WorksheetFunction.Sum(Obj.Arr)


'dodaj do kolekcji,nadaj klucz ze zmiennej

'------
Dim NazwaKolekcji As String: NazwaKolekcji = InputBox("Podaj unikalną nazwę dla tablicy")
'trzeba jakoś sprawdzać czy istnieje już taki key w kolekcji, ponoć łatwiej jest użyć Dictionary
'On Error Resume Next
'If Err.Number = 450 Then NazwaKolekcji = InputBox("Nazwa już istnieje podaj inną!")

KolekcjaTablic.Add Obj, NazwaKolekcji
'------



MsgBox "Count of arrays in collection  = " & KolekcjaTablic.Count

'Policz sumę w kolekcji
Dim Tot As Double

For Each Obj In KolekcjaTablic
    Tot = Tot + Application.WorksheetFunction.Sum(Obj.Arr)
Next

MsgBox "Sum of items in Collection = " & Tot


End Sub

Kod, który mam na razie w klasie clsArray:

Option Explicit
Option Base 0

Dim xArray() As Double

Property Get Arr() As Double(): Arr = xArray: End Property
Property Let Arr(uArr() As Double): xArray = uArr: End Property


'
Property Get Ele(Idx As Long) As Double: Ele = xArray(Idx): End Property
Property Let Ele(Idx As Long, uVal As Double): xArray(Idx) = uVal: End Property



'on initialise it has 5 elements
Private Sub Class_Initialize()
    ReDim xArray(5)
End Sub

Chciałbym, by procedury stworzenia nowej kolekcji, dodania do kolekcji, podania sumy, podania ilości obiektów w kolekcji, dodania klucza, znalazły się w odpowiednio w klasie clsArray i  rodziica, clsArrays (liczba mnoga w nazwie) -  "Parent Class" w stosunku do klasy clsArray. To dawałoby możliwość tworzenia kilku kolekcji.

Teoretycznie wiem o co chodzi, np. tutaj jest to dość jasno opisane w tym artykule: 

http://www.experts-exchange.com/articles/3802/Parent-Class-Builder-Add-In-for-Microsoft-Excel.html

Ale w praktyce nie wiem jak się za to zabrać.

Podejrzewam, że jest to proste dla programistów VB.net, jednak ja jestem dość początkujący, nie mogę znaleźć wyczerpującej literatury na temat vba OOP, nie wiem, jak to zrobić w VBA. Myślę, że taki przykład bardzo by mi pomógł.

Załączam plik z powyższym makrem.

Z góry bardzo dziękuję za pomoc i myślę, że taka odpowiedź mogłaby zainspirować innych kursantów do rozwoju w kierunku programowania obiektowego.

 

 

Załączniki

  • xlsm

    Ecercises_classes_arrays.xlsm ( 22K )
Jacek_Kotowski
  • Zapytał
  • @ Jacek_Kotowski | 25.09.2015
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94
Komentarze (1)
Sam pracuję nad tym problemem, na razie w sieci znalazłem na ten temat nast. literaturę:
http://www.wiseowl.co.uk/blog/s239/collections.htm
http://productivebytes.blogspot.co.uk/2012/04/how-to-create-strongly-typed-collection.html
Skomentował : @ Jacek_Kotowski ,28.09.2015
  • 60
  • 54
  • 94