| | Post: 203 | Registrato il: 03/09/2018
| Città: GROTTAGLIE | Età: 25 | Utente Junior | Microsoft Office Professional Plus 2019 64 bit | | OFFLINE | |
|
24/02/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
[Modificato da Melissa2018 24/02/2024 19:24] |
|
| | Post: 7.548 | Registrato il: 14/11/2004
| Utente Master | Office 2019 | | OFFLINE |
|
25/02/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 se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui |
| | Post: 3.751 | Registrato il: 06/04/2013
| Utente Master | 2010 | | OFFLINE |
|
25/02/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 [Modificato da dodo47 25/02/2024 13:21] Domenico
Win 10 - Excel 2016 |
| | Post: 203 | Registrato il: 03/09/2018
| Città: GROTTAGLIE | Età: 25 | Utente Junior | Microsoft Office Professional Plus 2019 64 bit | | OFFLINE | |
|
25/02/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
|
| | Post: 3.753 | Registrato il: 06/04/2013
| Utente Master | 2010 | | OFFLINE |
|
26/02/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
Domenico
Win 10 - Excel 2016 |
| | Post: 204 | Registrato il: 03/09/2018
| Città: GROTTAGLIE | Età: 25 | Utente Junior | Microsoft Office Professional Plus 2019 64 bit | | OFFLINE | |
|
26/02/2024 12:18 | |
Buongiorno Domenico e grazie mille!🎁
Quando ti leggo imparo sempre tantissime cose, sei davvero una preziosissima fonte di conoscenza. 🙇♀️ |
|
|