View Full Version : VBA + Excel Inserimento riga e dati da inputbox
diamante.picci
08-07-2015, 10:34
Ciao a tutti ragazzi dovrei realizzare un file excel dove l'utente che inserirà i dati dovrà avere a disposizione un command button da cui partire.
Una volta cliccato sul tasto il codice dovrebbe ricercare l'ultima riga occupata e da li inserirne una nuova alla quale assegnare in 3 celle diverse (xA, xB, xC - la x è il numero di riga vuota trovata in precedenza) i dati che l'utente inserirà tramite inputbox.
L'input box dovrà accettare i seguenti dati: in A un codice interno, in B un codice fornitore, in C il prezzo di acquisto dell'articolo.
Un quarto inputbox invece dovrà richiedere la percentuale di ricarica desiderata.
Quest'ultimo dato dovrà essere solo di appoggio in quanto necessario al calcolo di un prezzo di listino (dato da prezzo di acquisto + la percentuale immessa con un arrotondamento ad 1 cifra).
La percentuale reale sarà calcolata in automatico tramite formule partendo dal prezzo di listino meno la percentuale di sconto (cosa che già viene effettuata tramite formule)
Quello che mi serve quindi è il codice VBA da poter assegnare al command button. Sono riuscito ad implementare gli inputbox ma non riesco a trovare una funzione che ricerchi una riga vuota ed assegni il focus.
Spero di essere stato chiaro, in caso contrario cercherò di spiegarmi meglio. Grazie a tutti
edit: dimenticavo, il command button posizionato a qualche riga sotto dovrà scendere automaticamente ogni volta che si inseriscono le righe.
secondo me fai prima a gestire tutta la fase di inserimento da un form con le caselle di testo per i 3 dati che ti servono
per la ricerca guarda cicla usando il comando range
diamante.picci
10-07-2015, 10:16
secondo me fai prima a gestire tutta la fase di inserimento da un form con le caselle di testo per i 3 dati che ti servono
per la ricerca guarda cicla usando il comando range
Ciao Fazz e grazie della risposta. Diciamo che tentando sono riuscito a trovare i vari comandi che mi servivano.
Scrivo il codice qui così se qualche volenteroso vuole analizzarlo ed eventualmente correggerlo:
Private Sub Inserisci_Click()
Dim codice_interno
Dim codice_fornitore
Dim prezzo
Dim percentuale
Dim listino
Dim minimo
Riga = Cells(Rows.Count, 1).End(xlUp).Row
Cells(Riga, 1).Select
Rows(Riga).EntireRow.Copy
ActiveCell.EntireRow.Insert
codice_interno = InputBox("Inserisci il codice interno dell'articolo", "Inserisci Articolo")
If Trim(codice_interno <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
ActiveCell.Value = codice_interno
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il codice", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
codice_fornitore = InputBox("Inserisci il codice fornitore dell'articolo", "Inserisci Articolo")
If Trim(codice_fornitore <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 1).Value = codice_fornitore 'allora copia il testo
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il codice", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
prezzo = InputBox("Inserisci il prezzo di acquisto", "Inserisci Prezzo")
If Trim(prezzo <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 2).Value = prezzo 'allora copia il testo
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il prezzo", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
percentuale = InputBox("Inserisci la percentuale di ricarica minima dell'ultima scontistica", "Inserisci Percentuale")
If Trim(percentuale <> "") Then
MsgBox "Prodotto inserito correttamente", vbOKOnly 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente la percentuale", vbCritical, "Inserisci Percentuale" ' Avviso di dato inesistente
End If
minimo = (prezzo * percentuale / 100) + prezzo
listino = minimo * 2.8
Selection.Offset(0, 15).Value = listino
End Sub
In breve spiego cosa fa questa funzione: prima di tutto trova l'ultima riga con i dati, duplica quella riga (per non perdere i dati) e nella successiva va ad inserire i 3 dati richiesti all'utente; infine chiede che percentuale di ricarica vuole praticare sull'ultima scontistica (questo è un dato indicativo, in quanto la percentuale reale sarà calcolata dal prezzo di listino il quale viene arrotondato per semplicità).
L'unico problema che riscontro è che la funzione va in loop, dato che una volta terminato l'inserimento devo forzare la chiusura. Inoltre se all'inserimento non inserisco nessun dato viene visualizzato l'avviso ma mi fa andare avanti, mentre vorrei che l'utente fosse obbligato ad inserire quel determinato dato.
Infine volevo chiedere un'altra cosa più matematica che di programmazione. Avendo il prezzo di acquisto e volendo calcolare un ricarico ad esempio del 30% sull'ultima scontistica, come faccio a sviluppare un prezzo di listino considerando che lo sconto massimo è del 50% + 20% dal prezzo di listino? Io ho calcolato per 2.8 ma non credo sia la formula esatta.
Grazie
il loop è causato da questo
If Trim(codice_fornitore <> "") Then '
perchè un controllo del tipo
if codice_fornitore = false
dovrebbe essere sufficiente, ma in questo caso codice_fornitore è un variant con type boolean
ma perchè non fai cosi?
TestVal = Application.InputBox("codice fornitore", "Cancel Test")
If TestVal = False Then..
è più veloce
diamante.picci
17-07-2015, 23:31
il loop è causato da questo
If Trim(codice_fornitore <> "") Then '
perchè un controllo del tipo
if codice_fornitore = false
dovrebbe essere sufficiente, ma in questo caso codice_fornitore è un variant con type boolean
ma perchè non fai cosi?
TestVal = Application.InputBox("codice fornitore", "Cancel Test")
If TestVal = False Then..
è più veloce
Grazie, alla fine ho risolto un po' per tutte le mie richieste. Ora la funzione ricerca l'ultima riga occupata, la copia e la duplica. Dopo questo sulla riga copiata vengono inseriti i dati che immette l'utente tramite msgbox.
Ora non va più in loop, credo che c'era un'istruzione sbagliata.
Se c'è qualcuno che ha bisogno del codice, eccolo:
Sub Pulsante8_Clic()
Dim codice_interno
Dim codice_fornitore
Dim prezzo
Dim percentuale
Dim listino
Dim minimo
If Range("A6").Value = "" Then
Range("A6").Select
codice_interno = InputBox("Inserisci il codice interno dell'articolo", "Inserisci Articolo")
If Trim(codice_interno <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
ActiveCell.Value = codice_interno
Else
End Sub
End If
codice_fornitore = InputBox("Inserisci il codice dell'articolo", "Inserisci Articolo")
If Trim(codice_fornitore <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 1).Value = codice_fornitore 'allora copia il testo
Else
End Sub
End If
prezzo = InputBox("Inserisci il prezzo di acquisto", "Inserisci Prezzo")
If Trim(prezzo <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 2).Value = prezzo 'allora copia il testo
Else
End Sub
End If
percentuale = InputBox("Inserisci la percentuale di ricarica minima dell'ultima scontistica 50% + 20% + 10%", "Inserisci Percentuale")
If Trim(percentuale <> "") Then
MsgBox "Prodotto inserito correttamente", vbOKOnly 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente la percentuale", vbCritical, "Inserisci Percentuale" ' Avviso di dato inesistente
End If
Selection.Offset(0, 15).Value = percentuale / 100
Selection.Offset(0, 16).FormulaR1C1 = "=(RC[-14]*RC[-1]+RC[-14])*2.8"
Else
Riga = Cells(Rows.Count, 1).End(xlUp).Row
Cells(Riga, 1).Select
Rows(Riga).EntireRow.Copy
ActiveCell.EntireRow.Insert
codice_interno = InputBox("Inserisci il codice interno dell'articolo", "Inserisci Articolo")
If Trim(codice_interno <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
ActiveCell.Value = codice_interno
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il codice", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
codice_fornitore = InputBox("Inserisci il codice fornitore dell'articolo", "Inserisci Articolo")
If Trim(codice_fornitore <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 1).Value = codice_fornitore 'allora copia il testo
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il codice", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
prezzo = InputBox("Inserisci il prezzo di acquisto", "Inserisci Prezzo")
If Trim(prezzo <> "") Then 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Selection.Offset(0, 2).Value = prezzo 'allora copia il testo
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente il prezzo", vbCritical, "Inserisci Articolo" ' Avviso di dato inesistente
End If
percentuale = InputBox("Inserisci la percentuale di ricarica minima dell'ultima scontistica 50% + 20% + 10%", "Inserisci Percentuale")
If Trim(percentuale <> "") Then
MsgBox "Prodotto inserito correttamente", vbOKOnly 'se l'inputbox è diverso da vuoto, con trim sei sicuro che il testo e'vuoto
Else
MsgBox " Attenzione casella Vuota! Inserire correttamente la percentuale", vbCritical, "Inserisci Percentuale" ' Avviso di dato inesistente
End If
Selection.Offset(0, 15).Value = percentuale / 100
Selection.Offset(0, 16).FormulaR1C1 = "=(RC[-14]*RC[-1]+RC[-14])*2.8"
End If
Application.CutCopyMode = False
End Sub
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.