Stellar Blade Un'esclusiva PS5 che sta facendo discutere per l'eccessiva bellezza della protagonista. Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Come evitare di utilizzare una colonna di supporto in questo esempio (VBA)

Ultimo Aggiornamento: 27/04/2023 08:47
Post: 179
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
08/04/2023 20:34

Salve a tutto il forum, scusate se nel titolo non ho saputo come sintetizzare l'argomento della mia domanda.
Ho realizzato un piccolissimo esempio la cui risoluzione potrà permettermi di scrivere codici per operazioni più complesse su molti più dati.
Nell'esempio, sono indicate delle giornate e gli incassi realizzati dai due lavoratori di giornata.
Se la somma degli incassi dei due operatori supera i 500 euro allora nella colonna F ci sarà un 1 altrimenti uno 0.
Nella cella B2 ci sarà la somma di questi 1.

Nel CASOA ho risolto con delle semplici formule.

Nel CASOB ho risolto con un banale codice (pulsante CASOB) che utilizza una colonna di supporto (colonna M).

Ecco, io vorrei che la somma degli 1 fosse calcolata dal codice in memoria senza impegnare celle. Lo chiedo perché quando
i dati sono tantissimi il tempo d'attesa a causa della creazione della colonna di supporto può essere molto.
Nel CASOC ho provato a scrivere un codice non ho saputo completarlo.
Grazie e buona Pasqua per domani
[Modificato da Melissa2018 08/04/2023 21:32]
Post: 531
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
08/04/2023 21:44

ciao
non so usare il VBA
per caso la MacroC potrebbe essere modificata così ?

VB
Sub CASOC()
Dim i As Long, somma As Long
Dim box(6 To 16) As Integer
For i = 6 To 16
If Cells(i, 17) + Cells(i, 19) > Cells(2, 15) Then
   box(i) = 1
   somma = somma + 1
Else
   box(i) = 0
End If
Next i
Cells(2, 16) = somma
End Sub


Leo
[Modificato da L2018 09/04/2023 00:33]

LEO
https://t.me/LordBrum
Post: 532
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
08/04/2023 21:52

anzi così

VB
Sub CASOC()
Dim i As Long, somma As Long
Dim box(6 To 16) As Integer
For i = 6 To 16
If Cells(i, 17) + Cells(i, 19) > Cells(2, 15) Then
   somma = somma + 1
End If
Next i
Cells(2, 16) = somma
End Sub


Leo

LEO
https://t.me/LordBrum
Post: 533
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
08/04/2023 22:10

e tutto il codice di macroB e macroC potrebbe essere

VB
Sub CASOB()
Range("P2").ClearContents
Dim i As Long, somma As Long
somma = 0
For i = 6 To 16
If Cells(i, 10) + Cells(i, 12) >= Cells(2, 8) Then somma = somma + 1
Next i
Cells(2, 9) = somma
End Sub
--------------------------
Sub CASOC()
Dim i As Long, somma As Long
Dim box(6 To 16) As Integer
For i = 6 To 16
If Cells(i, 17) + Cells(i, 19) > Cells(2, 15) Then somma = somma + 1
Next i
Cells(2, 16) = somma
End Sub



ho provato e funziona

Leo

LEO
https://t.me/LordBrum
Post: 179
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
08/04/2023 23:00

Ciao Leo, innanzitutto, sei gentilissimo ad avermi risposto. Il tuo suggerimento è ovviamente corretto, estremamente intuitivo e semplice.
Però, ho compreso di non aver proposto l'esempio più adatto per spiegare quale è il mio problema.
Proverò a rifletterci sopra.
Mille grazie!
Buonanotte
Post: 2.923
Registrato il: 10/10/2013
Città: VICENZA
Età: 69
Utente Veteran
365
OFFLINE
08/04/2023 23:49

ciao
vale per tutte le tabelle
cambiando le matrici

=MATR.SOMMA.PRODOTTO(--((($C$6:$C$1000)+($E$6:$E$1000))>=A$2))

se scrivi in B2
=MATR.SOMMA.PRODOTTO(--(((C$6:C$1000)+(E$6:E$1000))>=A$2))
poi conferma con invio.

copia la cella B2
e incollala in I2 e in P2

si adeguano le colonne
[Modificato da federico460 08/04/2023 23:50]
Post: 534
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
09/04/2023 00:10


ciao Federico, Buona Pasqua
come al solito hai brillantemente risolto con un'ottima formula, quindi immaginiamo che l'OP abbia optato per il VBA, che tornava più abbordabile di una formula misteriosa ?

Leo
P.S.
da quando ho postato le macro aggiustate ...ogni volta che apro questo thread ricevo dal browser un avviso di errore

Javascript.....
Syntax Highlight
Can't find brush for: VB

che ho combinato ? tu vedi normale ?

Leo
[Modificato da L2018 09/04/2023 00:53]

LEO
https://t.me/LordBrum
Post: 2.925
Registrato il: 10/10/2013
Città: VICENZA
Età: 69
Utente Veteran
365
OFFLINE
09/04/2023 00:18

ciao
Javascript.....
Syntax Highlight
Can't find brush for: VB

che ho combinato ? tu vedi normale ?

anche da me rompono con l'avviso


come al solito hai brillantemente risolto con un'ottima formula, quindi immaginiamo che l'OP abbia optato per il VBA, che tornava più abbordabile di una formula misteriosa

non lo so
se abbia scelto il vba
o la formula che non è misteriosa ma di una semplicità estrema
ti allego le istruzioni base che ho fatto per degli amici

io ho solo corretto la somma eliminando la colonna d'appoggio

chiaro che se ha 100000 righe
di dato opterà per la macro
[Modificato da federico460 09/04/2023 08:51]
Post: 535
Registrato il: 02/04/2018
Città: PESCARA
Età: 75
Utente Senior
EXCEL 2016 - SPREAD32
OFFLINE
09/04/2023 00:26

aspè, non ho capito bene, se tu apri questo thread di melissa ti compare quell'avviso ?
se non ti compare devo fare io qualche controllo, se ti compare hai idea di che si tratta ?

quanro al pdf, ho scaricato e poi studio

infine la tua formula del tizio delle ore straordinarie è stratosferica
ma come ci pensi ? pensate ? c' è un tool che per caso aiuta a costruire le formule ?
cavolo.

sono riuscito a rimediare all'errore di visualizzazione appena in tempo

Leo
[Modificato da L2018 09/04/2023 00:36]

LEO
https://t.me/LordBrum
Post: 2.926
Registrato il: 10/10/2013
Città: VICENZA
Età: 69
Utente Veteran
365
OFFLINE
09/04/2023 00:47

ciao
ora non mi si è aperto l'avviso
ma prima si apriva.
per la formula delle ore notturne
è un pelino ostica vero
usare la MEDIANA non è così immediato.
nessun tool che ti insegni
solo tanto forum e pazienza per capirne il funzionamento
Post: 180
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
10/04/2023 10:23

Buongiorno, grazie Federico e Leo per essere intervenuti nella mia discussione.
Post: 181
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
16/04/2023 18:23

Buon pomeriggio, ho creato un esempio che meglio si adatta a ciò che volevo rappresentare.
Marco e Luca sono due addetti alle vendite, ciascuno ogni giorno nel negozio realizza vendite pari ai valori che leggerete nelle colonne A e B.
Nella colonna D il numero di persone che entra nel negozio nella giornata in cui si realizzano quegli incassi.

Se indichiamo con un numero 1 la giornata in cui la somma degli incassi realizzati dai due commessi supera il valore scritto nella cella A9 e con lo 0 le altre, il problema consiste nel riempire le celle B8 e B6:F6 senza utilizzare, se è possibile (è ciò che vorrei riuscire a realizzare), colonne di supporto.

Nella cella B6 ci sarà il numero totale degli 1 (che vorrei non dover scrivere)
Nella cella B8 la media delle persone entrate nei giorni 1.
Nella cella C6 quante volte si è dovuto aspettare 2 giorni che si realizzasse un 1.
Nella cella D6 quante volte si è dovuto aspettare 3 giorni che si realizzasse un 1.
Nella cella E6 quante volte si è dovuto aspettare 4 giorni che si realizzasse un 1.
Nella cella F6 quante volte si è dovuto aspettare 5 giorni che si realizzasse un 1.

Nel caso A ho risolto il problema con sole formule (utilizzando colonne di supporto C, E, F)
Nel caso B ho scritto un codice VBA che lo risolvesse (colonne di supporto K, M, N)

A me interessa realizzare un CASO C, cioè capire esclusivamente come scrivere un codice VBA (no formule) che riempia le celle S6:W6 e S8 senza colonne di supporto.
Grazie per il vostro supporto.

Post: 3.474
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
22/04/2023 19:10

ciao
ho spostato nelle prime colonne il tuo CASO C, pertanto le prime 3 colonne conterranno di dati di Luca, Marco, Num. Persone.

Sulla destra ho copiato il risultato da te indicato per il confronto.

Solo se ti serve, c'è una riga commentata, questa:
' Cells(k + 10, 7) = Giorni + 1 ' se togli commento, in col. G vengono stampati i giorni
Se togli il commento, come scritto, in col. G vengono stampati i giorni

Variando:
Distanza = Application.WorksheetFunction.Transpose(Range("C5:F6"))
potrai modificare il numero ed il valore delle distanze

Fai sapere se necessiti di spiegazioni o altro.

saluti

Sub test_Caso_c()
Dim wk As Worksheet, lr As Long, Parametro As Double, mArr() As Variant
Dim j As Long, k As Long, k1 As Long, Giorni As Integer
Dim NumPers_1 As Long, Distanza() As Variant
Set wk = Worksheets("Foglio1")
lr = wk.Range("A" & Rows.Count).End(xlUp).Row
Parametro = Range("A9")
ReDim mArr(1 To lr - 10, 1 To 5) ' array dati

' array Distanze
Distanza = Application.WorksheetFunction.Transpose(Range("C5:F6")) '<< variare secondo dati di riga 5
For I = 1 To UBound(Distanza)
    Distanza(I, 2) = 0
Next

'alimenta array dati
For j = 11 To lr
    mArr(j - 10, 1) = Cells(j, 1) 'LUCA
    mArr(j - 10, 2) = Cells(j, 2) 'MARCO
    mArr(j - 10, 4) = Cells(j, 3) 'N.PERSONE
    If mArr(j - 10, 1) + mArr(j - 10, 2) > Parametro Then 'SOMMA
        mArr(j - 10, 3) = 1
        NumPers_1 = NumPers_1 + mArr(j - 10, 4) ' somma persone con 1
    Else
        mArr(j - 10, 3) = 0
    End If
Next j
k = UBound(mArr)
k1 = k
'conteggio giorni
For k = UBound(mArr) To 2 Step -1
    Do Until mArr(k1 - 1, 3) = 1
        Giorni = Giorni + 1
        k1 = k1 - 1
    Loop
    If Giorni = 0 Then
        mArr(k, 5) = 1
    Else
        mArr(k, 5) = Giorni + 1
'        Cells(k + 10, 7) = Giorni + 1 ' se togli commento, in col. G vengono stampati i giorni
        'alimenta array distanze
        For I = 1 To UBound(Distanza)
            If Distanza(I, 1) = Giorni + 1 Then
                Distanza(I, 2) = Distanza(I, 2) + 1
                Exit For
            End If
        Next I
        GoTo salto
    End If
salto:
    k1 = k1 - 1
    Giorni = 0
    k = k1 + 1
Next k
With Application.WorksheetFunction
    Range("B6") = .Sum(.Index(mArr(), 0, 3)) ' quanti 1
    Range("B8") = NumPers_1 / Range("B6") ' Media
   
   ' valori per distanza
    c = 3
    For I = 1 To UBound(Distanza)
        Cells(6, c) = Distanza(I, 2)
        c = c + 1
    Next I
    End With
End Sub



[Modificato da dodo47 22/04/2023 19:32]
Domenico
Win 10 - Excel 2016
Post: 3.475
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
23/04/2023 12:44

ciao
mi sono accorto di un paio di errori.

dovresti modificare così il codice da utilizzare sull'allegato del precedente post

Sub test_Caso_c()
Dim wk As Worksheet, lr As Long, Parametro As Double, mArr() As Variant
Dim j As Long, k As Long, k1 As Long, Giorni As Integer
Dim NumPers_1 As Long, Distanza() As Variant
Set wk = Worksheets("Foglio1")
wk.Range("B6:F6,B8").ClearContents '<< variare secondo dati di riga 5
lr = wk.Range("A" & Rows.Count).End(xlUp).Row
Parametro = Range("A9")
ReDim mArr(1 To lr - 10, 1 To 5) ' array dati

' array Distanze
Distanza = Application.WorksheetFunction.Transpose(Range("C5:F6")) '<< variare secondo dati di riga 5
For I = 1 To UBound(Distanza)
    Distanza(I, 2) = 0
Next

'alimenta array dati
For j = 11 To lr
    mArr(j - 10, 1) = Cells(j, 1) 'LUCA
    mArr(j - 10, 2) = Cells(j, 2) 'MARCO
    mArr(j - 10, 4) = Cells(j, 3) 'N.PERSONE
    If mArr(j - 10, 1) + mArr(j - 10, 2) > Parametro Then 'SOMMA
        mArr(j - 10, 3) = 1
        NumPers_1 = NumPers_1 + mArr(j - 10, 4) ' somma persone con 1
    Else
        mArr(j - 10, 3) = 0
    End If
Next j
k = UBound(mArr)
k1 = k
'conteggio giorni
For k = UBound(mArr) To 2 Step -1
        Do Until mArr(k1 - 1, 3) = 1
            Giorni = Giorni + 1
            k1 = k1 - 1
            If k1 = 1 Then Exit Do
        Loop
    If Giorni = 0 Then
        mArr(k, 5) = 1
    Else
        mArr(k, 5) = Giorni + 1
'        Cells(k + 10, 7) = Giorni + 1 ' se togli commento, in col. G vengono stampati i giorni
        'alimenta array distanze
        For I = 1 To UBound(Distanza)
            If Distanza(I, 1) = Giorni + 1 Then
                Distanza(I, 2) = Distanza(I, 2) + 1
                Exit For
            End If
        Next I
        GoTo salto
    End If
salto:
    k1 = k1 - 1
    Giorni = 0
    k = k1 + 1
Next k
With Application.WorksheetFunction
    Range("B6") = .Sum(.Index(mArr(), 0, 3)) ' quanti 1
End With
If NumPers_1 > 0 Then
    Range("B8") = NumPers_1 / Range("B6") ' media
    c = 3 ' colonna inizio distanze
    For I = 1 To UBound(Distanza)
        Cells(6, c) = Distanza(I, 2)
        c = c + 1
    Next I
Else
    MsgBox "Nessun riscontro"
End If
    
End Sub

Saluti




[Modificato da dodo47 23/04/2023 12:57]
Domenico
Win 10 - Excel 2016
Post: 182
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
24/04/2023 22:52

Buonasera Domenico! Ti chiedo scusa se ho letto il tuo prezioso aiuto soltanto adesso ma temevo che il mio problema fosse irrisolvibile ed avevo ridotto la frequenza con cui controllavo la discussione. Adesso leggerò per bene ciò che mi hai pazientemente scritto per riuscire a comprendere per bene il tuo codice.
Grazie++++++🎁
Post: 3.483
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/04/2023 09:46

ciao, ti pare

se hai necessità di spiegazioni sono qui

saluti





Domenico
Win 10 - Excel 2016
Post: 183
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
25/04/2023 17:31

Buon pomeriggio a tutti!
Domenico sei stato fantastico come sempre, sei riuscito anche questa volta a realizzare esattamente ciò che desideravo.
Il metodo con cui hai analizzato gli elementi del vettore mi è piaciuto moltissimo e si presta a tantissime analisi.
Il tuo codice è eccezionale!👏👏👏🔝
Grazie davvero!🎁
P.S. Ho dovuto semplicemente inserire il numero esatto della colonna dei dati delle N. PERSONE (4 anziché 3) che ti sarà sfuggito.

[Modificato da Melissa2018 25/04/2023 17:32]
Post: 3.485
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/04/2023 17:53

ciao Melissa

ma dove l'hai trovato quel "4" ??

io nel post #14 ho scritto:

mArr(j - 10, 4) = Cells(j, 3) 'N.PERSONE
e non c'è neanche nell'allegato al post #13....

Comunque felice di esserti stato d'aiuto

saluti



[Modificato da dodo47 25/04/2023 17:58]
Domenico
Win 10 - Excel 2016
Post: 184
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
25/04/2023 18:24

Ciao Domenico, lasciando il 3 l'esecuzione del codice dà "nessun riscontro".
Allora, studiandolo ho capito che dovesse andarci il 4 e adesso va bene.
Post: 3.486
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
25/04/2023 18:45

eh, ma quello non è il mio foglio

il mio non ha la colonna somma.....

saluti

questa è la struttura del mio che non si avvale della colonna SOMMA:
[Modificato da dodo47 25/04/2023 18:47]
Domenico
Win 10 - Excel 2016
Post: 185
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
25/04/2023 18:58

Ah! Ho capito l'equivoco, quando ho letto che avevi spostato alle prime colonne il caso C, pensavo tu, per comodità, l'avessi riproposto sulle colonne di dati che erano del CASO A! Eri stato chiaro, io dovevo essere più attenta! Scusami! 😋
Grazie ancora Domenico!
Adesso mi dedicherò a studiare i vettori e le matrici
[Modificato da Melissa2018 25/04/2023 19:00]
Post: 3.487
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
26/04/2023 09:53

ciao
bene, chiarito l'equivoco devo farti i complimenti Melissa, sei una delle poche persone che entra nel merito dei codici che vengono proposti.

Saluti

C'è un'istruzione inutile: GoTo Salto che puoi eliminare unitamente all'etichetta Salto:


[Modificato da dodo47 26/04/2023 10:16]
Domenico
Win 10 - Excel 2016
Post: 186
Registrato il: 03/09/2018
Città: GROTTAGLIE
Età: 25
Utente Junior
Microsoft Office Professional Plus 2019 64 bit
OFFLINE
27/04/2023 08:47

Buongiorno, grazie ancora Domenico! Grazie al tuo prezioso aiuto ho velocizzato incredibilmente le mi analisi
Vota: 15MediaObject5,001223 12
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 00:06. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com