Melissa2018
00sabato 24 febbraio 2024 19:16
Buonasera a tutto il forum!
In allegato, un file esempio dove in base a come variano i parametri F2, G2, H2 e I2 ottengo dei risultati nelle celle K2, L2 e M2.
Questi risultati li ho ottenuti percorrendo due vie:
quella delle formule (foglio "CON FORMULE");
quella del VBA (foglio "CON VBA").
A me interessa capire come percorrere la strada del VBA ma senza dover realizzare colonne di supporto I, K, L e M come per il codice che ho scritto.
Io e gli array, nonostante me li abbia fatti conoscere Domenico tempo fa, non andiamo ancora d'accordo. 😭
Avrei bisogno di qualche altro esempio...
Grazie
by sal
00domenica 25 febbraio 2024 08:24
Cieo Melissa in effetti tu vorresti eliminare le colonne I-K-M-L ma vorresti solamente i risultati "K2:L2", la prima cosa potresti anche tenerle le colonne ma dislocate in un altra posizione ad esempio incominciando da "AA".
Ciao By Sal (8-D
dodo47
10domenica 25 febbraio 2024 11:47
Thò...chi si sente!!! Come stai??
Una tiratina d'orecchie per l'indentatura del tuo codice!!!😁😂
Questo il codice da testare......Fossi in te cambierei il nome alla sub; excel in alcuni casi non apprezza l'uso di parole riservate alla programmazione
un caro saluto...byby
Sub VBA()
Dim I As Integer, K As Integer, ArrIKLM() As Double, arrAppo() As Double
Dim lr As Long, Idx As Integer, T As Double, T1 As Double, mMax As Double
Range("K2:M2").ClearContents
Range("I6:I39").ClearContents
Range("K6:M39").ClearContents
lr = Range("B" & Rows.Count).End(xlUp).Row
ReDim ArrIKLM(1 To lr - 5, 1 To 4) 'colonna I-K-L-M
ReDim arrAppo(1 To 1) ' serve per simulare dati formula colonna L
Idx = 1
For I = 6 To lr
If Cells(I, 3) >= Cells(2, 7) And Application.WorksheetFunction.Sum(Range(Cells(I, 3), Cells(I, 6))) <= Cells(2, 8) Then
If Cells(I, 6) - Cells(I, 4) <= Cells(2, 9) Then
ArrIKLM(Idx, 1) = Cells(I, 2)
Else
ArrIKLM(Idx, 1) = 0
End If
End If
If ArrIKLM(Idx, 1) = 1 Then
ArrIKLM(Idx, 2) = Cells(2, 6) * (Cells(I, 10) - 1)
ElseIf ArrIKLM(Idx, 1) = 0 Then 'Cells(I, 9) = 0 Then
ArrIKLM(Idx, 2) = -Cells(2, 6)
End If
T = T + ArrIKLM(Idx, 2)
ArrIKLM(Idx, 3) = T
If I = 6 Then
ArrIKLM(Idx, 4) = 0
arrAppo(Idx) = ArrIKLM(Idx, 3)
Else
If mMax - ArrIKLM(Idx, 3) < 0 Then
ArrIKLM(Idx, 4) = 0
arrAppo(Idx) = ArrIKLM(Idx, 3)
Else
ArrIKLM(Idx, 4) = mMax - ArrIKLM(Idx, 3)
arrAppo(Idx) = ArrIKLM(Idx, 3)
End If
End If
Idx = Idx + 1
mMax = Application.WorksheetFunction.Max(arrAppo())
ReDim Preserve arrAppo(1 To Idx)
Next I
'Range("W6").Resize(UBound(ArrIKLM), 4) = ArrIKLM se togli l'apice verrà stampato da W in poi l'array contenente i valori delle tue IKLM ormai soppresse
With Application.WorksheetFunction
Cells(2, 11) = .Sum(.Index(ArrIKLM, 0, 2))
Cells(2, 12) = .Max(.Index(ArrIKLM, 0, 4))
Cells(2, 13) = Cells(2, 11) / Cells(2, 12)
End With
End Sub
Melissa2018
00domenica 25 febbraio 2024 21:06
Buonasera ragazzi!
Ciao Salvatore, in realtà volevo proprio non averle quelle colonne. Non per questione di "estetica" ma perché, siccome analizzo tantissimi dati,
queste me lo appesantiscono troppo oltre che farmi perdere molto tempo sia nell'attesa del calcolo automatico delle formule che per l'esecuzione del codice.
Caro Domenico, sull'indentazione hai proprio ragione, scusa!!! Aiuta moltissimo a leggere i codici, soprattutto quelli scritti da altri.
Purtroppo a volte, oltre che per pigrizia, copio ed incollo parti di codici e dimentico di sistemare tutto (sempre che abbia compreso davvero le regole dell'indentazione 😜). Scoprii però che ci sono anche add-in che possono farlo al posto mio
Circa l'uso delle parole riservate alla programmazione lo avevo notato perché mi era capitato in passato. Dovrò farci in futuro più attenzione.
Ti ringrazio per il tuo sempre preziosissimo contributo risolutore, sei il solito fenomeno! Il tuo codice ovviamente è perfetto, da studiare per carpire quelle chicche da custodire! Grazie!!!
Sai, in queste ore sono proprio entrata in fissa sugli array e ci ho sbattuto la testa, sebbene molto ancora non mi sia chiaro, sono riuscita a confezionare un codice (rozzo) grazie a cui realizzare ciò che volevo.💪
Te lo metto in allegato, se hai tempo, fammi sapere che ne pensi
dodo47
10lunedì 26 febbraio 2024 10:06
ciao
che dire....benissimo.
Tra l'altro è più conciso ovviamente perchè tu conosci il sottostante.
Inoltre hai fatto bene ad utilizzare array diversi, mentre io ne ho utilizzato solo 1 + 1 d'appoggio.
Piccola informazione: sei stata fortunata!!
Con questa riga:
Dim FATTORE(6 To 39), PUNTATA(6 To 39), sumpunt(6 To 39), dd(6 To 39) As Double
tu credi di aver dichiarato i 4 Array tutti Double....MA non è così. Solo l'ultimo è Double, i primi tre sono variant in quanto le variabili vanno dichiarate una per una.
E, come dicevo, sei stata fortunata perchè se li dichiari tutti double, il codice ti avrebbe creato problemi sia di tipo non corrispondente, sia soprattutto di calcoli.
Se il tuo sumpunt() fosse stato double avresti penato un bel po' a trovare il max, in quanto excel lo avrebbe inizialmente riempito di zeri e poichè ci vanno a finire numeri negativi, capisci bene che il max tra zero ed un numero negativo è zero.
Questo il motivo per il quale sono ricorso al mio arrAppo() che alimento di volta in volta.
Se hai dubbi...siamo qui
cari saluti e ancora complimenti
Melissa2018
00lunedì 26 febbraio 2024 12:18
Buongiorno Domenico e grazie mille!🎁
Quando ti leggo imparo sempre tantissime cose, sei davvero una preziosissima fonte di conoscenza. 🙇♀️