Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Saros 20: il robot preciso e molto sottile
Roborock Saros 20: il robot preciso e molto sottile
Il nuovo robot di Roborock per l'aspirazione della polvere e il lavaggio dei pavimenti spicca per immediatezza d'uso e per l'efficacia dell'azione, grazie anche a un ridotto sviluppo in altezza. Saros 20 integra un motore da ben 36.000Pa di potenza e un sistema di lavaggio a due panni rotanti, con bracci estensibili e un sistema di navigazione molto preciso.
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS e HIFIMAN uniscono le forze per creare ROG Kithara, cuffie gaming con driver magnetici planari da 100mm, design open-back e microfono MEMS full-band. Una proposta che ambisce a coniugare fedeltà per audiofili e performance ludiche, disponibili a 319 euro
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-08-2010, 22:24   #1
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
[Vba Excel] Attivare cella il cui carattere iniziale e' Y

Salve.
lavoro con vba di excel 2003
E' da un po di tempo che mi sto cimentanto con questo problema in sostanza devo crearmi una macro (partendo da una UserForm con Combobox che visualizza le lettere dell'alfabeto) in cui solo sulla colonna A effettui una ricerca che attivi,ad esempio scegliendo da combobox la lettera B, la cella della colonna A che abbia come carattere iniziale la lettera B che magari contiene il testo Berardi.
In sostanza ho migliaia di nomi che sono spesso tutti uguali ma ordinati alfabeticamente, ogni volta che ne devo aggiungere uno o cambiare i connotati a qualche cristiano devo scrollare per kilometri il foglio excel, ora pedestremente ho creato una nuova colonna di indice che ha una lettera posta in corrispondenza del primo nome avente una lettera iniziale nuova cerco quella lettera sulla colonna relativa e il cursore va sulla riga di quel nome.
Vorrei togliermi dalle scatole quella brutta colonna di indice.


Sto lavorando con l'istruzione
Alphabetic_Column.Find(What:=Find_String).Activate

Ma chiaramente cosi' non intercetta il carattere iniziale della cella, ma il carattere comunque contenuto nel valore della cella

ho provato con

For Each ce In Range("A:A")
If ce = "Y" Then .....
Next ce

Non so se e come si puo' fare un left(range..) un left di ogni valore del range, attivando poi solo la prima cella che soddisfa la condizione.


... Help Me Please.....

Questo il codice della Form fino ad ora elaborato.

Private Sub GO_General_Choice_Letter__Button_Click()
Dim Alphabetic_Column As Range
Dim Find_String As String
Dim Fix_Part As String
Fix_Part = "°"

Set Alphabetic_Column = Range("A:A")

If Alphabetic_Menu__CMBox = "" Then
'MsgBox "Please First Choice Letter And Then Press GO Button"
GoTo Back
End If
Find_String = (Alphabetic_Menu__CMBox)

Alphabetic_Column.Find(What:=Find_String).Activate

Back:
End Sub


Estratto Base dati.

Gigliola .. Emanuele
Mariano .. luca____(alla ricerca con la lettera M vorrei che si attivasse questa cella)
Mariano .. Antonio
Mariano .. Giovanni
Mariano .. Lucilla
Mariano .. Cristina
Martino .. Lucia
Martino .. Silvano
Martino .. Angela
Marcelli .. Alfonso
Naeri .. Antonio____(alla ricerca con la lettera N vorrei che si attivasse questa cella)
Nardi .. Luca
Nardi .. Giuseppe
Nardi .. Cristiano
Paoli .. Paoletta____(alla ricerca con la lettera P vorrei che si attivasse questa cella)
Paoli .. Francesco
Paoli .. Giulia
:::::::::
ecc...
:::::::::

Ultima modifica di mauimaui4 : 17-08-2010 alle 22:30. Motivo: revisione
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2010, 12:52   #2
a2000.1
Senior Member
 
L'Avatar di a2000.1
 
Iscritto dal: Aug 2004
Messaggi: 311
10 righe e passa la paura (con il trucco)
Allegati
File Type: zip Spooler.zip (8.9 KB, 11 visite)
__________________
Senior Member
Registrato il: Jan 2001
Messaggi: 2609
a2000.1 è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2010, 16:05   #3
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
Intanto grazie

Quote:
Originariamente inviato da a2000.1 Guarda i messaggi
10 righe e passa la paura (con il trucco)

Intanto grazie, ho aperto il file e ho notato che il trucco funziona.

Appena avro' tempo implementero' la routine sul mio foglio.

Ma se ti va, e ti scappa un po di tempo, una spiegazionicina sull'astruso codice sarebbe gradita.


Vorrei domandarti un po di cose, ma non saprei da dove cominciare metto qui qualche spunto.

-Sub Punta(a$)

-If Left$(v(i, 1), 1) = a$ Then

-Ma che vuol dire = a$

+Const II = 10000 '''(Che e' sto 10000)
+v = .Range(.Cells(irow, icol), .Cells(irow + II - 1, icol))

+irow + II '''-- cosa e' come si costruisce la variabile da sto range???

(Ho Timore...... non pensavo di essere bravo in vba, Eppure fino ad oggi, non ero proprio digiuno di vba amatoriale )

Comunque grazie.
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 18-08-2010, 16:15   #4
a2000.1
Senior Member
 
L'Avatar di a2000.1
 
Iscritto dal: Aug 2004
Messaggi: 311
diciamo che è vecchia scuola

a$ è una variabile dichiarata implicitamente stringa col suffisso $ (%=integer, &=long integer, !=single precision, #=double) e contiene la lettera chiave

II=10000 è il massimo numero di righe "spazzolate", puoi estenderlo fino "alla fine dei mondi" ossia 65000 e rotti.

Il trucco è proprio in v= ecc.
Statement : in Excel-VBA per grandi quantità di dati E' VIETATO leggere o scrivere direttamente da foglio pena tempi lunghi: bisogna passare da matrici 2D variant intermedie.

Beh, allora se ti facessi vedere un po' di effetti speciali con CodeModule ...


P.S.
Ah okkio al codice in Sheet1.ChangeValue
__________________
Senior Member
Registrato il: Jan 2001
Messaggi: 2609

Ultima modifica di a2000.1 : 18-08-2010 alle 16:17.
a2000.1 è offline   Rispondi citando il messaggio o parte di esso
Old 19-08-2010, 11:17   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
...
Non so se e come si puo' fare un left(range..) un left di ogni valore del range, attivando poi solo la prima cella che soddisfa la condizione.


... Help Me Please.....
...
Era la cosa più semplice del mondo, tra l'altro.
Ammesso che la colonna da controllare sia [A:A] :

Codice:
Private Sub ComboBox1_Change()

    Dim R As Range
    For Each R In Sheets("Foglio1").Range("A:A")
        If R.Text = "" Then Exit For
        If R.Text Like ComboBox1.Text & "*" Then
            R.Select
            Exit For
        End If
    Next R
    
End Sub
Si può fare tutto con l'operatore Like, disponibile "alla Sql" nel set di comandi base di VBA per tutti i valori String e Variant. Comodo no ?

Altra cosa : EVITARE le dichiarazioni implicite.
&, %, #, e compagnia sono retaggio di VB veramente antico. Inoltre rendono il codice, se complesso, davvero illeggibile. "Dim s As String" è infinitamente meglio che usare $. E vedrete che non vi consumate le dita...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 19-08-2010, 14:46   #6
a2000.1
Senior Member
 
L'Avatar di a2000.1
 
Iscritto dal: Aug 2004
Messaggi: 311
i codici, quelli seri, deveno essere corti e girare veloci.
ed il mio è più veloce del tuo (prova su diciamo una decina di fogli di dati pieni).

le dichiarazioni implicite vanno bene ed anzi così come in Fortran (altro genere ) tutte le variabili i,j,k sono intere e TUTTE le altre double (con le dovute eccezioni).
la leggibilità può e deve andare a f.

P.S.
se non sai delle funzioni matrix like e mooolte altre cose I suppose, non devi prendere di aceto.
__________________
Senior Member
Registrato il: Jan 2001
Messaggi: 2609

Ultima modifica di a2000.1 : 19-08-2010 alle 14:52.
a2000.1 è offline   Rispondi citando il messaggio o parte di esso
Old 19-08-2010, 15:29   #7
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da a2000.1 Guarda i messaggi
i codici, quelli seri, deveno essere corti e girare veloci.
ed il mio è più veloce del tuo (prova su diciamo una decina di fogli di dati pieni).
Codice:
Sub Punta(a$)
 Const II = 10000
 Dim v As Variant
  With Worksheets("Sheet1")
  
  irow = .Range("d_Pivot").Row - 1
  icol = .Range("d_Pivot").Column
  v = .Range(.Cells(irow, icol), .Cells(irow + II - 1, icol))
  For i = 1 To II
   If Left$(v(i, 1), 1) = a$ Then
    .Cells(irow + i - 1, icol).Activate
    Exit Sub
   End If
  Next i
    
 End With

End Sub

E tu questa schifezza la chiami "codice serio" ?!
Rimettici le mani - o chiedi al tuo povero "cliente" di metterci le mani - dopo un mesetto da che l'hai scritta, e poi... sparatevi !
Vai nella guida VBA di Excel e lì troverai un esempio molto simile al mio, con For Each, e l'uso di Like.

Quote:
Originariamente inviato da a2000.1 Guarda i messaggi
le dichiarazioni implicite vanno bene ed anzi così come in Fortran (altro genere ) tutte le variabili i,j,k sono intere e TUTTE le altre double (con le dovute eccezioni).
E resta con Fortran. Sicuramente lo conosci molto meglio che VB.
Le dichiarazioni implicite sono robetta da VB4, massimo VB5. Vanno bene per codici compatti, o all'interno di Subs o Functions limitate. Una dichiarazione esplicita inoltre abitua già al passaggio a VB.NET, tanto per dire. Dichiarazioni implicite in VB.NET comportano la censura, nonchè l'amputazione delle mani, non lo sai ?

Quote:
Originariamente inviato da a2000.1 Guarda i messaggi
la leggibilità può e deve andare a f.
Significa ?
Andare a quel paese ?
La leggibilità del codice ?! Ma DOVE vivi ?
Ma MAI, e poi MAI. La leggibilità è garanzia di riutilizzabilità, ed è TUTTO. E soprattutto in un linguaggio come VBA, procedurale, basato e non orientato agli oggetti. E se non sai questo, torna a scuola.

Quote:
Originariamente inviato da a2000.1 Guarda i messaggi
se non sai delle funzioni matrix like e mooolte altre cose I suppose, non devi prendere di aceto.
Non capisco l'atteggiamento vagamente "aggressivo".
Ho postato una soluzione alternativa, non pretendo certo sia l'unica, e ti faccio notare che chi ha aperto il thread ha parlato di ComboBox su UserForm, non di quella specie di filtro su Foglio che hai fatto tu.
Più che andare in aceto, sono abbastanza divertito.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2010, 11:44   #8
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
E' da un po di tempo che mi sto cimentanto con questo problema in sostanza devo crearmi una macro (partendo da una UserForm con Combobox che visualizza le lettere dell'alfabeto) in cui solo sulla colonna A effettui una ricerca che attivi,ad esempio scegliendo da combobox la lettera B, la cella della colonna A che abbia come carattere iniziale la lettera B che magari contiene il testo Berardi.

...

Sto lavorando con l'istruzione
Alphabetic_Column.Find(What:=Find_String).Activate

Ma chiaramente cosi' non intercetta il carattere iniziale della cella, ma il carattere comunque contenuto nel valore della cella

...
E qui invece la tecnica usando il metodo Find.
Poniamo di avere migliaia di nomi in colonna A su Foglio1.
Anzitutto, affinchè Find funzioni correttamente, è necessario selezionare la prima cella utile nel Range di ricerca, nel nostro caso A1 su colonna [A:A], perciò :

Codice:
Private Sub UserForm_Initialize()

    Sheets("Foglio1").Range("A1").Activate
    
End Sub
A questo punto il codice per la ComboBox è semplicissimo :

Codice:
Private Sub ComboBox1_Change()

    Dim iniziale As String
    iniziale = ComboBox1.Text
    
    On Error Resume Next
    Sheets("Foglio1").Range("A:A").Find(What:=iniziale & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
                                        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

End Sub
Facendo un rapido test su Foglio con 60'000 voci in colonna A, la ricerca con Find risulta istantanea, perciò consiglio decisamente quest'ultima.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2010, 20:03   #9
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
E qui invece la tecnica usando il metodo Find.
Poniamo di avere migliaia di nomi in colonna A su Foglio1.
Anzitutto, affinchè Find funzioni correttamente, è necessario selezionare la prima cella utile nel Range di ricerca, nel nostro caso A1 su colonna [A:A], perciò :

Codice:
Private Sub UserForm_Initialize()

    Sheets("Foglio1").Range("A1").Activate
    
End Sub
A questo punto il codice per la ComboBox è semplicissimo :

Codice:
Private Sub ComboBox1_Change()

    Dim iniziale As String
    iniziale = ComboBox1.Text
    
    On Error Resume Next
    Sheets("Foglio1").Range("A:A").Find(What:=iniziale & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
                                        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

End Sub
Facendo un rapido test su Foglio con 60'000 voci in colonna A, la ricerca con Find risulta istantanea, perciò consiglio decisamente quest'ultima.


Ho postato una soluzione alternativa, non pretendo certo sia l'unica, e
ti faccio notare che chi ha aperto il thread ha parlato di ComboBox su UserForm, non di quella specie di filtro su Foglio che hai fatto tu.
Sono andato via per brevi ferie.
Intanto ringrazio tutti coloro che si sono adoperati alle risposte, In effetti ho provato il codice postato come zip e funziona bene su quel foglio.
Non ho le dovute conoscenze di VBA per commentare quella routine, tuttavia ho provato ad impementarla anche con alcuni aggiustamenti ideati in varia maniera sulla mia combobox in userform, ma niente, non so come farla funzionare
(La combobox per me e' essenziale perche' il foglio e' diviso in 2 settori una prima sezione che riguarda un argomento e da una certa cella contenete la scritta V A R I O U S contenete altri elementi quindi attivere pedestremente la cella con quella parola chiave e da li farei iniziare la routine per la seconda combobox procedendo verso il basso) spero di essermi spiegato, ma questo e' un dettaglio).

Ad ogni modo provero' appena ho un po' di tempo il codice di Marco-DoubleG
Per ora ringrazio.
Commento cosi' senza aver provato il nuovo codice da voi postato, in quaunto non sono solito aprire thread e poi sparire, come avrebbe potuo fin qui sembrare.

Grazie ancora
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2010, 23:03   #10
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
3 Punti da chiarire quando potete.

Ho completato il codice perfettamente funzionante su una userform per due combobox visto che lo stesso foglio era diviso in 2 sezioni.

Ora avrei da chiedere dei consigli:

---1---
Ho trovato pero' dei problemi:
come puoi vedere il mio modo di programamre pedestre implica l'allungamento delle routines, in particolare si nota che:
Ho eseguito un set, per cui, Nel caso di una iniziale non trovata in nessuna cella attivo la cella avente come carattere iniziale la lettera A.


quindi faccio un set di_variabile con il find
se va male attivo cella con iniziale A

Se va bene per attivare la cella pedestremente mi tocca rieseguiire il codice di find dopo else.


DOMANDA:
Per snellire la questione, Come faccio a evitare di fare il find 2 volte sulle stesse celle
cioe' evitando quello dopo Else attivando subito la cella buona???


Set Find_Letter = Alphabetic_Classic_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

If Find_Letter Is Nothing Then
Find_String = "A"
Alphabetic_Classic_Title.Find(What:=Find_String & "*").Activate
Exit Sub
Else
Alphabetic_Classic_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
End If


---2---
In un caso, ho alcune (poche) celle che hanno come carattere iniziale dei numeri es.
2 Brothers on the 4th Floor
49 Ers
Come faccio a dirgli alla svelta ad es. se il valore di ComboBox vale 0 attivami la prima cella il cui carattere iniziale e' un numero qualunque da 0 9. (le celle sono formato testo se puo' interessare)
Qui le espressioni regolari come si scrivono?

con unix standard Vi sarebbe come dire
^[0-9]


---3---
Se ricordi in passato ho scritto:

Sto lavorando con l'istruzione
Alphabetic_Column.Find(What:=Find_String).Activate

Ma chiaramente cosi' non intercetta il carattere iniziale della cella, ma il carattere comunque contenuto nel valore della cella

Per curiosita' nella sintassi posta da te:

Alphabetic_Classic_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

Cosa e' che permette di avere la ricerca effettuata come carattere iniziale quello della variabile Find_String e non come testo ovunque contenuto in cella e' solo il fatto di aver posto una variabile come iniziale e poi "*" che impone la ricerca con l'iniziale di quel valore?
Se avessi voluto cercare un testo la cui lettera finale fosse stata quella contenuta nella variabile End_String come avrei dovuto scrivere???

Grazieeeee.

L'aiuto di queste istruzioni e' stato prezioso

Ultima modifica di mauimaui4 : 24-08-2010 alle 23:05. Motivo: Revisione
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 13:48   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
---1---
...
DOMANDA:
Per snellire la questione, Come faccio a evitare di fare il find 2 volte sulle stesse celle
cioe' evitando quello dopo Else attivando subito la cella buona???
...
Non ho capito con esattezza il problema. In generale il Find() è velocissimo, perciò non mi preoccuperei troppo di questo.
Sicuramente il tuo codice si può migliorare...

Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
---2---
Come faccio a dirgli alla svelta ad es. se il valore di ComboBox vale 0 attivami la prima cella il cui carattere iniziale e' un numero qualunque da 0 9. (le celle sono formato testo se puo' interessare)
"Alla svelta" non penso. Stavo cercando una wildcard da passare come argomento alla Find(), ma vedo che è una cosa macchinosa.
Prova a dare un'occhiata anche alle funzioni VLookup, HLookup, Lookup, Match, e fammi sapere...

Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
---3---
Cosa e' che permette di avere la ricerca effettuata come carattere iniziale quello della variabile Find_String e non come testo ovunque contenuto in cella e' solo il fatto di aver posto una variabile come iniziale e poi "*" che impone la ricerca con l'iniziale di quel valore?
Se avessi voluto cercare un testo la cui lettera finale fosse stata quella contenuta nella variabile End_String come avrei dovuto scrivere???
Esatto.

Se vuoi cercare tutte le stringhe che finiscono con un carattere ( o sottostringa ) "X", basterà invertire : "*" & "X".
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 16:45   #12
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
Grazie per le 3 risposte.

Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Non ho capito con esattezza il problema. In generale il Find() è velocissimo, perciò non mi preoccuperei troppo di questo.
Sicuramente il tuo codice si può migliorare...
.
Mi pare una eresia o un'offesa all'intelligenza scrivere sta cosa:
Faccio un find lo metto in una variabile Find_letter punto -1- poi gli dico se il find non va a buon fine Rifai un find per la lettera A che sicuro ci sta.
fin qui nulla di male.
Ma se invece quel find trova una lettera buona in una delle celle allora riesegiui lo stesso find che ho appena fatto e che ha dato valore alla varibile Find_letter (punto --2--) ma stavolta il find lo esegui per attivare la cella che da esito positivo a quel find

BO???? Mi suona davvero male.
Vabbeh
Io sono Vba amatoriale vado avanti carponi e via.


'--1---
Set Find_Letter = Alphabetic_Classic_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)

If Find_Letter Is Nothing Then
Find_String = "A"
Alphabetic_Classic_Title.Find(What:=Find_String & "*").Activate
Exit Sub
Else
'--2--
Alphabetic_Classic_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
End If



Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
"Alla svelta" non penso. Stavo cercando una wildcard da passare come argomento alla Find(), ma vedo che è una cosa macchinosa.
Prova a dare un'occhiata anche alle funzioni VLookup, HLookup, Lookup, Match, e fammi sapere...
.
Cerchero' sulla base degli spunti che mi hai dato,
Mi sembrava la cosa piu' normale del mondo poter scrivere una regular expression con un linguaggio che suole chiamarsi di programmazione del resto si usano normalmente nello unix shell script in Perl in Delphi in PHP e non so se esistono anche i C (non sono un programmatore ma un sistemista) te pareva che su mafiasoft n'ce fossero? ..... Si !!!!......
Senno' non funzianvano cosi' i grandiosi tools di Mafiasoft.

Solo per polemizzare:
questo e' uno stralcio di quanto leggo in una documentazione sull'uso di un programma che tratta anche le regular expression nei find e nelle modifiche articolate di blocchi di nomifile.
----Regular expressions are a very powerful search tool. They allow to search for complex classes of words. Regular expressions are mainly meant for professionals, but can also be useful in the office for finding certain documents (see examples below).
Regular expressions consist of normal characters and special characters, so-called meta-characters. The following characters are meta-characters or initial parts of meta-characters:
. \ ( ) [ ] { } ^ $ + * ? (-----


Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
Esatto.

Se vuoi cercare tutte le stringhe che finiscono con un carattere ( o sottostringa ) "X", basterà invertire : "*" & "X"
.
Grazie per questa delucidazione che avevo intuito ad occhio volevo solo essere sicuro di aver capito bene, prima delle tue routine non ci sarei mai arrivato che se avessi utilizzato una variabile seguita da "*" avrebbe rispettato l'ordine in sequenza del pattern.

Grazie mille davvero per tutto.
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 18:27   #13
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
Mi pare una eresia o un'offesa all'intelligenza scrivere sta cosa:
Faccio un find lo metto in una variabile Find_letter punto -1- poi gli dico se il find non va a buon fine Rifai un find per la lettera A che sicuro ci sta.
fin qui nulla di male.
Ma se invece quel find trova una lettera buona in una delle celle allora riesegiui lo stesso find che ho appena fatto e che ha dato valore alla varibile Find_letter (punto --2--) ma stavolta il find lo esegui per attivare la cella che da esito positivo a quel find

BO???? Mi suona davvero male.
Ma infatti E' un'eresia.
Questo è il tuo personale modo di approcciare il problema, e non ne vedo l'utilità. Se è un problema di gestione dell'errore ( perchè è possibile che Find() vada in errore se non trova nulla ), ce la si cava semplicemente con un GoTo. Questo è il mio codice precedente, modificato :

Codice:
Private Sub ComboBox1_Change()

    Dim iniziale As String
    iniziale = ComboBox1.Text
    
    On Error GoTo ERRORE
    Sheets("Foglio1").Range("A:A").Find(What:=iniziale & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
                                        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate
    Exit Sub
    
ERRORE:
    MsgBox ("Nessuna occorrenza trovata. La selezione torna alla prima cella nell'intervallo di ricerca.")
    Sheets("Foglio1").Range("A1").Activate

End Sub
e il gioco è fatto. Il Find() viene comunque eseguito una sola volta.

Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
Mi sembrava la cosa piu' normale del mondo poter scrivere una regular expression con un linguaggio che suole chiamarsi di programmazione del resto si usano normalmente nello unix shell script in Perl in Delphi in PHP e non so se esistono anche i C (non sono un programmatore ma un sistemista) te pareva che su mafiasoft n'ce fossero? ..... Si !!!!......
Senno' non funzianvano cosi' i grandiosi tools di Mafiasoft.
Le Regex non sono supportate in modo nativo in VBA, del resto non lo sono nemmeno nel "papà" VB6.
Non è corretto però dire che non lo siano per niente. Ad esempio dai un'occhiata a questo file di esempio :
http://www.vbaexpress.com/kb/getarticle.php?kb_id=68

VBA è un linguaggio di programmazione basato su oggetti, non è OO. E' di notevole supporto ad applicazioni Office. Non dimentichiamo che Excel è pur sempre un foglio elettronico, e cara grazia che c'è VBA.
Trovami un foglio elettronico meglio di Excel, più completo di Excel, e con migliore supporto all'automatizzazione, e ne riparliamo.

Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
Solo per polemizzare:
...
Infatti è solo per polemizzare.
Ma più che altro è questione di abitudine e di aver saputo apprezzare nel tempo quanto di buono c'è in Office e in VBA. Personalmente non passerei mai a Calc di OpenOffice ( che ho provato, trovandolo abbastanza deludente sul piano dell'automatizzazione ) o ad altri fogli elettronici.

Tornando al Find() di prima, appena ho tempo vedo di studiare una soluzione, perchè non mi pare vero che non ci sia un semplice carattere wildcard da passare in argomento come "qualsiasi_cifra_numerica[0-9]"...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 02:04   #14
mauimaui4
Member
 
Iscritto dal: Jan 2008
Messaggi: 80
Tutto Risolto.

Non conoscevo l'istruzione --on error goto--
Con questa istruzione non mi servono piu' le espressioni regolari, questo perche' i numeri compaiono prima delle lettere alfabetiche e quindi in caso di errore attivo sempre la cella iniziale che sara' quella che inizia con i numeri.
Questo e' uno stralcio della parte centrale essenziale del codice.
Un solo find e un on_error

Main_Name_Column = "A R T I S T S"
Second_Title = "C L A S S I C A L S O U N D S"

Alphabetic_Column.Find(What:=Main_Name_Column).Activate
F_Row_M = (ActiveCell.Row + 1)
F_Column_M = ActiveCell.Column

Alphabetic_Column.Find(What:=Second_Title).Activate
Last_Find_Cell = ActiveCell

Set Alphabetic_Column_Main_Title = Range(Cells(F_Row_M, F_Column_M), Cells(L_Row_M, L_Column_M))

Find_String = Alphabetic_Menu_Main__CMBox.Text
'In caso di errore prima lettera non trovata sulla colonna anche in caso di iniziale con numero
'vado al punto Letter_Not_Found che mi attiva la cella appena sotto la barra dei titoli
On Error GoTo Letter_Not_Found

Alphabetic_Column_Main_Title.Find(What:=Find_String & "*", After:=ActiveCell, LookIn:=xlValues, LookAt:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False).Activate

Exit Sub

Letter_Not_Found:
Cells(F_Row_M + 2, F_Column_M).Select


Quanto al fatto che dicevi che per buona grazia dell'esistenza di vba si puo' automatizzare un ambiente come office; mi pare tu abbia lo stesso approccio di un mio collega programmatore C ; a cui quando mi lamentavo ad es. dell'astruso modo di passare una variabile esterna a sed
a=2;sed -n -e "${a}p"
Molto diversa poi dal modo di passarla in AWK
a="Marking Mov"; ls -l|awk '{print $5,"'”$a”'"}'
Lui mi rispondeva ringrazia il cielo che esiste un tool tanto potente come sed & awk cui puoi passare una variabile esterna cosi', e questa risposta era la kostante risposta a qualunque cosa gli dicessi.

Come tool non ho mai utilizzato niente al di fuori di excel mi dicevano che openoffice era uguale ad excel; mi sono meravigliato alquanto quando ho scoperto che le macro anche le piu' semplici non funzionavano su openoffice.
Mi pare pero' non ci sia nulla da meravigliarsi visto che microsoft ha inventato il suo vba.
Personalmente su excel ci ho fatto un sacco di cose anche quelle per cui non e' stato propriamente sviluppato; sopratutto nel trattamento testuale, alcune cose le ho potute fare solo su excel e non su Access o Sql.
Anche se di media nel trattamento testuale trovo piu' immediato e anche meno macchinoso sed egrep Awk Nawk e Vi

Ho dato una occhiata al tuo lnk sulle espressioni regolari, e' molto interessante quel file, anche se per me non e' facile orientarmici. Grazie tante per tutto l'aiuto che mi hai fonito.

Ultima modifica di mauimaui4 : 31-08-2010 alle 02:14.
mauimaui4 è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2010, 10:39   #15
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da mauimaui4 Guarda i messaggi
Come tool non ho mai utilizzato niente al di fuori di excel mi dicevano che openoffice era uguale ad excel; mi sono meravigliato alquanto quando ho scoperto che le macro anche le piu' semplici non funzionavano su openoffice.
Mi pare pero' non ci sia nulla da meravigliarsi visto che microsoft ha inventato il suo vba.
Personalmente su excel ci ho fatto un sacco di cose anche quelle per cui non e' stato propriamente sviluppato; sopratutto nel trattamento testuale, alcune cose le ho potute fare solo su excel e non su Access o Sql.
OpenOffice, che io sappia, ha 2 linguaggi di scripting : una sorta di "Basic" ( che ho provato, trovandolo appunto deludente ), e Python ( non so se sia il vero Python, o un subset che gli somiglia, perchè non ho approfondito ).

La mia preferenza su Excel ha diverse ragioni oggettive, ( al di là di un semplice "a me piace Microsoft", come potrebbe sembrare ) come la completezza dell'interfaccia utente e delle funzioni precucinate, e su VBA basti pensare alla possibilità di estendere il set di comandi base con una pletora di dll esterne, arrivando quasi a coprire tutte le possibilità offerte da VB6.

Il paragone con Access lo condivido. Ho sempre trovato il supporto VBA di Excel come il migliore dell'intero pacchetto Office. Il paragone con Sql non l'ho capito...
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
La missione NASA Lunar Trailblazer &egra...
Gli astronauti di Artemis II utilizzeran...
Una parte del razzo spaziale SpaceX Star...
Phanteks Glacier One 360M25-LCD: raffred...
La NASA rivede lo svolgimento della miss...
Addio alle esclusive PlayStation su PC? ...
PS5 Pro con PSSR aggiornato: nuova gener...
Altro che entry-level: a 198€ questo ECO...
Aliro 1.0: il nuovo standard aperto per ...
Primo contatto con Mazda CX-6e: con la p...
Le novità di HPE al MWC: arrivano...
vivo sarà al MWC 2026 con X300 Ul...
Jack Dorsey taglia il 40% di Block: 4.00...
Zscaler acquisisce SquareX e porta il ze...
Qualcomm non presenterà novit&agr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 06:01.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v