View Full Version : Excel e VBA
El Tazar
04-08-2009, 14:42
Hoi bisogno di aiuto con excele vba:sono alle primissime armi.
Per ora sono riuscito a creare una userfom con alcuni comandi all'interno.
1 Una textbox dove voglio inserire la data e fare in modo che mi si inserisca nella prima cella vuota della colonna A
2 Una casella combinata che prende l'elenco in determinate celle (e sono riuscito) e me lo deve inserire a fianco della data immessa prima
3 Una textbox dove inserire l'importo in euro che mi si inserisca nella cella a fianco della precedente
In pratica un elenco DATA - CATEGORIA - SPESA
Il tutto che si inserisca con un pulsante di conferma nella stessa userform.
Chi mi da una mano? :D
P.S: Se mi indicate qualche sito che spieghi ai niubbi come me come imparare da zero è ben accetto:ne ho trovati alcuni ma necessita avere una base già acquisita :help:
john_revelator
04-08-2009, 15:19
Un esempio di form per l'inserimento dati in excel lo puoi scaricare a questo indirizzo
http://www.exceltip.com/st/Create_User_Forms_in_Microsoft_Excel/629.html
allora... se ho capito bene dovrebbe essere una cosa di questo tipo:
innanzi tutto trovi la prima riga vuota nel foglio:
Public r As Integer 'dichiaro una variabile pubblica perchè può servire a molte sub
Private Sub UserForm_Initialize()
trova_riga_vuota '<-- richiama la sub per cercare la prima riga vuota
End Sub
Sub trova_riga_vuota()
r = 0
Do
r = r + 1
Loop Until Foglio1.Cells(r, 1) = "" And _
Foglio1.Cells(r, 2) = "" And _
Foglio1.Cells(r, 3) = "" Or r = 5000
'esegue il DO fino a che non trova le prime 3 celle vuote oppure quando r = 5000 (per evitare che vada in overflow)
End Sub
poi passi a inserire semplicemente i dati a quella riga che hai trovato essere vuota:
Private Sub cmdInserisci_Click()
foglio1.cells(r, 1) = txtData.text
foglio1.cells(r, 2) = cmbCategoria.value 'suppongo sia una combobox
foglio1.cells(r, 3) = txtSpesa.text
trova_riga_vuota 'ricontrolla tutte le righe ad ogni inserimento (l'ho aggiunto ora)
End Sub
questo penso funzioni, fammi sapere se hai problemi o semplicemente se hai risolto ciao! ;)
El Tazar
04-08-2009, 19:29
Non sono col mio pc fino a domani comunque intanto ti ringrazio ;)
Una domanda:ho capito come funziona il codice che hai scritto ma mi chiedevo come fare per indicare una determinata colonna:nel senso se io voglio inserire il tutto nella colonna H?
ah pensavo sapessi come funziona il foglio di excel.. bhe cmq è molto semplice:
la prima cella in alto a sinistra (A1) ha coordinate 1,1 (il primo indice rappresenta le righe, il secondo invece le colonne). ti faccio altri esempi:
cella H4 = 4, 8
cella D9 = 9, 4
e così via...
penso sia chiaro no? basta che conti le colonne... se hai altri dubbi chiedi pure ;)
El Tazar
04-08-2009, 20:10
Sono riuscito a provare ma quando mi esce la finestra (che richiamo con una macro e un pulsante dal foglio,giusto?) anche se inserisco dei dati non mi si inseriscono nel foglio...
Io ho copiato il codice che hai messo tu ma probabilmente ho tralasciato qualcosa...:doh:
I vari textbox eccetera devono avere qualche configurazione oppure vanno lasciati di default?
Perdonami ma sono proprio alle primissime armi,credo che questo sistema sia quello che cerco ma purtroppo devo imparare da zero :help:
Sono riuscito a provare ma quando mi esce la finestra (che richiamo con una macro e un pulsante dal foglio,giusto?) anche se inserisco dei dati non mi si inseriscono nel foglio...
Io ho copiato il codice che hai messo tu ma probabilmente ho tralasciato qualcosa...:doh:
I vari textbox eccetera devono avere qualche configurazione oppure vanno lasciati di default?
Perdonami ma sono proprio alle primissime armi,credo che questo sistema sia quello che cerco ma purtroppo devo imparare da zero :help:
non preoccuparti ci siamo qui noi per questo :)
cmq posta tutto il codice magari... cosi capiamo meglio ;)
EDIT: sarà che magari i nomi dei pulsanti e delle textbox sono diversi
In pratica un elenco DATA - CATEGORIA - SPESA
Il tutto che si inserisca con un pulsante di conferma nella stessa userform.
può essere fatto semplicemente così.
Due accorgimenti :
1. Quando hai dati in forma tabellare, puoi verificare che un "record" sia vuoto o meno semplicemente controllando il .Value o .Text di tutto il Range che rappresenta il record, nel tuo caso un Range("Ax:Cx").
2. Inutile ricalcolare la posizione della nuova riga in cui scrivere ad ogni inserimento. Con molte righe in elenco diventerà inutilmente lento. Basta farlo una volta sola sull'Initialize della Form, e ad ogni inserimento andato a buon fine, incrementare di 1.
In soldoni il codice completo della UserForm sarà qualcosa del genere :
Private indiceNuovaRiga As Long
Private Sub UserForm_Initialize()
indiceNuovaRiga = 2
Do
If Sheets("Foglio1").Range("A" & indiceNuovaRiga & ":C" & indiceNuovaRiga).Text = "" Then
Exit Do
Else
indiceNuovaRiga = indiceNuovaRiga + 1
End If
Loop
End Sub
Private Sub cmd_inserisci_Click()
Sheets("Foglio1").Range("A" & indiceNuovaRiga).FormulaR1C1 = txt_data.Text
Sheets("Foglio1").Range("B" & indiceNuovaRiga).FormulaR1C1 = cmb_categoria.Text
Sheets("Foglio1").Range("C" & indiceNuovaRiga).FormulaR1C1 = txt_spesa.Text
If indiceNuovaRiga = 65536 Then
MsgBox "Impossibile inserire. Limite max. raggiunto"
cmd_inserisci.Enabled = False
Else
indiceNuovaRiga = indiceNuovaRiga + 1
End If
End Sub
;)
si in effetti hai ragione che è più veloce come dici tu... però io ho riscontrato problemi quando andavo a eliminare delle celle o delle righe... a volte venivano sovrascritte intere righe oppure ne venivano lasciate vuote alcune...
quindi el tazar fai attenzione! dipende da quanti dati devi gestire... se si tratta di poche centinaia di righe allora il tempo di controllare una riga vuota è pochissimo... il discorso è forse diverso se gestisci decine di migliaia di dati (ma non lo so con certezza). comunque sia valuta bene e scegli te il più adatto! :)
El Tazar
05-08-2009, 14:30
Ho semplicemente copiato il codice che mia hai messo tu bio n3t
Public r As Integer 'dichiaro una variabile pubblica perchè può servire a molte sub
Private Sub UserForm_Initialize()
trova_riga_vuota '<-- richiama la sub per cercare la prima riga vuota
End Sub
Sub trova_riga_vuota()
r = 0
Do
r = r + 1
Loop Until Foglio1.Cells(r, 1) = "" And _
Foglio1.Cells(r, 2) = "" And _
Foglio1.Cells(r, 3) = "" Or r = 5000
'esegue il DO fino a che non trova le prime 3 celle vuote oppure quando r = 5000 (per evitare che vada in overflow)
End Sub
Private Sub cmdInserisci_Click()
Foglio1.Cells(r, 1) = txtData
Foglio1.Cells(r, 2) = cmbCategoria 'suppongo sia una combobox
Foglio1.Cells(r, 3) = txtSpesa
End Sub
Poi ho messo un pulsante direttamente nel foglio che funziona con questa macro
Sub inserisci()
UserForm1.Show
End Sub
Forse manca un pulsante nella userform che dia l'ok per inserire?
Ho semplicemente copiato il codice che mia hai messo tu bio n3t
Public r As Integer 'dichiaro una variabile pubblica perchè può servire a molte sub
Private Sub UserForm_Initialize()
trova_riga_vuota '<-- richiama la sub per cercare la prima riga vuota
End Sub
Sub trova_riga_vuota()
r = 0
Do
r = r + 1
Loop Until Foglio1.Cells(r, 1) = "" And _
Foglio1.Cells(r, 2) = "" And _
Foglio1.Cells(r, 3) = "" Or r = 5000
'esegue il DO fino a che non trova le prime 3 celle vuote oppure quando r = 5000 (per evitare che vada in overflow)
End Sub
Private Sub cmdInserisci_Click()
Foglio1.Cells(r, 1) = txtData
Foglio1.Cells(r, 2) = cmbCategoria 'suppongo sia una combobox
Foglio1.Cells(r, 3) = txtSpesa
End Sub
Poi ho messo un pulsante direttamente nel foglio che funziona con questa macro
Sub inserisci()
UserForm1.Show
End Sub
Forse manca un pulsante nella userform che dia l'ok per inserire?
l'ho appena modificato il codice perchè mancava una cosa... ricontrolla ora ;) comunque si devi mettere un pulsante nella userform.
ti elenco tutti i controlli con i relativi nomi:
1 pulsante chiamato "cmdInserisci"
1 textbox chiamata "txtData"
1 combobox chiamata "cmbCategoria"
1 textbox chiamata "txtSpesa"
si in effetti hai ragione che è più veloce come dici tu... però io ho riscontrato problemi quando andavo a eliminare delle celle o delle righe... a volte venivano sovrascritte intere righe oppure ne venivano lasciate vuote alcune...
Ovviamente, quando si crea una UserForm, lo si fa anche per ridurre al minimo ( e proteggendo il Foglio, praticamente a zero ) l'accesso diretto dell'utente alle celle. Basta gestire da UserForm anche l'eliminazione di righe, tenere conto di quante vengono eliminate e decrementare indiceNuovaRiga... ;)
In ogni caso quel 65536 è un controllo che ho messo puramente a scopo d'esempio. Personalmente non gestirei mai 60'000 voci in una tabella Excel. A quel punto meglio appoggiarsi su una tabella Access...
El Tazar
05-08-2009, 14:39
Funziona :D
PErò...c'è un però. Quando clicco sull'ok i dati vengono inseriti,ma la finestra non va via,come faccio a farla andare via?
Ovviamente, quando si crea una UserForm, lo si fa anche per ridurre al minimo ( e proteggendo il Foglio, praticamente a zero ) l'accesso diretto dell'utente alle celle. Basta gestire da UserForm anche l'eliminazione di righe, tenere conto di quante vengono eliminate e decrementare indiceNuovaRiga... ;)
In ogni caso quel 65536 è un controllo che ho messo puramente a scopo d'esempio. Personalmente non gestirei mai 60'000 voci in una tabella Excel. A quel punto meglio appoggiarsi su una tabella Access...
si si senz'altro però lui mi sembra alle prime armi, se deve gestire anche l'eliminazione non finisce più :D magari più in là potrà implementarlo
Funziona :D
PErò...c'è un però. Quando clicco sull'ok i dati vengono inseriti,ma la finestra non va via,come faccio a farla andare via?
vuoi fare sparire la userform? basta che dopo l'inserimento nel foglio excel metti questo codice: me.hide questo lo fa semplicemente scomparire però...
se invece vuoi proprio chiudere lo userform devi scrivere sempre nello stesso punto di prima: unload me
alla fine dovresti avere una cosa del genere:
Private Sub cmdInserisci_Click()
foglio1.cells(r, 1) = txtData.text
foglio1.cells(r, 2) = cmbCategoria.value 'suppongo sia una combobox
foglio1.cells(r, 3) = txtSpesa.text
trova_riga_vuota 'ricontrolla tutte le righe ad ogni inserimento (l'ho aggiunto ora)
me.hide 'se vuoi semplicemente nasconderlo
unload me 'se vuoi proprio chiuderlo
End Sub
El Tazar
05-08-2009, 14:51
Perfetto,non so come ringraziarti :D
Se nella caella di spesa inserisco il valore in euro,dove cambio il formato?
Se lo cambio solo nella cella di excel mi esce il punto esclamativo quindi penso che debba essere configurato il formato nella textbox giusto?
Perfetto,non so come ringraziarti :D
Se nella caella di spesa inserisco il valore in euro,dove cambio il formato?
Se lo cambio solo nella cella di excel mi esce il punto esclamativo quindi penso che debba essere configurato il formato nella textbox giusto?
basta che metti questo:
Foglio1.Cells(r, 3) = Format(txtSpesa.text, "$ #,##0.00")
gli indici del foglio dovrebbero essere giusti ma controlla in ogni caso
EDIT: avevo sbagliato a scrivere la textbox
El Tazar
05-08-2009, 15:10
Funziona Grazie
P.S: Avevo corretto da solo txtSpesa :sofico:
Funziona Grazie
P.S: Avevo corretto da solo txtSpesa :sofico:
ah ok :D a tua disposizione se hai altri problemi ;) ciao!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.