Macro VBA per aggio...
 
Notifiche
Cancella tutti

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.

[Risolto] Macro VBA per aggiornare listino Excel

22 Post
3 Utenti
0 Reactions
575 Visualizzazioni
Forum 1
(@guidob)
Post: 0
New Member
Avviatore di Topic
 

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

Versione di Excel
Sistema operativo
 
Postato : 17/06/2023 20:23
Etichette discussione
Marius44
(@marius44)
Post: 0
Moderatore
 

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

 
Postato : 18/06/2023 06:01
Forum 1
(@guidob)
Post: 0
New Member
Avviatore di Topic
 

@marius44

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

 
Postato : 18/06/2023 07:37
Marius44
(@marius44)
Post: 0
Moderatore
 

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

 
Postato : 18/06/2023 16:58
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

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))

 
Postato : 18/06/2023 17:06
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

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 😏 

 
Postato : 18/06/2023 17:17
Marius44
(@marius44)
Post: 0
Moderatore
 

Ciao

@gianfranco55

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

Questo post è stato modificato 2 anni fa da Marius44
 
Postato : 18/06/2023 17:25
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

già già

due è meglio che una eh!

 
Postato : 18/06/2023 17:30
Marius44
(@marius44)
Post: 0
Moderatore
 

Voglio sperare che non ti riferisci a quello che penso!!!!

Sarebbe come girare il coltello nella piaga 🤣 🤣 🤣 

Ciao,

Mario

 
Postato : 18/06/2023 17:36
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

risposte Marius risposte 😀 

 
Postato : 18/06/2023 18:03
Forum 1
(@guidob)
Post: 0
New Member
Avviatore di Topic
 

Perfetto, funziona egregiamente.

Grazie

 
Postato : 18/06/2023 18:06
Marius44
(@marius44)
Post: 0
Moderatore
 

Ciao

@Guidob

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 

 
Postato : 19/06/2023 07:32
Forum 1
(@guidob)
Post: 0
New Member
Avviatore di Topic
 

@marius44 Ho utilizzato quella tua,  quella di @gianfranco  l'ho vista dopo, ma ormai avevo risolto

 
Postato : 19/06/2023 12:26
gianfranco55
(@gianfranco55)
Post: 1797
Moderatore
 

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à

 
Postato : 19/06/2023 13:55
Marius44
(@marius44)
Post: 0
Moderatore
 

Ciao

@gianfranco55

Mi spiace ma, vista la mancanza di risposte alla mia ultima proposta, ho eliminato il file anche dal cestino.

Penso possa farsi. Ciao,

Mario

 
Postato : 19/06/2023 14:30
Pagina 1 / 2
Condividi:
My Agile Privacy
Questo sito utilizza cookie tecnici e di profilazione. Cliccando su accetta si autorizzano tutti i cookie di profilazione. Cliccando su rifiuta o la X si rifiutano tutti i cookie di profilazione. Cliccando su personalizza è possibile selezionare quali cookie di profilazione attivare.
Attenzione: alcune funzionalità di questa pagina potrebbero essere bloccate a seguito delle tue scelte privacy
     Scarica il nostro ebook gratuito     

Unisciti a oltre 35.000 professionisti
che hanno già scelto di semplificare il proprio lavoro
e aumentare la produttività con la nostra newsletter!

Scarica l’ebook con i
migliori trucchi e suggerimenti per Excel
selezionati per te da Excel Academy

Download