Condividi:        

Selezionare stringhe determinate

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

Selezionare stringhe determinate

Postdi ikwae » 17/05/21 13:14

Gentilissimo Anthony …. vorrei chiederti se puoi modificare una macro che hai scritto te, per me, in un altro post.
l’altro post, ha come oggetto, delle colonne e la macro che chiedo di poter modificare ha come oggetto la selezione.

Questa macro, modificando solo lFor è super utilissima e la uso per creare tabelle ognuna con diverse indicazioni.
Codice: Seleziona tutto
Sub DemoSel()
Dim Selector As String, lFor As String
'
lFor = "_gr2_c-18"            '<<< La stringa "Chiave" da cercare
For I = 2 To Cells(Rows.Count, "B").End(xlUp).Row
    If InStr(1, Cells(I, "B").Value, lFor, vbTextCompare) > 0 Then
        Selector = Selector & "," & Cells(I, "B").Address
    End If
Next I
If Selector = "" Then Exit Sub 'se non trova lFor va in errore!
Range(Mid(Selector, 2)).Select
End Sub


Questa macro lavora su stringhe tipo: BA_Gr2_C-01 - 012 terno Roma oppure BA_Gr2_C-01 - 012 terno (20) Roma
Ricordo che le stringhe hanno zone separate autonome che possono variare:
zona ruota iniziale(BA), zona gruppi (Gr2), zona cinquine (C-01) …. fino alla zona Ruota finale (Roma).
Di conseguenza 11x3x18x157x4x11=4.103.352 sono le possibili combinazioni che le stringhe hanno.

lFor_1 = (con una sola chiave) … Posso selezionare tutta la stringa scrivendo solo una parte BA oppure C-01 oppure Roma
lFor_2 = (con due chiavi) … Posso selezionare tutta la stringa scrivendo due parti BA + C-01 oppure BA + Bari
lFor_3 = (con tre chiavi) … Posso selezionare tutta la stringa scrivendo tre parti BA+C-01+Roma.

Naturalmente si sceglie una alla volta quale usare e le altre due si commentano (‘).
Aggiungo che le chiavi di ricerca sono tutte sulla stessa stringa ovviamente.

Quindi ti chiedo, se possibile, di modificare la macro che abbia un lFor “esteso” come descritto
sopra (da 1 a 3) e, se possibile, anche oltre.

Questa macro la uso moltissimo anche se ho notato un piccolo neo nella macro, indipendentemente
dalle righe se sono 50 o 25.000, non riesce a selezionare più di 39 stringhe (raramente fino a 42)
e, superato questo limite, va in errore evidenziando di giallo >>Range(Mid(Selector, 2)).Select << .

Ricapitolando, se possibile, modificare la macro che abbia un lFor “esteso” e che aumenti il numero delle
stringhe selezionabili.

In alternativa una semplicissima macro con pochissimi passaggi:
1a) Scrivere in lFor cosa cercare (con maggior numero di campi possibili)
2b) Copiare dalla colonna B e incollare in un’altra colonna ad esempio la D
3c) Cancellare dalla colonna B le stringhe appena copiate.

In allegato un file con un solo foglio “Conta” per eventuali prove della macro.

Ringraziandoti mille e mille volte per il tuo aiuto cordialmente ikwae

http://www.filedropper.com/3aumentarelforrete

******************************************
Lo scopo di tutto questo è di catalogare contando le stringhe che abbiano campi diversi per
avere il numero della somma da scriverlo in una specifica cella di ogni tabella dedicata.
Quindi non serve una sola macro che faccia tutto ma, decine e oltre, per ogni specifica tabella.

Ad ogni estrazione, specifiche macro di ogni tabella, registrano le variazioni e, altre macro
“intelligenti”, registrano le frequenze delle variazioni di quella determinata tabella.

Con un esempio pratico e, riferito alla tabella delle cinquine, dico che la cinquina nr.6 della
ruota di Genova (è la più “attiva”) crea terni sulla ruota di Palermo.
Sapere la frequenza ossia ogni quante estrazione viene vinto il terno, conferma
il classico detto “ho fatto un terno al lotto” … non c’è altro da dire!
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Selezionare stringhe determinate

Postdi Anthony47 » 18/05/21 18:37

Mi sembra di capire che vorresti avere una casistica piu' articolata per definire quali righe selezionare e quali no.
Ti propongo pertanto questa soluzione:
-in un nuovo file, chiama un foglio "Criteri", che useremo per scriverci i criteri di ricerca
-su questo foglio "Criteri" assegna a una cella il nome "criteri" (seleziona la cella, scrivi "criteri" nella "casella nome", premi Enter)
-in questa cella scrivi il primo criterio, cioe' quale testo deve essere presente nella stringa; eventualmente continua in orizzontale a scrivere altri criteri, che dovranno essere tutti validi affinche' la cella sia selezionata
-nelle cella sottostante scrivi un secondo criterio, ed anche qui eventualmente segna ulteriori criteri da rispettare
In questo nuovo file inserire questo codice in un Modulo standard del vba:
Codice: Seleziona tutto
Sub DemoSelXA()
Dim Selector As String, lFor As String, DBG As Boolean
Dim sRng As Range, iCnt As Long, aCnt As Long, MaxI As Long
'
If ActiveWorkbook.Name = ThisWorkbook.Name Then
    MsgBox ("Selezionare manualmente il file da esaminare, prima di avviare la macro")
    Exit Sub
End If
Sheets("Conta").Select
'
DBG = False
MaxI = Cells(Rows.Count, "B").End(xlUp).Row
For I = 2 To MaxI
    If ckSel(Cells(I, "B").Value) Then
        Selector = Selector & "," & Cells(I, "B").Address
        iCnt = iCnt + 1
        aCnt = aCnt + 1
        If iCnt > 20 Then
        If DBG Then Debug.Print aCnt, I
            If Selector <> "" Then
                If sRng Is Nothing Then
                    Set sRng = Range(Mid(Selector, 2))
                Else
                    Set sRng = Application.Union(sRng, Range(Mid(Selector, 2)))
                End If
            End If
            iCnt = 0
            Selector = ""
        End If
    End If
Next I
If Selector <> "" Then
    If sRng Is Nothing Then
        Set sRng = Range(Mid(Selector, 2))
    Else
        Set sRng = Application.Union(sRng, Range(Mid(Selector, 2)))
    End If
End If
If aCnt > 0 Then sRng.Select
End Sub


Function ckSel(ByVal eString As String, Optional ldBG As Boolean = False) As Boolean
Dim rOk As Boolean, I As Long
'
With ThisWorkbook.Sheets("Criteri")
    For I = 0 To 9
        If .Range("criteri").Offset(I, 0).Value = "" Then Exit For
        For j = 0 To 9
            If ldBG Then Debug.Print .Range("criteri").Offset(I, j).Value
            If .Range("criteri").Offset(I, j).Value = "" Then Exit For
            If InStr(1, eString, .Range("criteri").Offset(I, j).Value, vbTextCompare) > 0 Then
                rOk = True
            Else
                rOk = False
            End If
            If rOk = False Then Exit For
        Next j
        If rOk Then
            ckSel = True
            Exit Function
        End If
    Next I
End With
End Function

Quando sei pronto, SELEZIONA il file da elaborare e avvia la Sub DemoSelXA.

Ad esempio con queste dichiarazioni saranno selezionate le righe che contengono Milano + c-01 + RN_, e le righe che contengono PA_ + Napoli
Immagine
(la cella nominata "criteri" e' la A3)

Sintetizzando, un criterio e' positivo se tutti i testi presenti su quella riga sono presenti nella stringa che si va ad analizzare; basta un criterio positivo per selezionare la cella analizzata (in orizzontale i testi vanno in AND; in verticale i criteri vanno in OR).
In tutto e' possibile scrivere su una riga fino a 10 criteri (tutti devono essere presenti nella stringa che si va ad analizzare), ed e' possibile compilare fino a 10 righe di criteri (basta che una riga sia confermata)

Prova e fai sapere.

Ma...
La macro "seleziona" un tot di celle su un elenco lungo migliaia di righe: non e' che sarebbe meglio creare su un secondo foglio l'elenco delle celle che rispecchaino i parametri di filtro? Che forse sarebbe anche piu' veloce...

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

Re: Selezionare stringhe determinate

Postdi ikwae » 18/05/21 20:37

Gentilissimo Anthony …. :) :) “eccezionale veramente” (citazione di un noto attore). Hai capito il senso della mi richiesta.
Questa tua macro (ancora da collaudare nei minimi dettagli) la userò tre volte la settimana quindi giornaliera.

Per lo storico, avevo pensato di inserirla, questa tua macro, in un ciclo For “auto configurante” e con un solo click
riempie le celle di 11 tabelle con 594 celle cadauna (6534 celle in tutto). E’ già avviato il ciclo con una sola chiave di ricerca
adesso posso arrivare fino a 10 chiavi di ricerca (se ho letto bene) quindi una “Manna dal Cielo” di quante tabelle posso fare.

Per fare questo ti devo chiedere se la puoi modificare aggiungendo qualche riga di codice:
1a) quando le celle sono selezionate (quelle con il criterio) si contano
2b) una volta contare, il numero della somma, va scritto in una cella del foglio “Pippo” il nome della cella
è riportata ad esempio sul foglio “Criteri” una qualunque la A1 o altra cella “comoda” da qualche altra parte.
3b) cancellare le celle selezionate dalla colonna B (utile ma non indispensabile serve per sapere quando la B2
è vuota per bloccare il ciclo For altrimenti va a iosa)

Ringraziandoti mille e mille volte per il lavoro fatto fino adesso cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi Anthony47 » 18/05/21 20:51

Come ti ho suggerito puoi inserire 10 righe di criteri (basta un criterio per approvare la cella in esame); ogni riga puo' contenere fino a 10 colonne di criteri (tutti i testi dei criteri devono essere presenti per approvare la cella in esame). Insomma hai a disposizione una matrice 10 righe * 10 colonne (ma puo' facilmente essere estesa a N righe * M colonne).

Quanto alle modifiche ho capito che vorresti contare quante voci sono state selezionate (ma allora non ha senso il lavoro sin qui fatto, perche' contare e' molto piu' semplice che selezionare, soprattutto se si parla di celle non contigue) e compilare una tabella da qualche parte. Non ho capito la storia del riempire "le celle di 11 tabelle con 594 celle cadauna", ne' se la memorizzazione della conta delle celle va fatta in posizioni diverse a seconda di quale condizione di filtro ha "approvato" la cella esaminata.
Ti chiedere su questo un approfondimento di descrizione

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

Re: Selezionare stringhe determinate

Postdi ikwae » 19/05/21 00:09

Gentilissimo Anthony… quello che dici per contare o selezione è vero.

MA! selezionare solo le celle a che fine? Io sicuramente pensavo a questo.
1) per il semplice fatto che io sono sempre a selezionare tutto e non lo so fare specialmente quelle non contigue
2) per copiarle da un’altra parte tutte d’un colpo ad esempio in una colonna e poi contare le righe (come sto facendo)
e il risultato va in una specifica cella della tabella in esame. (non sono capace a contarle in selezione e neanche senza selezione)
3) per cancellare
4) per separarle
5) una volta selezionate si può fare qualunque cosa.

Quindi è già molto utile e molto gradito il tuo aiuto fin qui fatto anche solo con la sola selezione, per me, è molto importante.

Se poi aggiungi che mi hai fatto una macro magnifica che riesce a selezionare più campi della stringa è perfetto in ogni parte.

Quindi mi viene data una macro magnifica e la devo usare per tutti i giorni va benissimo è talmente ottima che è un peccato non usarla per fare tutte le tabelle dello storico in un solo colpo con pochissime modifiche da fare.

A me servono tabelle specifiche con determinate colonne e righe che poi vengono elaborate ulteriormente da altre macro.
Quindi devo fare quello che so fare e che poi posso gestire e modificare in funzione di ogni problema o necessità che dovesse arrivare.

Inserendo la tua macro in un ciclo For la rendo “auto configurante” e, con soli 4 campi di chiavi, riesco a centrare esattamente
ogni cella di ogni tabella che i 4 campi indicano. Devo fare tabelle, tabelle, tabelle.

Per il momento solo 11 da 594 celle cadauna. Ho già preparato tutto l’auto configurazione, in attesa alla modifica che ti ho chiesto della tua macro ti faccio vedere qualche riga di auto configurazione ad ogni giro del Next sale su di una riga.
BA Gr2 C-01 Bari D2
BA Gr2 C-02 Bari D3
BA Gr2 C-03 Bari D4
BA Gr2 C-04 Bari D5
queste sono le prime 4 righe di auto configurazione e recitano:
1à riga: la prima chiave è BA la seconda chiave è Gr2 la terza chiave C-01 la quarta chiave è Bari, seleziona, conta e metti la conta sul foglio Pippo nella cella D2

2à riga: la prima chiave è BA la seconda chiave è Gr2 la terza chiave C-02 la quarta chiave è Bari, seleziona, conta e metti la conta sul foglio Pippo nella cella D3
3à riga: ecc.

queste invece sono le ultime righe di auto configurazione della 11à tabella e recitano…. (come sopra).
RN Gr0 C-17 Nazionale N594
RN Gr0 C-18 Nazionale N595

In conclusione si deve solo mandare in esecuzione la macro e, dopo qualche minuto ho 11 tabelle completamente strutturare e complete con tutte le stringhe che sono in colonna B del foglio “Conta”. Queste sono le cose che so gestire e poi non dimentichiamo il mio modesto motto “Usa quello che hai e, soprattutto, se lo capisci e lo sai applicare”

Spero di non aver risposto a tutto eventualmente rispondo al prossimo post. In attesa, della modifica alla tua macro, cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi Anthony47 » 19/05/21 17:16

Ma la selezione e' un processo lentissimo, rispetto alla banale conta. Sarebbe molto piu' veloce anche la copia in altro foglio delle righe che passano il filtro. Cancellare righe invece sarebbe mortale in termini di tempi di esecuzione, e comunque offrirebbe vantaggi marginali sul processo complessivo
Inoltre e' inefficiente scansionare 594 volte le 55mila righe, perche' basta una scansione e verificare 594 criteri per capire dove quella riga va contata.

Insomma, se tu sei in grado (e mi pare che lo fai gia') di compilare 594 righe con le condizioni di filtro (le prime N colonne) e in colonna 12=L la cella di foglio PIPPO di destinazione della conta, una macro che scansiona le Nmila righe di foglio CONTA e verifica quale delle 594 condizioni e' verificata e compila di conseguenza la conta su foglio PIPPO e' questione di 15 minuti di scrittura.

Se invece ti basta la selezione (come fatto quanto fatto fin qui) con l'aggiunta della conta delle celle, allora (visto che tu inglobi la mia macro in una tua di controllo) sappi che ti basta usare Selection.Cells.Count; cioe', da qualche parte nella tua macro di controllo:
Codice: Seleziona tutto
Sheets("pippo").Range(LaCella).Value = Selection.Cells.Count


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

Re: Selezionare stringhe determinate

Postdi ikwae » 19/05/21 21:20

Gentilissimo Anthony… ci siamo quasi funge ma “zoppica” ha due nei:

1a) con la tua indicazione Sheets("Pippo").Range(LaCella).Value = Selection.Cells.Count

e inserisco la cella T2 del foglio “Pippo” scrive sempre in T2 ma io vorrei che scrivesse nella cella che c’è scritto in cella T2.

Ad esempio se in cella T2 c’è scritto D4 dovrebbe essere
Sheets("Pippo").Range("D4").Value = Selection.Cells.Count

oppure se in T2 c’è scritto H11 dovrebbe essere
Sheets("Pippo").Range("H11").Value = Selection.Cells.Count.

In conclusione e, scritta alla meglio, dovrebbe essere
Sheets("Pippo").Range (La cella scritta in T2).Value = Selection.Cells.Count.

Ho provato vari modi, anche con ricerca in rete ma nulla da fare (continuo a cercare nei miei HD dei trucchi).

2) il secondo neo è se non trova nulla da selezionare riporta in cella T2 (errata) il valore 552729(che sono tutte le stringhe selezionate)

Se puoi darmi qualche info oppure aggiustare qualche cosa ne sarei felice cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi Anthony47 » 19/05/21 23:46

Quindi
Codice: Seleziona tutto
Sheets("Pippo").Range (Sheets("Pippo").Range("T2").Value).Value = Selection.Cells.Count


In assenza di selezioni rimane la selezione preesistente; facciamo cosi':
-a inizio della mia macro, subito dopo Sheets("Conta").Select, aggiungi l'istruzione Range("A1").Select
-poi, prima di memorizzare le selezioni, controlli che la prima cella selezionata non sia in colonna 1:
Codice: Seleziona tutto
If Selection.Cells(1, 1).Column <> 1 Then
    Sheets("Pippo").Range(Sheets("Pippo").Range("T2").Value).Value = Selection.Cells.Count
End If

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

Re: Selezionare stringhe determinate

Postdi ikwae » 20/05/21 00:40

Anthony47 ha scritto:Quindi
Codice: Seleziona tutto
Sheets("Pippo").Range (Sheets("Pippo").Range("T2").Value).Value = Selection.Cells.Count

Solo con questa istruzione funziona a meraviglia e in ogni sua parte.

In assenza di selezioni rimane la selezione preesistente; facciamo cosi':
-a inizio della mia macro, subito dopo Sheets("Conta").Select, aggiungi l'istruzione Range("A1").Select
-poi, prima di memorizzare le selezioni, controlli che la prima cella selezionata non sia in colonna 1:
Codice: Seleziona tutto
If Selection.Cells(1, 1).Column <> 1 Then
    Sheets("Pippo").Range(Sheets("Pippo").Range("T2").Value).Value = Selection.Cells.Count
End If

Ciao

ho seguiuto alla lettera(almeno spero) quello che hai scritto esce un errore evidenziando in giallo
If Selection.Cells(1, 1).Column <> 1 Then
faccio ancora delle prove e domani mattina ti do il responso... Buonanotte cordialemnte ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi ikwae » 20/05/21 13:29

Il ciclo funziona bene e lo completa tutto e per eliminare il 2° neo (dato che il tentativo di eliminazione del neo da errore)
ho creato una macro, richiamata in coda alla tua macro, per eliminare i numeri maggiori di 30 dalle tabelle e mentre li
elimina ho notato numeri molto strani e quindi ho riprogrammato il mio ciclo For, anziché la selezione scriva in numeri
nelle celle, scriva la selezione così com’è (le stringhe selezionate) in colonne e ho notato la seguente descrizione:

1à colonna il dato della selezione (giusta)
2à colonna il dato della 1à selezione più il dato delle 2à selezione (giusta)
3à colonna il dato della 1à selezione più il dato della 2à selezione più il dato 3à selezione(giusta)
4à colonna, ecc.

Anche se le ultime righe di ogni colonna sono giuste sembra che abbia in memoria le selezioni precedenti e li
aggiunge di volta in volta alle selezioni successive.
Ma non dovrebbe farlo perché ogni giro viene selezionata tutta la colonna B.

Quindi la macro li tiene in memoria. Ho cercato di cancellare la memoria (trovato in rete) con Erase o Nothing
ma non è servito a nulla anzi va in errore, proprio, non li vuole né Erase né Nothing.

Quindi se puoi modificare la tua macro per cancellare la memoria subito dopo la selezione, ma la selezione
deve rimanere “attiva” si riesce ad usare la macro per le 11 tabelle eventualmente se non si riesce a fare nulla
la userò come usavo la vecchia macro (Sub DemoSel()).

Ringraziandoti mille e mille volte per il tuo aiuto cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi Anthony47 » 20/05/21 13:41

La mia macro usa variabili locali che hanno validita' solo durante l'esecuzione della macro; cioe' si inizializzano tutte le volte che "chiami" la Sub DemoSelXA.
Dovresti quindi far vedere come richiami la mia macro, cioe' da quale file /foglio e con quale codice

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

Re: Selezionare stringhe determinate

Postdi ikwae » 20/05/21 16:11

Questa è la macro che uso e penso che riportando solo le modifiche si possa capire meglio.

Codice: Seleziona tutto
Sub DemoSelXA()
Dim Selector As String, lFor As String, DBG As Boolean
Dim sRng As Range, iCnt As Long, aCnt As Long, MaxI As Long
'
'If ActiveWorkbook.Name = ThisWorkbook.Name Then
   ' MsgBox ("Selezionare manualmente il file da esaminare, prima di avviare la macro")
    'Exit Sub
'End If


c = 5
For N = 1 To 9 '6534  <======= INIZIA IL CICLO

Sheets("Conta").Select
Range("B2:B552730").Select
'
‘***************************
DBG = False                   'da qui

'TUTTA LA TUMA MACRO SENZA NESSUNA MODIFICA NEANCHE ALLA Function

If aCnt > 0 Then sRng.Select 'a qui
'****************************

Selection.Copy
Dim iRow As Integer
iRow = 2 'riga
While Cells(iRow, c).Value <> ""  ' colonna 5 la E -->
iRow = iRow + 1
Wend
Cells(iRow, c).Select '
ActiveSheet.Paste
c = c + 1
IncollaCriteri ‘QUESTA MACRO SERVE ESCLUSIVAMENTE AD AGGIORNARE I CRITERI (4 alla volta sul foglio criteri)

Next N <===== RIPARTE IL CICLO

End Sub

Dopo quello che hai scritto al post sopra dubito che si possa fare qualche cosa se le variabili sono sempre attive.... Vedi te.
Ringraziandoti mille e mille volte per il tuo aiuto cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Selezionare stringhe determinate

Postdi Anthony47 » 20/05/21 18:40

Avessi usato, nella tua macro, Call DemoSelXA (invece di integrare il codice nella tua sub) saresti stato a posto...
Metti, subito dopo la riga DBG = False:
Codice: Seleziona tutto
Set sRng = Nothing


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

Re: Selezionare stringhe determinate

Postdi ikwae » 20/05/21 19:53

Proverò le tue indicazioni se non dovesse funzionare ti chiederò un ulteriore aiuto.
Ringraziandoti mille e mille volte per il tuo aiuto e per la tua Santa Pazienza cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14


Torna a Applicazioni Office Windows


Topic correlati a "Selezionare stringhe determinate":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti