PDA

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

bio n3t
04-08-2009, 18:31
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?

bio n3t
04-08-2009, 19:49
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:

bio n3t
05-08-2009, 00: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:

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

MarcoGG
05-08-2009, 13:57
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

;)

bio n3t
05-08-2009, 14:27
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?

bio n3t
05-08-2009, 14:34
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"

MarcoGG
05-08-2009, 14:36
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?

bio n3t
05-08-2009, 14:47
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?

bio n3t
05-08-2009, 14:59
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:

bio n3t
05-08-2009, 15:12
Funziona Grazie

P.S: Avevo corretto da solo txtSpesa :sofico:

ah ok :D a tua disposizione se hai altri problemi ;) ciao!