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