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
- Ecercises_classes_arrays.xlsm ( 22K )