Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Togliere numeri da un intervallo con criterio

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Togliere numeri da un intervallo con criterio

Postdi ikwae » 29/07/20 15:26

Ciao a tutti … Mi sono accorto che nella mia macro manca un confronto che non
riesco a fare e sono bloccato con il mio progettino e quindi chiedo aiuto a tutto il Forum.

L’aiuto che cerco è una semplice macro che compie le seguenti operazioni.
1° Passo) Copia l’intervallo S7:V7 e incollare da S6 solo i valori (servirà per il messaggio finale).

2° Passo) Prendere il primo numero in colonna AL, in questo caso l’80 lo deve trovare nell’intervallo ("B5:F22,B24:F41,B43:F60")
Se lo trova: lo cancella momentaneamente dall’intervallo controlla che non ci sono variazioni, positive o negative, nei numeri nelle celle S7 con S6; o T7 con T6; o U7 con U6; o V7 con V6 se ci sono variazioni, anche una sola, lascia il numero 80 della cinquina al suo posto altrimenti se non ci sono variazioni lo cancella dall’intervallo.
2à occorrenza: come sopra …. ultima occorrenza: come sopra

*Prendere il secondo numero in colonna AL, in questo caso il 2 lo deve trovare nell’intervallo ("B5:F22,B24:F41,B43:F60")

1à occorrenza: lo cancella momentaneamente dall’intervallo controlla che non ci sono variazioni, positive o negative, nei numeri nelle celle S7 con S6; o T7 con T6; o U7 con U6; o V7 con V6 se ci sono variazioni, anche una sola, lascia il numero 2 della cinquina al suo posto altrimenti se non ci sono variazioni lo cancella dall’intervallo.
2à occorrenza: come sopra …. ultima occorrenza: come sopra

*Prendere il terzo numero in colonna AL, in questo caso il 14 segue il ciclo come sopra... prosegue di pari passo fino all’85

3° Passo) Conta le celle vuote che si sono create nell’intervallo ("B5:F22,B24:F41,B43:F60") e se sono <= a 60 non fa nulla se invece le celle vuote sono maggiori di 60 la macro dovrebbe copiare “tot” numeri e metterli in coda in colonna AM

Con un esempio (60 sono i numeri presenti in colonna AM):
se le celle vuote sono da 0 a 60 compresi la macro prosegue il ciclo normalmente.
se le celle vuote sono 70 la macro copia (70-60=10) 10 numeri (AM3:AM12) e incolla in coda in AM
Se le celle vuote sono 88 la macro copia (88-60=28) 28 numeri (AM3:AM30) e incolla in coda in AM
Se le celle vuote sono 62 la macro copia (62-60=2) 2 numeri (AM3:AM4) e incolla in coda in AM

4° Passo) confrontare i numeri nelle celle S7(15) con S6(15); o T7(2) con T6(2); o U7(3) con U6(3); o V7(3) con V6(3) se ci sono variazioni, anche una sola, deve dare un messaggio di errore e blocca il ciclo se il confronto è identico, in ogni cella, la macro
finisce senza dare altri avvisi.

La macro verrà replicata per 11 volte e inserita in un ciclo e, se possibile, lasciare il range come descritto e anche il riferimento alle celle sempre se possibile, escludendo di dare un intervallo di confronto tipo S7:U7 o S6:U6 ma puntare direttamente alle celle perché nel proseguo del progettino è probabile che le celle del confronto vengono dislocate, non necessariamente vicine, ma dove c’è posto o più “comodo” per la copia di altre macro utilizzate nel progettino.
NON prendere come riferimento la somma delle celle di confronto perché il valore delle celle può variare alla cancellazione dei numeri nelle cinquine mentre la somma può rimane invariata!

:oops: :oops: Leggendo il tutto sembra più un DIKTAT che una richiesta di aiuto ma non è così è quello che spero che venga fatto. Spiegare nel dettaglio cosa si desidera anziché chiedere ulteriori modifiche in seguito.

Allego un file con due fogli uno “org” per avere idea della struttura dove la macro deve lavorare e un foglio “prove” che è stato eliminato tutto quello che non interessa alla macro e “manomesso” le cinquine per maggior punteggio delle celle di confronto… ringrazio anticipatamente tutti coloro che mi aiuteranno 73 ikwae
http://www.filedropper.com/toglierenume ... oncriterio
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 178
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Togliere numeri da un intervallo con criterio

Postdi Anthony47 » 29/07/20 23:00

I tuoi messaggi hanno, oramai lo sai, un tempo di assimilazione piu' lunghi del normale, quindi devi aspettare pazientemente che mi avanzi un po' di tempo e un po' di pazienza...
Comunque gia' la prima lettura apre dei punti interrogativi a cui non ho saputo rispondere; ad esempio, nel 4° Passo scrivi:
confrontare i numeri nelle celle S7(15) con S6(15); o T7(2) con T6(2); o U7(3) con U6(3); o V7(3) con V6(3) se ci sono variazioni, anche una sola, deve dare un messaggio di errore e blocca il ciclo se il confronto è identico, in ogni cella, la macro finisce senza dare altri avvisi.
Ma nel 2° passo viene imposto, per la modifica dei dati, che S7:V7 rimangano invariati (altrimenti nessuna modifica); mentre nel 3° passo si va ad incrementare la lista in colonna AM, che non figura tra i "precedenti" delle formule in S7:U7. Allora a che pro questo controllo, che non puo' che confermare che S7:V7 non sono mutati?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17106
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Togliere numeri da un intervallo con criterio

Postdi ikwae » 30/07/20 08:57

Ciao Anthony sempre molto gentile a rispondermi … rispondo alla tua naturale domanda con tre motivi il primo perché secondo me la macro dovrebbe finire con il controllo altrimenti come faccio a sapere che è tutto a posto?
Questo non vuol dire che non ho fiducia dell’operato della tua macro ne sono certo che funzionerà come da richiesta ma solo una semplice tranquillità che tutto è andato bene dato che ci sono “attive” 6.930 formule con pieni “poteri” che puntano tutte esclusivamente alla “cassa” (S7:V7).
Secondo cercherò di estrapolare per avere a disposizione sia il controllo del confronto con relativo messaggio di errore che posso inserire a piacere come controllo prima durante e dopo le operazioni del ciclo. Se non riesco a estrapolare il confronto con relativo messaggio di errore la userò in originale ma solo al completamento delle operazioni e mi spiego meglio.
Una volta che la macro ha fatto il suo lavoro si “svuota” rimane “innocua” perché una volta tolti i numeri dall’intervallo non li può togliere un’altra volta (anche se presenti in colonna) di conseguenza non può mettere in coda dei numeri perché non trova celle vuote quindi se si commenta (’) la parte iniziale della copia e incolla solo valori ecco che rimane a disposizione una macro di controllo, con relativo messaggio, con la sola limitazione che deve essere usata, per controlli a piacere, esclusivamente dopo che fatto il suo lavoro primario.
Per il tempo che ti necessita da parte mia non avrai mai un “sollecito” per finire la macro quindi posso aspettare tranquillamente perché ormai so, da anni, che prima o poi arriverà la migliore soluzione come da richiesta.
L’unica cosa che posso ricordare, se possibile, di lasciare l’intervallo e il puntamento alle celle come descritto nella richiesta iniziale … cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 178
Iscritto il: 27/12/17 23:14

Re: Togliere numeri da un intervallo con criterio

Postdi ikwae » 02/09/20 13:16

Gentilissimo Anthony, come detto sull’altro post ho completato la macro esattamente come la cerco quindi allego
la macro che ho realizzato. Per non farti perdere tempo non spiego la macro ma quello che fa all’interno del foglio.

Ricordo che è stata replicata per 11 volte quindi questa è la 1à delle 11 macro.
1) Copiare cella per cella la “cassa” ossia le vincite (solo i valori) la S7 in S6, T7 in T6, U7 in U6, V7 in V6
2) Prende il primo numero nel range AL3:AL32 (in questo caso il numero 80)
3) Cerca nell’intervallo ("B5:F22,B24:F41,B43:F60") il primo numero (in questo numero 80)

a) se lo trova lo cancella momentaneamente e controlla che non ci siano variazioni positive o negative fra le celle
S7 con la S6, T7 con la T6, U7 con la U6, V7 con la V6 se c’è anche una sola variazione lo riscrive lasciandolo al suo posto.
b) se non ci sono variazioni lo cancella definitamente dall’intervallo ("B5:F22,B24:F41,B43:F60") lasciando la cella vuota.

4) Prende il secondo numero nel range AL3:AL32 (in questo caso il numero 2) e ripete come descritto al punto 3.
*Prende il terzo numero nel range AL3:AL32 (in questo caso il numero 14) e ripete come descritto al punto 3.
*Continua a prelevare numeri dal range AL3:AL32 fino all’ultimo (in questo caso 85) e ripete come descritto al punto 3.

5) Conta le celle vuote che si sono create nell’intervallo ("B5:F22,B24:F41,B43:F60") e se sono <= a 60 non fa nulla
se invece le celle vuote sono maggiori di 60 la macro dovrebbe copiare “tot” numeri e metterli in coda in colonna AM

Con un esempio (60 sono i numeri presenti in colonna AM):
se le celle vuote sono da 0 a 60 compresi la macro prosegue il ciclo normalmente.
se le celle vuote sono 70 la macro copia (70-60=10) 10 numeri (AM3:AM12) e incolla in coda in AM
Se le celle vuote sono 88 la macro copia (88-60=28) 28 numeri (AM3:AM30) e incolla in coda in AM
Se le celle vuote sono 62 la macro copia (62-60=2) 2 numeri (AM3:AM4) e incolla in coda in AM

6) confrontare i numeri delle celle S7(15) con S6(15); T7(2) con T6(2); U7(3) con U6(3); V7(3) con V6(3)
se ci sono variazioni, anche una sola, deve dare un messaggio di errore e blocca il ciclo
se il confronto è identico, in ogni cella, la macro finisce senza dare altri avvisi.

Note: Il punto 6, sulla 1à macro, è stato commentato (‘) perché il suo compito viene svolto nell’ultima replica
ossia la 11à macro inerente alla ruota Nazionale.

Aggiungo che la macro “parte a razzo” e quando arriva alla 7à o 8à macro di replica inizia a diminuire in velocità
e, tutto sommato, potrebbe anche andare bene.
Se ti avanza del tempo e, soprattutto, hai recuperato un po' di pazienza e la vuoi velocizzare un po'
ne sarei contento il tutto senza fretta e con moltissima calma dato che la macro è già in uso funzionante. Cordialmente ikwae

Codice: Seleziona tutto
Sub Togli_Numeri_Bari_Bosity()
Dim area As Variant
Dim area2 As Variant
Dim Riga As Variant
Dim cl As Variant
Dim clx As Variant

Sheets("Risultato").Select
    Range("S7").Copy
    Range("S6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("T7").Copy
    Range("T6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("U7").Copy
    Range("U6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("V7").Copy
    Range("V6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
contatore = 0
 Set area = Range("B5:F22,B24:F41,B43:F60") 'BA RANGE RUOTA
 Set area2 = Range("AL3:AL32")                          'BA RANGE NUMERI DA TOGLIERE

For Each cl In area
    For Each clx In area2
        If cl.Value = clx.Value Then
           a = clx.Value 'Address
           cl.Select
           cl.Clear
           contatore = contatore + 1
   If Range("S6").Value <> Range("S7").Value Or _
      Range("T6").Value <> Range("T7").Value Or _
      Range("U6").Value <> Range("U7").Value Or _
      Range("V6").Value <> Range("V7").Value Then Else GoTo 10
              cl.Value = a 'clx.Value
               contatore = contatore - 1
10
End If
    Next
Next
'MsgBox contatore
 Range("AL2") = contatore 'x BA
If contatore > 60 Then
 Range("AL1") = contatore - 58 'x BA
 Range("AM3:AM" & Range("AL1").Value).Copy  'x BA

'Posizione dove incollare i dati
 Dim iRow As Integer
    iRow = 3 'riga
 While Cells(iRow, 39).Value <> ""  'colonna 39 la AM x BA
    iRow = iRow + 1
    Wend
 Cells(iRow, 39).Select 'accoda in AM x BA
   ActiveSheet.Paste
   Application.CutCopyMode = False
End If

'Range("S6").Value = Range("S6").Value + 1 ' PER PROVE ERRORE
'If Range("S6").Value <> Range("S7").Value Or _
    Range("T6").Value <> Range("T7").Value Or _
    Range("U6").Value <> Range("U7").Value Or _
    Range("V6").Value <> Range("V7").Value Then
'MsgBox "errore"
'End If
'Range("B1").Select

Set area = Nothing
Set area2 = Nothing
End Sub
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 178
Iscritto il: 27/12/17 23:14

Re: Togliere numeri da un intervallo con criterio

Postdi Anthony47 » 02/09/20 23:11

Purtroppo il tuo foglio deve eseguire una quantita' rilevante di formule, in gran parte "matriciali"; questo "mangia" parecchia cpu e quindi si parte da una lentezza intrinseca del modello di elaborazione. Diverso il caso in cui la macro potesse sostituirsi alle formule del foglio per valutare come procedere, ma questo probabilmente richiederebbe troppo tempo...

Cio' detto, questa versione e' leggermente piu' veloce (diciamo "circa il doppio"), ma soprattutto (e non so se questo e' un bene o un male) c'e' inserito un loop che dovrebbe ripetere il codice per tutte le 11 ruote; vedi istruzione For RU = 1 To 1
Codice: Seleziona tutto
Sub Togli_Numeri_Bosity3()
Dim area As Variant
Dim area2 As Variant
Dim Riga As Variant
Dim cl As Variant
Dim clx As Variant
Dim SS6, TT6, UU6, VV6, RU As Long, RR As Long, coLimit As Long

'''Call Macro6             'Ripristina i dati di partenza
mytim = Timer
Sheets("Risultato").Select
    Range("S6:V6").Value = Range("S7:V7").Value
coLimit = 60
'contatore = 0
'Set area = Range("B5:F22,B24:F41,B43:F60") 'BA RANGE RUOTA
'Set area2 = Range("AL3:AL32").Offset(0, RR)                         'BA RANGE NUMERI DA TOGLIERE
'
SS6 = Range("S6").Value
TT6 = Range("T6").Value
UU6 = Range("U6").Value
VV6 = Range("V6").Value
'
Application.ScreenUpdating = False
'
For RU = 1 To 1                         '<<< Numero di Ruote da "lavorare"
    RR = RU - 1
    contatore = 0
    Set area = Range("B5:F22,B24:F41,B43:F60").Offset(RR * 57) 'BA RANGE RUOTA
    Debug.Print area.Address
    Set area2 = Range("AL3:AL32").Offset(0, RR * 2)                       'BA RANGE NUMERI DA TOGLIERE
    For Each cl In area
        For Each clx In area2
            If cl.Value = clx.Value Then
               a = clx.Value 'Address
    '           cl.Select
               cl.Clear
               contatore = contatore + 1
               If SS6 <> Range("S7").Value Or _
                  TT6 <> Range("T7").Value Or _
                  UU6 <> Range("U7").Value Or _
                  VV6 <> Range("V7").Value Then
                        cl.Value = a 'clx.Value
                        contatore = contatore - 1
                End If
            End If
        Next clx
    Next cl
    'MsgBox contatore
    ' Range("AL2") = contatore 'x BA
    Debug.Print Range("AM3").Offset(-1, RR * 2).Value, contatore
    If contatore > coLimit Then
        Debug.Print ">>Incollati: " & contatore - coLimit & " in "; Range("AM3").Offset(0, RR * 2).End(xlDown).Offset(1, 0).Address
       
        Range("AM3").Offset(0, RR * 2).Resize(contatore - coLimit, 1).Copy _
           Destination:=Range("AM3").Offset(0, RR * 2).End(xlDown).Offset(1, 0)
    End If
'Messaggio se S6:V6 <> S7:V7
    If SS6 <> Range("S7").Value Or _
        TT6 <> Range("T7").Value Or _
        UU6 <> Range("U7").Value Or _
        VV6 <> Range("V7").Value Then
            MsgBox ("Dati non congruenti su " & Range("AM3").Offset(-1, RR * 2).Value _
               & vbCrLf & "Processo interrotto")
            Exit Sub
    End If
Next RU
Application.ScreenUpdating = True
'
Set area = Nothing
Set area2 = Nothing
Debug.Print "DeltaT = " & Format(Timer - mytim, "0.00")
Beep
End Sub

Ora, con For RU = 1 To 1, il codice gestisce solo una ruota; ma se dopo il collaudo i risultati fossero Ok allora puoi provare con For RU = 1 To 11
Nota che ho assunto che per ogni ruota la lista di colonna AL vada spostata a destra di 2 colonne, mentre la tabella che comincia in B5 vada spostata in basso di 57 righe (come e' nel file che avevi allegato a fine Luglio). Non so se ambedue queste assunzioni sono corrette sempre (o se invece la tabella di colonne B:F vari continuamente di altezza); eventualmente modifichiamo questa selezione guardando quando BA diventa CA e poi FI etc etc. Ma ne parleremo ancora.

Comunque prova anche tu e vedi che succede.

Ah, dimenticavo: la macro non scrive piu' in AL2 il Contatore e in AL1 il num di riga fino a cui copiare; se usi queste informazioni per controllare il risultato della macro allora potresti andare in confusione. Se pero' vai sul vba e apri la "finestra Immediata" (dovrebbe bastare il comando Contr-g) allora troverai scritto, in sequenza:
-l'indirizzo della tabella B:F che viene utilizzata
-la Ruota e il valore finale del contatore
-eventualmente quante righe sono state copiate e dove.
Ad esempio a me ha detto, in una prova dove ho usato For RU = 1 To 11:
Codice: Seleziona tutto
$B$5:$F$22,$B$24:$F$41,$B$43:$F$60
BA             58
$B$62:$F$79,$B$81:$F$98,$B$100:$F$117
CA             69
>>Incollati: 9 in $AO$63
$B$119:$F$136,$B$138:$F$155,$B$157:$F$174
FI             64
>>Incollati: 4 in $AQ$63
$B$176:$F$193,$B$195:$F$212,$B$214:$F$231
GE             71
>>Incollati: 11 in $AS$63
$B$233:$F$250,$B$252:$F$269,$B$271:$F$288
MI             66
>>Incollati: 6 in $AU$63
etc etc
etc


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17106
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Togliere numeri da un intervallo con criterio

Postdi ikwae » 03/09/20 12:38

Gentilissimo Anthony la macro è velocissima, meravigliosa e inimmaginabile ancora di più le preziose info che mi hai scritto…
Per il naturale, dovuto e super meritato riscontro scrivo i vari passaggi e le dovute risposte (sperando di non dimenticare nulla) ….

Le dimensioni e la struttura del foglio sono rigorosamente stabili e immutabili sia come pronostico (colonna B:F) sia le colonne dei numeri (da AL a seguire a dx).

Ho caricato il foglio dell’allegato per avere delle misurazioni unanime e all’istante ho modificato For RU = 1 To 1 in For RU = 1 To 11 e nella colonna C del foglio a fianco dell’estrazione, ho applicato una formula CONTA VUOTE ognuna con l’intervallo proprio della ruota in esame e mandate in esecuzioni le due macro i numeri, del CONTA VUOTE, sono unanime si parte da 58 di Bari a finire la Nazionale con 70 celle vuote per un totale di 771. Anche gli ambi sono rimasti identici dal 13 di BA fino al 20 della Nazionale per un totale di 172 anche i 12 terni sono identici ognuno al suo posto su ogni ruota.

Ho scritto nel codice (solo per prova) Range("S7").Value = Range("S7").Value + 1 e il ciclo si è interrotto con la msgbox come da richiesta.

Ho modificato il timer con un msgbox(solo per prove poi verrà commentato) in entrambe le macro e, misurate la velocità del DeltaT, sono leggermente meno della metà ossia da 1 a 0,45 (naturalmente “vince” la tua) anche se ripristinato il punto 1, del mio post, e rifatta la misurazione il DeltaT non c’è nessuna variazione significativa.

Mi dispiace a non sapere ancora allegare le foto anche se ho letto moltissime volte come si fa ma devo imparare per dare una maggiore soddisfazione al responso.

Con questo post e soprattutto con quello della unificazione della stringa, di pochissimi giorni fa, penso di aver esaurito le richieste di aiuto adesso posso dedicarmi a “raccogliere” i frutti del mio progettino Uno-Uno ma è rassicurante e confortevole oltre che prezioso sapere che se necessita posso chiedere aiuto a tutto il Forum…

Ringraziandoti mille e mille volte per il tuo aiuto e per la tua Santa Pazienza oltre per la tua indiscussa Professionalità cordialmente ikwae.
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 178
Iscritto il: 27/12/17 23:14

Re: Togliere numeri da un intervallo con criterio

Postdi Anthony47 » 03/09/20 17:27

Mah, spero che i risultati della macro siano quindi corretti :undecided:

Comunque, avendo ricostruito con un po' di pazienza (siamo a inizio mese...) a cosa servono le formule di colonne G:Q (son quelle che rallentano irrimediabilmente l'esecuzione della macro) ne ho simulato il loro calcolo all'interno della macro stessa. Questo consente di far lavorare quelle formule solo 1 volta per ogni ruota, con conseguente cospicua velocizzazione.
Il nuovo codice:
Codice: Seleziona tutto
Sub Togli_Numeri_Bosity4()
Dim area As Variant
Dim area2 As Variant
Dim Riga As Variant
Dim cl As Variant
Dim clx As Variant
Dim SS6, TT6, UU6, VV6, RU As Long, RR As Long, coLimit As Long
Dim wArr, gArr, iGArr, iWArr
'
'Call Macro6             'Ripristina i dati di partenza
mytim = Timer
wArr = Range("W4:AA14").Value
gArr = Range("B1:F630").Value
Sheets("Risultato").Select
    Range("S6:V6").Value = Range("S7:V7").Value
coLimit = 60
'contatore = 0
'Set area = Range("B5:F22,B24:F41,B43:F60") 'BA RANGE RUOTA
'Set area2 = Range("AL3:AL32").Offset(0, RR)                         'BA RANGE NUMERI DA TOGLIERE
'
SS6 = Range("S6").Value
TT6 = Range("T6").Value
UU6 = Range("U6").Value
VV6 = Range("V6").Value
'
Application.ScreenUpdating = False
'
For RU = 1 To 11                         '<<< Numero di Ruote da "lavorare"
    RR = RU - 1
    contatore = 0: conterr = 0
    Set area = Range("B5:F22,B24:F41,B43:F60").Offset(RR * 57) 'BA RANGE RUOTA
    Debug.Print area.Address
    Set area2 = Range("AL3:AL32").Offset(0, RR * 2)                       'BA RANGE NUMERI DA TOGLIERE
    For Each cl In area
    'If cl.Value = 11128 Then Stop
        If Not IsError(Application.Match(cl.Value, area2, False)) Then
'>>simulazione lavoro delle formule:
            iGArr = Application.WorksheetFunction.Index(gArr, cl.Row, 0)
            For i = 1 To UBound(wArr)
                iWArr = Application.WorksheetFunction.Index(wArr, i, 0)
                ncnt = 0
                If Not IsError(Application.Match(cl.Value, iWArr, False)) Then
                    For j = 1 To UBound(gArr, 2)
                        If Not IsError(Application.Match(iGArr(j), iWArr, False)) And (cl.Value <> iGArr(j)) Then ncnt = ncnt + 1
                        If ncnt > 1 Then Exit For
                    Next j
                End If
                If ncnt > 0 Then Exit For
            Next i
            If ncnt < 1 Then
'<<
                If SS6 <> Range("S7").Value Or _
                   TT6 <> Range("T7").Value Or _
                   UU6 <> Range("U7").Value Or _
                   VV6 <> Range("V7").Value Then
                         cl.Value = a 'clx.Value
                         conterr = conterr + 1
                 Else
                     contatore = contatore + 1
                     gArr(cl.Row, cl.Column - 1) = ""
        '                    Beep
                 End If
            End If
        End If
    Next cl
    '
    'MsgBox contatore
    ' Range("AL2") = contatore 'x BA
    Debug.Print Range("AM3").Offset(-1, RR * 2).Value, contatore, conterr
    'dump elaborazione di ruota:
    Range("B1").Resize(UBound(gArr), UBound(gArr, 2)).Value = gArr
    If contatore > coLimit Then
        Debug.Print ">>Incollati: " & contatore - coLimit & " in "; Range("AM3").Offset(0, RR * 2).End(xlDown).Offset(1, 0).Address
        Range("AM3").Offset(0, RR * 2).Resize(contatore - coLimit, 1).Copy _
           Destination:=Range("AM3").Offset(0, RR * 2).End(xlDown).Offset(1, 0)
    End If
    'Messaggio se S6:V6 <> S7:V7
    If SS6 <> Range("S7").Value Or _
        TT6 <> Range("T7").Value Or _
        UU6 <> Range("U7").Value Or _
        VV6 <> Range("V7").Value Then
            MsgBox ("Dati non congruenti su " & Range("AM3").Offset(-1, RR * 2).Value _
               & vbCrLf & "Processo interrotto")
            Exit Sub
    End If
Next RU
Range("B1").Resize(UBound(gArr), UBound(gArr, 2)).Value = gArr
Application.ScreenUpdating = True
'
Set area = Nothing
Set area2 = Nothing
Debug.Print "#4:DeltaT = " & Format(Timer - mytim, "0.00") & vbCrLf
Beep
End Sub
A me pare che i risultati siano uguali a quelli della versione precedente.
Se hai voglia prova anche tu...
Avatar utente
Anthony47
Moderatore
 
Post: 17106
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Togliere numeri da un intervallo con criterio

Postdi ikwae » 03/09/20 20:20

eccezionale veramente (le parole di un noto attore) e penso che le parole del nostro Conte riferite alla frase “una potenza di fuoco” non si riferiva certo all’aiuto derivante dai Fondi Europei ma alla tua ultima macro dopo averla vista girare.

Ma vediamo nel dettaglio i tempi. La mia macro girava nell’ordine di una manciata di secondi e la tua prima macro questi secondi sono diventati la metà aggiungendo ‘nanticchia di meno. Adesso con la tua ultima macro i tempi si sono accorciati notevolmente si parla di centesimi di secondo ossia meno di 1 (dico uno) secondo.

Le indispensabili formule matriciali con la formattazione condizionale sotto, formano il “letto” del foglio Uno che è stato allegato alla prima richiesta di auto realizzando una macro (su mia specifica indicazione) che converte le vincite in stringhe.

Comunque terrò d’occhio la nuova macro con le prossime estrazioni e se c’è qualche cosa che non va nei conteggi (improbabile e quasi impossibile) so a che porta bussare. :)

Ringraziandoti mille e mille volte per il duplice aiuto e per la tua disponibilità oltre per la tua inestimabile Professionalità cordialmente ikwae.
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 178
Iscritto il: 27/12/17 23:14


Torna a Applicazioni Office Windows


Topic correlati a "Togliere numeri da un intervallo con criterio":


Chi c’è in linea

Visitano il forum: papiriof e 41 ospiti

cron