Calcoli senza colonne di supporto,

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
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. 🙇‍♀️
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 12:38.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com