Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

VBA Moduli Classe corretto procedere così?

132 views
Skip to first unread message

Riddler ?

unread,
Oct 18, 2006, 1:49:57 PM10/18/06
to
Salve,
abbandonata l'idea della matrice "gigante" sono passato alle Classi ...
ora vista le mia inesperienza in VBA ... nelle Classi ... è nebbia
TOTALE ... Vi chiedo corretto quello che ho fatto?

Letto e sto seguendo passo passo le giude
<http://education.mondadori.it/libri/Download/Capitoli/88-04-53451-6_capitolo14.pdf
>
<http://www.itportal.it/developer/algoritmi/access_vba/>

Ho fatto 3 moduli Classe
List_Clienti
Item_Cliente
Item_Mese

Vorrei ottenere che
List_Item sia una Collection formata da elementi tipo Item_Cliente

Item_Cliente a sua volta ha una sua
property cod
e una List_Mesi(1 to 12 ) as Item_Mese

Item_Mese ha le seguenti propietà
public totale1 as Double
public totale2 as Double
...

public totale_n as Double

Devo poi implementarmi "a manina" le procedure di inserimento, ricerca,
cancellazione ... ???

Ci sono altre guide in rete a riguardo o esempi di codice?

Grazie anticipatamante

Ridddler ?

Mauro Gamberini

unread,
Oct 18, 2006, 3:05:31 PM10/18/06
to
abbandonata l'idea della matrice "gigante" sono passato alle Classi ...
ora vista le mia inesperienza in VBA ... nelle Classi ... è nebbia
TOTALE ... Vi chiedo corretto quello che ho fatto?
******************************************

Mi sono perso il thread.
Mi dai il link o mi spieghi(in modo
sintetico) cosa devi fare?
Le classi richiedono qualcosa in più(in termini
di comprensione) delle semplici routine
che mettiamo nei moduli.

--
---------------------------
Mauro Gamberini
http://www.riolab.org/


Riddler ?

unread,
Oct 18, 2006, 3:30:25 PM10/18/06
to

Mauro Gamberini ha scritto:

> abbandonata l'idea della matrice "gigante" sono passato alle Classi ...
> ora vista le mia inesperienza in VBA ... nelle Classi ... è nebbia
> TOTALE ... Vi chiedo corretto quello che ho fatto?
> ******************************************
>
> Mi sono perso il thread.
> Mi dai il link o mi spieghi(in modo

Eccolo
<http://groups.google.it/group/microsoft.public.it.office.excel/browse_frm/thread/0145bd80b4f9f181/ed5131566a76eaf3#ed5131566a76eaf3>

Ho pensato di apprirne un altro perchè l'argomento era un pò diverso
...
Cucchiaino mi ha proposto una soluzine molto interessante.

> sintetico) cosa devi fare?
> Le classi richiedono qualcosa in più(in termini
> di comprensione) delle semplici routine
> che mettiamo nei moduli.

Si infatti implementando una Classe devo farmi anche i metodi ri
inserimento e recupero dei valori ...

Ho programmato con le Classi con altri linguaggi ma con VBA sono
proprio alle prime armi ... e mi sono sentito un pò spaesato ...

sto valutando anche la soluzione proprosta da cucchiaino

saluti

Riddler ?

Riddler ?

unread,
Oct 19, 2006, 5:52:11 AM10/19/06
to

Mauro Gamberini ha scritto:


> Le classi richiedono qualcosa in più(in termini
> di comprensione) delle semplici routine
> che mettiamo nei moduli.


Ragionando sulla soluzione matrice tridimensionale, ho trvato che in
ogn caso dovrei avere una ulteriore struttura arra in cui inserire
l'indicizzazione dei codici clienti ... da tread suggerito ...

Quindi questo mi riporta a pensare che sia meglio farmi una classe ...

Per ora l'idea è di fare così

List_Clienti as Collection
Cliente come classe che ha le property codice e un array 1 to 12 per i
mesi di tipi Item_Mese

Item_Mese
tot1
tot2
...
totn

Cosi quando aggiungo un elemento


List_Clienti.Add Item:=Cliente, key:=Cliente.cod

posso ricercare per codice ... giusto?

Ecco le definizioni delle classi

Item_Mese
pubic tot1
pubic tot2
...
pubic totn

Item_Cliente
public cod as string
pubic List_Mesi(1 to 12) as Item_Mese

List_Clienti as Collection

In cui inserirò valori di tipi Item_Cliente

Vi chiedo è corretto come punto di partenza?

Quando devo valorizzare il tutto sono corrette le seguenti istruzioni?

Dim cliente as Item_Cliente
dim mese as Item_Mese

mese.tot1 = xxx
mese.tot2 = yyy
...
mese.totn = zzz

cliente.cod = 333
cliente.List_Mesi(1)=mese

List_Clienti.Add Item:=cliente, key:=cliente.cod


Grazie ancora

saluti

Riddler ?

Riddler ?

unread,
Oct 19, 2006, 12:46:54 PM10/19/06
to

Riddler ? ha scritto:


Niente! NON ci riesco! sarà perchè ormai sono fuso ma non sono
riuscito ad implementare in VBA la classe che vorrei fare ... ho chiaro
quello che vorrei implementare, ma non trovo la strada ...

L'esigenza è poter avere una Collection di Clienti e ricecrcarli per
codice, ogni cliente a sua volta avrà un elenco di mesi ... da 1 a 12
... nei i quali ho i vari tot1, tot2 ... totn


Qualcuno ke mi da una dritta in più ... adesso ho provato nella classe
Item_Cliente a dichiarare
Public List_Mesi as Item_mese ma non è possibile ...

Come posso realizzare la suddetta struttura?

Grazie ancora a tutti

Riddler ?

Riddler ?

unread,
Oct 19, 2006, 5:22:51 PM10/19/06
to
Salve a tutti,

ho implementato le classi come descritto, ma durante il test ottengo un
errore run-time 91 "variabile ggetto o blocco with non impoststa"

Di seguito le classi

Item_Mese

Option Explicit

' Totali da calcolare
Public tot1 As Double
Public tot2 As Double
Public tot3 As Double
Public tot4 As Double
Public tot5 As Double
Public tot6 As Double
Public tot7 As Double

Public Sub Initialize_Mese()
Me.tot1 = 0
Me.tot2 = 0
Me.tot3 = 0
Me.tot4= 0
Me.tot5 = 0
Me.tot6 = 0
Me.tot7 = 0
End Sub

Item_Cliente

Public cod As String ' Codice Cliente
Public List_Mesi As Collection ' Elenco Mesi

Private Sub Initialize_Cliente()
Dim i As Integer
Dim mese As Item_Mese

Set List_Mesi = New Collection

For i = 1 To 12
Set mese = New Item_Mese
mese.Initialize_Mese
List_Mesi.Add Item:=mese, Key:=i
Next i

End Sub

Private Sub Terminate_Cliente()

Set List_Mesi = Nothing

End Sub

List_Clienti

Public Clienti As Collection

' Aggiunge un Elemento Cliente con il suo array Mesi nella lista
Sub Add_Cliente(cli As Item_Cliente)
Clienti.Add Item:=cli, Key:=cli.cod
End Sub

Sub Remove_Cliente(code As String)
If Clienti.Contains(code) Then
Clienti.Remove (code)
End If
End Sub

Sub Print_Clienti()
Dim i As Integer
Dim cli As Item_Cliente
Dim mese As Item_Mese
Dim MyObject As Variant
Dim MyList As Variant

For Each MyObject In Me.Clienti
MyList = MyList & MyObject.cod & Chr(13)
Set mese = New Item_Mese
Set cli = New Item_Cliente
cli = MyObject

For i = 1 To 12
mese = cli.List_Mesi(i)
MyList = MyList & mese.crediti_residui & Chr(13)
MyList = MyList & mese.tot_ct_brillanti & Chr(13)
MyList = MyList & mese.tot_pietre & Chr(13)
MyList = MyList & mese.vend_brillanti & Chr(13)
MyList = MyList & mese.vend_oreficeria & Chr(13)
MyList = MyList & mese.vend_pulitura & Chr(13)
MyList = MyList & mese.vend_service & Chr(13)
Next i
Next MyObject

MsgBox (MyList)

End Sub


Codice usato per il test

Sub test_class()

Dim list_cli As New List_Clienti
Dim cli As Item_Cliente
Dim mese As Item_Mese
Dim MyObject As Variant
Dim MyList As Variant
Dim i As Integer

For i = 1 To 20
Set cli = New Item_Cliente
Set mese = New Item_Mese
cli.cod = i
mese.Initialize_Mese
cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE
list_cli.Add_Cliente (cli)
Next i

list_cli.Print_Clienti

list_cli.Remove_Cliente (17)

list_cli.Print_Clienti

End Sub


Dove sto sbagliando?

Grazie anticipatamente a tutti

Riddler ?

Riddler ?

unread,
Oct 20, 2006, 7:27:52 AM10/20/06
to

Riddler ? ha scritto:

Salve a tutti,

Fatte alcune modifiche a vari tentativi, ma non riesco a valorizzare
la Collection ...

Item_Mese

Option Explicit

' Totali da calcolare
Public tot1 As Double
Public tot2 As Double
Public tot3 As Double
Public tot4 As Double
Public tot5 As Double
Public tot6 As Double
Public tot7 As Double

Public Sub IAzzera_Totali()


Me.tot1 = 0
Me.tot2 = 0
Me.tot3 = 0
Me.tot4= 0
Me.tot5 = 0
Me.tot6 = 0
Me.tot7 = 0
End Sub

Item_Cliente

Public cod As String ' Codice Cliente
Public List_Mesi As Collection ' Elenco Mesi

Private Sub Class_Initialize()


Dim i As Integer
Dim mese As Item_Mese

Set List_Mesi = New Collection

For i = 1 To 12
Set mese = New Item_Mese
mese.Initialize_Mese
List_Mesi.Add Item:=mese, Key:=i
Next i

End Sub

Private Sub Class_Terminate()

Set List_Mesi = Nothing

End Sub

List_Clienti

Public Clienti As Collection

MsgBox (MyList)

End Sub

Sub test_class()

cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE ***
list_cli.Add_Cliente (cli)
Next i

list_cli.Print_Clienti

list_cli.Remove_Cliente (17)

list_cli.Print_Clienti

End Sub

Alla riga cli.List_Mesi.Add Item:=mese, Key:=cli.cod
Ottengo l'errore:


ho implementato le classi come descritto, ma durante il test ottengo
un
errore run-time 91 "variabile ggetto o blocco with non impoststa"


Se invece provo a metter
cli.List_Mesi.Item(i) = mese

Che "sarebbe" in teoria quella corretta ottengo un errore run-time
tipo non corrispondente

Riddler ?

unread,
Oct 20, 2006, 9:12:09 AM10/20/06
to

Riddler ? ha scritto:

> MyList = MyList & mese.tot1 & Chr(13)
> MyList = MyList & mese.tot2 & Chr(13)
> MyList = MyList & mese.tot3 & Chr(13)
> MyList = MyList & mese.tot4 & Chr(13)
> MyList = MyList & mese.tot5 & Chr(13)
> MyList = MyList & mese.tot6 & Chr(13)
> MyList = MyList & mese.tot7 & Chr(13)

TROVATO!

Se invece di


cli.List_Mesi.Add Item:=mese, Key:=cli.cod '<= Dove da ERRORE ***

Metto
cli.List_Mesi.Add mese

Funziona correttamente l'inserimento dell'item nella collectio e lo
recupero facendo:
lista_cli.Clienti.Item(n)

Dove lista_cli è la Collection ... ora ... un po di dubbi ... visto
che vorrei recuperare i valori tramite key perchè mi da errore se
tento di inserire la key? Anche gli esempi trovati in giro per la rete
e nella guida fanno l'inserimento con


cli.List_Mesi.Add Item:=mese, Key:=cli.cod

Per chè a me da errore?

Poi altra cosa ho trovato sumsdn il metodo "Contains", ma con VBA di
Excel mi da errore, quindi come faccio a sapere se un elemento è già
stato inserito nella collection ricercando la sua key? Mi sembra ino
spreco ciclare tutte le volete la Collection alla ricerca del valore (
visto che per ora NON sono riuscito a mettre la key )

Qualcuno sa indirizzarmi su dove corregge queste mancanze? Fatte queste
... finalemte posso utilizzare la Classe per i miei scopi ...

Riddler ?

unread,
Oct 20, 2006, 10:10:04 AM10/20/06
to

Riddler ? ha scritto:

> Dove lista_cli è la Collection ... ora ... un po di dubbi ... visto
> che vorrei recuperare i valori tramite key perchè mi da errore se
> tento di inserire la key? Anche gli esempi trovati in giro per la rete
> e nella guida fanno l'inserimento con
> cli.List_Mesi.Add Item:=mese, Key:=cli.cod
>
> Per chè a me da errore?
>
> Poi altra cosa ho trovato sumsdn il metodo "Contains", ma con VBA di
> Excel mi da errore, quindi come faccio a sapere se un elemento è già
> stato inserito nella collection ricercando la sua key? Mi sembra ino
> spreco ciclare tutte le volete la Collection alla ricerca del valore (
> visto che per ora NON sono riuscito a mettre la key )
>
> Qualcuno sa indirizzarmi su dove corregge queste mancanze? Fatte queste
> ... finalemte posso utilizzare la Classe per i miei scopi ...
>

Trovata risposta alla seconda domanda ... come fare a sapere se un
elemento è nella Collection , ecco a Voi il codice, magari può
tornare util a qualcun altro, ma mi manca la parte in cui vorrei
inserire anche le key ... come fare?

Code:
Function IsIn(oCollection As Object, key_to_search As String) As
Boolean
Dim O As Object
On Error GoTo NotIn
Set O = oCollection(key_to_search)
IsIn = True 'succeeded in creating a pointer to the object so
'must be there
NotIn:

End Function

Riddler ?

unread,
Oct 22, 2006, 4:59:14 AM10/22/06
to

Riddler ? ha scritto:

> Trovata risposta alla seconda domanda ... come fare a sapere se un
> elemento è nella Collection , ecco a Voi il codice, magari può
> tornare util a qualcun altro, ma mi manca la parte in cui vorrei
> inserire anche le key ... come fare?

Così magari può trornare utile a qualcun' altro che come me si
cimenta per la prima volta nella costrusione di Moduli Classe ...

Ecco perchè non riuscivo ad inserire la key

List_Clienti.Add Item:=cliente, key:=cliente.cod

Questa istruzione va modificata con

List_Clienti.Add Item:=cliente, key:=CStr(cliente.cod)

Perchè la key "vuole" una stringa .-) ora funziona tutto correttamente

Un saluti a tutti

Riddler ?

0 new messages