In un foglio ho inserito i dati di fatture emesse durante piu' anni.
colonna A = datafattura(nota)
colonna b = numerofattura(nota)
colonna c = codicefiscale(nota)
nota= ho cercato di crearmi una chiave di ricerca univoca
nelle successive colonne i vai campi relativi a imponibili descrizioni ecc.
Ora una combobox mi elenca tutte le fatture presenti all'interno del
foglio.Ma se io voglio selezionare una riga della combo per ottenere i soli
dati di quella riga e portarli in alcune texbox di una user form come posso
fare?
Qualcuno puo' aiutarmi?
Ne abbiamo discusso pochi giorni fa.
Vediamo di farne un riepilogo adattato(spero) al tuo
caso.
Una UserForm con la tua ListBox(ListBox1) e tre TextBox
(TextBox1/2/3).
Sul foglio Dati abbiamo la tabella.
Voglio che facendo click sulla ListBox,
i dati delle varie colonne vengano messi nelle
TextBox.
Un primo problema � che la ListBox pu� contenere solo
10 campi(colonne), quindi se hai 12 colonne nella tabella
2 non puoi visualizzarle nella ListBox.
Nel mio esempio la tabella nel foglio dati ha 3 campi ed �
cos� composta:
A B C
1 Nome Comune Provincia
2 aaaaa xxxxxxx yy
3 bbbbb xxxxyyy xy
4 ccccc xxyyyyy xx
5 ddddd xxxxxxx yy
6 eeeee xxxxyyy xy
Il codice va tutto nel modulo della UserForm.
'evento eseguito alla creazione
'della UserForm
Private Sub UserForm_Initialize()
'dichiarazione variabili
Dim sh As Worksheet
Dim rng As Range
'metto il riferimento al foglio Dati
Set sh = Worksheets("Dati")
With sh
'passo il Range della tabella alla
'variabile rng
Set rng = .Range("A1").CurrentRegion
'setto il numero delle colonne
'della ListBox1 uguale al numero
'delle colonne della tabella
'che ho nel foglio Dati
Me.ListBox1.ColumnCount = rng.Columns.Count
'elimino l'eventuale riga di intestazione
'della tabella(vedi tu se mantenere la riga
'qui sotto)
Set rng = rng.Offset(1, 0 _
).Resize(rng.Rows.Count - 1, _
rng.Columns.Count)
End With
'carico i dati nella ListBox1
With Me.ListBox1
.List = rng.Value
End With
'Set a Nothing della variabile oggetto
Set rng = Nothing
End Sub
NOTA.
Puoi anche definire tu il numero delle colonne
della ListBox modificando qui:
Me.ListBox1.ColumnCount = rng.Columns.Count
cos�:
Me.ListBox1.ColumnCount = 3
(qui ho 3 colonne).
Adesso mettiaamo il codice per l'evento Click
della ListBox1:
'evento Click della ListBox1
'che, quando eseguito, copia
'i contenuti delle colonne
'della riga nelle TextBox
Private Sub ListBox1_Click()
'dichiaro le variabili
Dim lng As Long
'controlli sulla UserForm
With Me
'ciclo i campi della ListBox
'e metto i valori nelle TextBox
For lng = 1 To 3
'pulisco la TextBox dal dato
'precedente
.Controls("TextBox" & lng).Value = ""
'inserisco i valori delle varie colonne
.Controls("TextBox" & lng).Value = _
.ListBox1.List(.ListBox1.ListIndex, lng - 1)
Next
End With
End Sub
NOTA.
Le righe e le colonne nella ListBox sono
in base 0(zero), cio� la prima riga e la prima
colonna sono riga 0 e colonna 0. Tienine conto.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Grazie per gentile il riscontro.
ListIndex ti restituisce l'indice della riga selezionata.
Prova ad aggiungere questa riga in fondo all'evento
Click:
Worksheets("Dati").Rows(Me.ListBox1.ListIndex + 2).Select
(+2 perch� siamo in base 0 nella ListBox
e abbiamo inoltre l'intestazione nella tabella
sul foglio Dati)
Esegui il Click e vedi che succede.
Riesci adesso da solo?
Se hai bisogno, chiedi pure.
Grazie.
nel caso ti interessi,
qui trovi il file che ho utilizzato per
provare il codice postato:
http://www.maurogsc.eu/esemping/listtextbox.zip
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
Il tuo pgm funziona, adattato al mio non riesco a farlo funzionare.
Ti spiego, lui con la proprieta' listindex e' posizionato a 1 , perche' io
seleziono la prima riga.Poi aggiungo +2 al comando Me.lstconta.ListIndex +
2).Value e lui va a leggere su riga tre del foglio, che pero' non
corrisponde alla riga che ha valorizzato l'indice 1della listbox :(
Grazie a te per il riscontro.
> Non e' che per caso scrivi qualche libro tu sul vba per excel? Sarei
> interessato ai tuoi testi se cosi' fosse.
>
Una volta Fernando scrisse pi� o meno questo
(o almeno questo mi sembra ricordare fosse
il concetto espresso):
i libri invecchiano
in Internet trovo sempre tutto, dal vecchio al nuovo
Inoltre, cosa potrei mai aggiungere a quello
che si trova in rete o sui libri gi� disponibili?
E in un libro(e qui concludo) troveresti le mie idee.
In Internet trovi *tante* idee.
Grazie comunque per la stima(immeritata).
Buon lavoro.
Sara' che su un libro riesco a capire meglio che su un video di un pc?
Chiamala stima immeritata, rispondi sempre gentilmente e a tutti risolvi i
problemi fai un po' te , se questo non si chiama meritarsi la stima.
Nel mio esempio c'� una riga di intestazione
nella tabella in foglio Dati e la tabella
parte da riga 1.
Confronta con la tua tabella(dove inizia,
ha l'intestazione, ecc) e prova a modificare
quei +1, +2....
Se non riesci, gentilmente posta
i riferimenti della tua tabella. Grazie.
Ahim�, poco poco.
Quindi hai 9 campi(colonne)?
Da A1 a I(n), � cos�?
Quante sono le TextBox sulla UserForm
e che corrispondenza devono avere con i campi?
no no, sono piu' di nove, io per comodita' te ne ho messe solo alcune.
Le textbox sulla userform sono esattamente tante quante le colonne.
Io dovrei riuscire, cliccando sul singolo rigo della listbox, ad avere una
maschera che riproduca la fattura relativa al rigo che io ho cliccato nella
listbox.
Ma tutto questo credo di poterlo avere solo sapendo in che riga del foglio2
ho i dati che corrispondono alla riga della listbox ma non ne vengo fuori.
Capito?
Vediamo un po'.
Tabella.
A B C
1 R1C1 R1C2 R1C3
2 R2C1 R2C2 R2C3
3 R3C1 R3C2 R3C3
4 R4C1 R4C2 R4C3
5 R5C1 R5C2 R5C3
Dove, � intuibile, i dati immessi
nelle celle danno la posizione del
dato rispetto alla riga(R) e alla colonna(C).
Excel *ragiona* nelle celle in base 1, cio� la
prima riga � la riga 1 e la prima colonna
� la colonna 1.
La ListBox invece, *ragiona* in base 0.
Cio� la prima riga � la riga 0 e la
prima colonna � la colonna 0.
Quindi, se carico i dati della tabella qui
sopra in una ListBox ecco come si presentano
in base a righe e colonne della ListBox:
Colonna 0 Colonna 1 Colonna 2
Riga 0 R1C1 R1C2 R1C3
Riga 1 R2C1 R2C2 R2C3
Riga 2 R3C1 R3C2 R3C3
Riga 3 R4C1 R4C2 R4C3
Riga 4 R5C1 R5C2 R5C3
Abbiamo detto che ListBox mi restituisce il numero della
riga della ListBox che ho selezionato.
Quindi se seleziono la 2� (la seconda) riga della ListBox
il ListIndex restituito sar� 1(UNO) ed il suo
contenuto sar�: R2C1/R2C2/R2C3.
Se(se) non tengo conto della differenza relativa
alla gestione degli indici(quello che sopra ho
chiamato *ragiona*), se a questo punto chiedo
che il valore ListIndex restituito(ricordo � 1)
venga utilizzato per prendere un dato sulla riga del
foglio di Excel, ecco che ho un disallineamento fra
la ListBox e la tabella.
Riga 1 ListBox =R2C1/R2C2/R2C3
Riga 1 Tabella =R1C1/R1C1/R1C3
La stessa cosa vale, come si pu� vedere nell'esempio,
per le colonne nel caso si utilizzi Cells(riga,colonna)
anzich� Range(Range.Address).
Quindi, questa tabella con intestazione:
A B C
1 INT1 INT2 INT3
2 AAA1 BBB1 CCC1
3 AAA2 BBB2 CCC2
4 AAA3 BBB3 CCC3
5 AAA4 BBB3 CCC4
Verr� caricata in questo modo nella ListBox
0 1 2
0 INT1 INT2 INT3
1 AAA1 BBB1 CCC1
2 AAA2 BBB2 CCC2
3 AAA3 BBB3 CCC3
4 AAA4 BBB3 CCC4
Per avere in una TextBox il valore
della riga selezionata nella ListBox
relativo alla colonna M, il mio
codice sar�:
TextBox1.Text = NomeFoglio.Range("M" & ListBox1.ListIndex + 1)
Perch�, ad esempio se selezioni la terza riga
della ListBox, ListIndex restituisce 2, ma la riga 2
della tabella non � quella corretta, quindi aggiungo
un 1 e 2 +1 = 3, terza riga della tabella, riga corretta.
Se(se) come l'esempio postato in precedenza(e che trovi al link),
non voglio portare l'intestazione delle colonne nella ListBox,
devo tenerne conto.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Ma allora non leggi i post!
Cosa ho scritto io nella prima risposta?
<old>
Un primo problema � che la ListBox pu� contenere solo
10 campi(colonne), quindi se hai 12 colonne nella tabella
2 non puoi visualizzarle nella ListBox.
</old>
Ma negli esempi postati e in quello al link
vedi che posso portare nelle TextBox anche
i valori non presenti nella ListBox ma che
si trovano in una determinata riga!
Non preoccuparti, capisco che quello che a me sembra
semplice, sia invece difficile per te e che oltretutto
� tutto il giorno che *ti sbatti* con queste *brutte cose*.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Bene!
Grazie della tua pazienza verso il mio poco
capire cosa tu stessi facendo dalle tue parti.
Buon lavoro e buona serata.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
Mah, credo che di pazienza ne hai avuto di piu' tu :)
Ora arrivera' il bello.
Voglio stampare le fatture dato un intervallo di numeri tipo dalla alla e
non so se con excel si possa fare.
Dove sono e cosa intendi per fatture?
Se(se) parliamo di ci� che produciamo
partendo dal codice ottenuto in questo
thread, forse meglio non aprire una
nuova richiesta per maggiore chiarezza.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Dunque le fatture sono nella stessa tabella di cui abbiamo parlato in
questo tread.IL motivo per cui io volevo che all'evento click del mouse
venissero riportati i dati nelle text box ,era per vedere se riuscivo a
stampare la singola fattura.Avendo i dati nelle texbox, ho messo un tasto
stampa, ho trasferito questi dati su un foglio nuovo di excel(sempre dello
stesso file)e stampo la fattura.Ad ogni tasto stampa, prima pulisco i campi
del foglio nuovo, poi riporto i dati delle text box in celle,in etichette e
stampo.Problema: Mettiamo che io non voglio stampare una sola fattura, ma
voglio dare la possibilita' tramite un form di decidere da che numero a che
numero stampare.Con access, forse avrei fatto una query o avrei usato >= di
XX oppure beetwen credo... Qui come faccio? devo farmi rigo per rigo e
controllare un singolo valore di una cella?
Mauro ho provato cosi':(naturalmente ho messo solo dei msgbox per capire se
prendevo i dati giusti)
Private Sub cmdstampafatture_Click()
Dim RIGA As Integer
Dim CL As Integer
Foglio6.Activate
RIGA = Worksheets(6).UsedRange.Rows.Count
RANGE("B2").Select
For CL = 2 To RIGA
If ActiveCell.Value >= txtda.Text And ActiveCell.Value <= txta.Text Then
MsgBox "STAMPO LA FATTURA NUM" & ActiveCell.Value
End If
Selection.Offset(1, 0).RANGE("B2").Select
Next
End Sub
problema: al primo next mi scende giu' di due righi e si sposta su colonna C
DEL RIGO SUCCESSIVO :(
Dove e' l'errore?
>
Prova questa cosa(chiedo scusa se posto un link,
ma codice e spiegazione sarebbero troppo
lunghi):
http://www.maurogsc.eu/esemping/stampaselezione.zip
Il codice � commentato.
L'esempio utilizza i Nomi per definire le celle nelle
quali svolgere operazioni nel foglio Fatture.
La parte che carica la tabella nei Range non deve
essere modificata se le colonne sono di pi� o di meno.
Questo � solo un esempio e va adattato alle tue
esigenze.
In pratica selezioni l'anno, la prima e l'ultima fattura
che vuoi stampare e premi stampa.
Prova un po'. Grazie.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
Per il numero delle copie, non serve impostare
la cosa nella stampante...
Dim lng As Long
For lng = 1 To 3
NomeFoglio.PrintOut
Next
e Stampi 3 copie.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Aggiungo che quel 3 potrebbe essere una
variabile impostata da qualche parte.
Esempio terra terra:
Public Sub m()
'gestione errori
On Error GoTo RigaErrore
'dichiaro le variabili
Dim s As String
Dim lng As Long
'assegno a s il numero di stampe
s = Application.InputBox("Quante copie stampo?")
'stampo
For lng = 1 To CInt(s)
NomeFoglio.PrintOut
Next
'riga sempre eseguita
RigaChiusura:
Exit Sub
'in caso di errore
RigaErrore:
MsgBox "Valore inserito non valido."
Resume RigaChiusura
End Sub
Al posto di una InputBox puoi passare il numero
delle pagine tramite qualsiasi controllo
(ad esempio una ComboBox con all'interno
valori che tu ritieni validi).
Bah, solo alcune idee... ;-)
DUNque ho provato, mi va in errore quando arrivo qui:
Set rngTabella = .Range("A1").CurrentRegion
metodo range dell'ogggetto worksheet non riuscito.
Credevo fosse un problema dovuto al fatto che avevo messo un'altra colonna
al posto dell' a1 ma invece anche con il valore A1 mi da questo
problema.Naturalmente solo sul mio pgm pero' :(
Bene.
Considero chiuso il thred se non vedo
altri post.
Buon lavoro.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
Siamo (quasi)sempre qui.
Chiedi e ti sar� dat... ehmmm, spiegato(forse).
'dichiaro le variabili
Dim c As RANGE( primo problema: dichiari vairabile c con valore range
pero' poi dove gli dai il range??)
Dim v As Variant
'creo o metto riferimento agli oggetti
Set colAnni = New Collection (riferimento agli oggetti i
due fogli piu' la collection anni)
Set shDati = Worksheets("FOGLIO6")
Set shFattura = Worksheets("FOGLIO8")
With shDati
'metto il riferimento alla tabella
Set rngTabella = .RANGE("AJ1").CurrentRegion
'metto il riferimento alla prima
'colonna della tabella senza l'intestazione
Set rngA = rngTabella.Offset(1, 35).Resize( _ (io qui mi
sono spostato un po' oltre la prima colonna)
rngTabella.Rows.Count - 1, _ (qui che succede?? a cosa
serve?)
rngTabella.Columns.Count - ( _
rngTabella.Columns.Count - 1))
'ciclo la colonnaA
For Each c In rngA
'in caso di errore, ignoralo e prosegui
On Error Resume Next
'aggiungo un anno univoco alla
'Collection
colAnni.Add c.Value, CStr(c.Value) (qui aggiungi, ma non
capisco come fa lui a sapere dove sono gli anni e come li prende)
Next
End With
With Me.ComboBox1
'ciclo la Collection
'e porto gli anni in ComboBox1
For Each v In colAnni (da qui in poi
proprio mi perdo totalmente, non capisco come e' stata creata la collection)
.AddItem v
Next
End With
'Set a Nothing della variabile oggetto
Set c = Nothing
End Sub
la uso come item nel ciclo:
For Each c In rng
Che sta per:
per ogni cella nel range
> rngTabella.Rows.Count - 1, _ (qui che succede?? a cosa serve?)
>
Elimino la riga con l'intestazione per non portarla
nella ListBox
Guida del vb di excel, Resize.
> colAnni.Add c.Value, CStr(c.Value) (qui aggiungi, ma non capisco come fa
> lui a sapere dove sono gli anni e come li prende)
>
Sto ciclando la colonna A, cella per cella.
La collection non accetta due valori uguale
nell'index8il secondo che passo,
che *deve* essere una stringa).
Se li trova da errore, ma io
con On error resume Next gli dico
di ignorarlo r andare avanti, cos� alla
fine nella collection ho solo valori univoci.
Guida del vb di Excel, Collection.
> For Each v In colAnni (da qui in poi
> proprio mi perdo totalmente, non capisco come e' stata creata la
> collection)
> .AddItem v
>
'variabile per il ciclo
Dim lng As Long
'variabile per ciclare
'la collection
Dim v As Variant
'dichiaro la variabile per la collection
Dim col As Collection
'la creo
Set col = New Collection
'la riempio
For lng = 1 To 5
col.Add lng, CStr(lng)
'il secondo parametro(index)
'*DEVE* essere una String
Next
'leggo la collection
For Each v in col
'vedo il contenuto degli items
'della collection
MsgBox v
Next
'Set a Nothing della variabile ogggetto
'la collection *�* un oggetto
Set col = nothing
>
> la uso come item nel ciclo:
> For Each c In rng
>
> Che sta per:
> per ogni cella nel range
>
>> rngTabella.Rows.Count - 1, _ (qui che succede?? a cosa serve?)
>>
>
> Elimino la riga con l'intestazione per non portarla
> nella ListBox
> Guida del vb di excel, Resize.
>
>> colAnni.Add c.Value, CStr(c.Value) (qui aggiungi, ma non capisco come fa
>> lui a sapere dove sono gli anni e come li prende)
>>
>
> Sto ciclando la colonna A, cella per cella.
> La collection non accetta due valori uguale
> nell'index8il secondo che passo,
> che *deve* essere una stringa).
> Se li trova da errore, ma io
> con On error resume Next gli dico
> di ignorarlo r andare avanti, cos� alla
> 'la collection *�* un oggetto