La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Ho un listino dove in D ho il prezzo fornitore in F ho la quantità e in H ho le categorie
Ho una macro che mi dovrebbe in E calcolare il prezzo al dettaglio , ottenuto dal prezzo fornitore per la percentuale di ricarico.
La macro funziona tranne :
1-Quando la quantità è 0 nella cella non deve scrivere niente ed invece scrive 0,00;
2-Non riesco a mettere nella macro, categorie di 2 parole come Hard Disk o case(che sia un termine riservato in VBA?)
Grazie a chi vorrà aiutarmi
Sub Listino_EC()
Dim ALIMENTATORI, CPU, SSD As Long
Dim RP As Integer
RP = Range("H" & Rows.Count).End(xlUp).Row
ALIMENTATORI = 25
SSD = 30
CPU = 20
Col = 5
For I = 1 To RP
If UCase(Range("H" & I).Value) = "CPU" Then
Cells(I, Col).Value = Range("D" & I).Value * (1 + (CPU / 100))
GoTo salta
End If
If UCase(Range("H" & I).Value) = "SSD" Then
Cells(I, Col).Value = Range("D" & I).Value * (1 + (SSD / 100))
GoTo salta
End If
If UCase(Range("H" & I).Value) = "ALIMENTATORI" Then
Cells(I, Col).Value = Range("D" & I).Value * (1 + (ALIMENTATORI / 100))
GoTo salta
End If
salta:
Next I
End Sub
Buongiorno e buona domenica
Inizio con alcune precisazioni.
Perchè alleghi un file .xlsx invece di un .xlsm? Quali sono le prove che hai fatto e che errori, eventuali, ti danno.
Quando si dichiarano le variabili DEVE essere indicato a fianco di CIASCUNA il tipo. Come hai scritto la prima riga di codice (Dim ALIMENTATORI, CPU, SSD As Long) solo l'ultima è una variabile Long, le precedenti sono Variant.
Le variabili che si riferiscono a righe e colonne vanno dichiarate Long e non Integer (pensa se il tuo Foglio supera le 32500 righe).
Non capisco la riga di codice Goto salta. Non sarebbe più semplice creare un ciclo If ... Else ... End If?
Ciao,
Mario
ho allegato il file nel formato .xlsm. La macro funziona, con eccezione:
1-Ho categorie con 2 parole (Hard Disk) e mi da errore se le dichiaro
2- Ho una categoria Case che essendo una parola riservata di visual basic non viene accettata
Ciao
Prova (sempre su una copia del file, mai sull'originale) la seguente macro (da sostituire alla tua)
Option Explicit Sub Calcola() 'calcola prezzo di vendita Dim RP As Long, i As Long Dim mCPU As Double, mSSD As Double, mALI As Double Dim mHD As Double, mCS As Double '<<<<<< aggiungere mCPU = 20 mSSD = 30 mALI = 35 mHD = 10 '<<<<<<<< da modificare ammontare mCS = 5 '<<<<<<<< da modificare ammontare RP = Range("H" & Rows.Count).End(xlUp).Row Range("E2:E" & RP).ClearContents For i = 2 To RP If Cells(i, 4) <> "" Then If UCase(Range("H" & i).Value) = "CPU" Then Cells(i, 5) = Range("D" & i) * (1.22 * (1 + (mCPU / 100))) ElseIf UCase(Range("H" & i)) = "SSD" Then Cells(i, 5) = Range("D" & i) * (1 + (mSSD / 100)) ElseIf UCase(Range("H" & i)) = "ALIMENTATORI" Then Cells(i, 5) = Range("D" & i) * (1 + (mALI / 100)) ElseIf UCase(Range("H" & i)) = "CASE" Then Cells(i, 5) = Range("D" & i) * (1 + (mCS / 100)) ElseIf UCase(Range("H" & i)) = "HARD DISK" Then Cells(i, 5) = Range("D" & i) * (1 + (mHD / 100)) End If End If Next i End Sub
Fai sapere. Ciao,
Mario
ciao
trasforma le due parole in HD e Cabinet
poi prova nella tua macro
io ho usato
Option Compare Text Public Sub sostituisci() Dim ALIMENTATORI As Long Dim CPU As Long Dim SSD As Long Dim Cabinet As Long Dim HD As Long ALIMENTATORI = 25 Cabinet = 50 SSD = 30 CPU = 20 HD = 20 Dim Lista As Range Set Lista = Range(Cells(1, 8), Cells(1, 8).End(xlDown)) For Each CL In Lista If CL.Offset(0, -4) = "" Then CL.Offset(0, -3) = "" ElseIf CL = "HD" Then CL.Offset(0, -3) = CL.Offset(0, -4) * (1 + (HD / 100)) ElseIf CL = "SSD" Then CL.Offset(0, -3) = CL.Offset(0, -4) * (1.22 * (1 + (SSD / 100))) ElseIf CL = "Cabinet" Then CL.Offset(0, -3) = CL.Offset(0, -4) * (1 + (Cabinet / 100)) ElseIf CL = "Alimentatori" Then CL.Offset(0, -3) = CL.Offset(0, -4) * (1.22 * (1 + (ALIMENTATORI / 100))) ElseIf CL = "CPU" Then CL.Offset(0, -3) = CL.Offset(0, -4) * (1 + (CPU / 100)) End If Next End Sub
chiaro che i dati sono inventati
onestamente visto che sono dei fissi io non userei tutte le dichiarazioni
ma mettrei il numero direttamente sul codice
esempio
ElseIf CL = "CPU" Then
CL.Offset(0, -3) = CL.Offset(0, -4) * (1 + (20 / 100))
ciao
marius
l'ho vista dopo che ho risposto
visto che non arrivavi ho provato a invadere il tuo campo 😀
il risultato è quello che è ma funziona 😏
Ciao
Nessuna "invasione" (ci mancherebbe. E poi, come dice un amico su altro Forum, due risposte sono sempre meglio di una - anche se in questo caso le "due" sono molto simili).
Dopo aver dato, all'inizio, dei suggerimenti circa la dichiarazione di variabili ho tirato giù quattro righe di codice RIFERENDOMI a quanto proposto.
Certo che si può migliorare la macro per esempio mettendo le percentuali di incremento del costo in una o più celle del Foglio e poi fare riferimento a dette celle per i calcoli, Se hai da variare la percentuale non intervieni sul codice ma solo sulla cella interessata.
Ciao,
Mario
già già
due è meglio che una eh!
Voglio sperare che non ti riferisci a quello che penso!!!!
Sarebbe come girare il coltello nella piaga 🤣 🤣 🤣
Ciao,
Mario
risposte Marius risposte 😀
Perfetto, funziona egregiamente.
Grazie
Ciao
Grazie per il riscontro ma mi piacerebbe sentirti ancora per capire se hai accettato i suggerimenti di @gianfranco e miei circa il miglioramento del codice.
Visto che hai, da quello che ho visto, una buona conoscenza di VBA un approfondimento non guasterebbe per incrementare le tue conoscenze.
Vedi un po' tu. Ciao,
Mario
@marius44 Ho utilizzato quella tua, quella di @gianfranco l'ho vista dopo, ma ormai avevo risolto
ciao
mi stavo chiedendo
D è frutto di una formula perciò non è intecettabile
ma C è scritto a mano?
perchè si potrebbe legare la macro al change del C
senza lanciarla a mano ogni volta
pura curiosità
Ciao
Mi spiace ma, vista la mancanza di risposte alla mia ultima proposta, ho eliminato il file anche dal cestino.
Penso possa farsi. Ciao,
Mario