Excel VBA: la ricerca di una stringa per trovare il primo carattere del testo

Cellule contengono una miscela di caratteri all’interno di una stringa, ad esempio:

Abcdef_8765

QWERTY3_JJHH

Xyz9mnop

Ho bisogno di trovare il primo non A-Za-z carattere in modo che io possa rimuovere la successiva resto della stringa.

In modo che i risultati sarebbero:

Abcdef

QWERTY

Xyz

So come fare questo, se non so esattamente il personaggio che sto cercando, ma io non sono intuitivamente cogliere come trovare QUALSIASI carattere diverso A-Za-z.

Btw, questo è destinato ad essere utilizzato all’interno di un soluzione.

====================

EDIT:

Ho avuto successo con i seguenti…

a = "abc123"
b = Len(a)

For x = 1 To b

c = (Mid(a, x, 1) Like "[a-zA-Z]")
If c = False Then
d = Left(a, x - 1)
Exit Sub
End If

Next x

Ho inciampato su una soluzione adatta, o è destinato a rompersi?
Mi domando solo perché guardo Doug Glancy soluzione e sembra molto più consistenti.
(btw, non ho ancora testato Doug soluzione)

  • Come Doug suggerisce, Regex è la strada da percorrere. Se l’esempio di modello non si adatta si può facilmente adattare.
  • Si può fare come sopra, ma per l’uso ripetitivo il carattere per carattere la ricerca è più lento, e il espressione sarà più facilmente in grado di gestire più complesso di regole di analisi.
  • 2 punti di grazie. Prima di tutto grazie per la modifica al mio post. Io assicurarsi di incorporare blockquotes in un modo simile sui posti di futuro. In secondo luogo, grazie per la tua regex soluzione. Gestisce il preciso tipo di dati a cui facevo riferimento nel mio post.
InformationsquelleAutor 5th4x4 | 2013-11-30



4 Replies
  1. 3

    sembra di seguito per rimuovere il primo non A-Z carattere.

    Function StrChange(strIn As String) As String
    Dim objRegEx As Object
    
    Set objRegEx = CreateObject("vbscript.regexp")
    With objRegEx
        .ignorecase = True
        .Pattern = "^([a-z]+)([^a-z].*)"
        .Global = True
         StrChange = .Replace(strIn, "$1")
    End With
    End Function
    • +1 Bella Dave. Ma non riuscirà a 5_ABCD. So che OP non specificare che la cella può iniziare con un numero così però.
    • Vedere questo esempio
    • Aggiunto questo modello per la stringa non valida – "^([a-z]+)([^a-z].*)" così eventuali non corrispondenze sono intatte. La prima versione non ha in realtà falliti, come 5_ABCD è stato ancora restituito come 5_ABCD. Ma altre voci di stringhe come 5_ABCD_FRED_0 sarebbe stato parzialmente modificato (anche se nessun messaggio di errore).
    • Dave, ma la mia comprensione è che non deve restituire nulla per dire 5_Siddharth_Rout
    • Sid, stavo lavorando sul presupposto stringhe sarebbe manipolato se abbinati, altrimenti lasciato solo. Così l’ho lasciato intatto. Se è richiesto di essere annullato, poi vorrei aggiungere un Test per il Regexp
    • Per il tipo di dati che sto lavorando con questa soluzione si adatta al bisogno ESATTAMENTE. Molte grazie! Ho usato regex nel foglio di lavoro di livello in google docs, ma non ho mai fatto così all’interno di una VBA – soprattutto a causa della complessità delle soluzioni che ho incontrato in passato. Ma questa soluzione è dritto al punto, e io non sono a disagio lo si utilizza, perché sento che posso capire abbastanza facilmente. Quelli di voi che (ovviamente!) sapere queste cose bene non può fatica a seguire alcune di queste soluzioni, ma per la regex novizio, il “dritto al punto” la soluzione è sempre la migliore 🙂

  2. 6

    Ecco un modo semplice che non fa uso di espressioni regolari. Sono volutamente non usando l’espressione regolare come le altre due risposte sono basate su espressioni regolari. RegEx è sicuramente più veloce, ma questo è quasi altrettanto veloce. La differenza di velocità è quasi trascurabile.

    Function GetWord(Rng As Range)
        Dim i As Long, pos As Long
    
        For i = 1 To Len(Rng.Value)
            Select Case Asc(Mid(Rng.Value, i, 1))
                Case 65 To 90, 97 To 122
                Case Else: pos = i: Exit For
            End Select
        Next i
    
        GetWord = Left(Rng.Value, pos - 1)
    End Function

    Utilizzo:

    =GetWord(A1)

    Excel VBA: la ricerca di una stringa per trovare il primo carattere del testo

    MODIFICA:

    Di follow-up commenti. Perfezionato il codice (per gentile Concessione di @brettdj) .

    Function GetWord(Rng As Range)
        Dim i As Long, pos As Long
        Dim sString As String
    
        sString = UCase$(Rng.Value)
    
        For i = 1 To Len(sString)
            Select Case Asc(Mid$(sString, i, 1))
            Case 65 To 90
            Case Else: pos = i: Exit For
            End Select
        Next i
    
        GetWord = Left(Rng.Value, pos - 1)
    End Function

    Più Di Follow-Up.

    Qui c’è qualcosa che non avevo mai provato prima. Ho fatto una prova reale del mio codice vs RegXp e sono stato sorpreso di vedere il mio codice è stato più veloce di RegXp che io non avevo previsto.

    Ho testato su 10k e celle ogni cella aveva una stringa di 2256 di lunghezza

    La stringa che ho messo nella Cella A1:A10000 è

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5RoutaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeSiddharth5Rout

    Excel VBA: la ricerca di una stringa per trovare il primo carattere del testo

    Poi ho eseguito questo test

    Excel VBA: la ricerca di una stringa per trovare il primo carattere del testo

    • “La differenza di velocità è quasi trascurabile” – dipende da quanto tempo le stringhe sono e quanti ne hai 🙂 Utilizzando Mid$ e, forse, Ucase$ in modo che la ricerca 1 non 2 ASC fasce di ritoccare un po ‘ più
    • Yup Buon Punto!
    • Ho fatto un piccolo test e il mio codice è stato più veloce di Espressione. Aggiornamento post sopra in pochi minuti
    • Molto interessante. Anche se c’è un relativamente presto uscire dal tuo 2256 stringa di lunghezza (in posizione 291) per il ciclo. L’altro problema sarebbe la o/h chiamando l’oggetto RegExp 10000 volte, definendola una volta in una variante matrice di aiuto penso
    • Yup. anche se si spingere verso la fine, mi.e non caratteri di testo a 2054 ° posizione quindi RegXp è solo 1 secondo più veloce del precedente test scanario. Così possiamo tornare a "The difference in speed is almost negligible" 😀
    • Uhm, l’idea di cercare sia su una matrice sembra piuttosto allettante 🙂
    • Ehi… che non prova la MIA soluzione!!!! 😉 Molto impressionante brainstorming ragazzi!
    • D’accordo,ed è proprio quello che intendevo 🙂 sarei curioso di vedere su un base se la rimozione, l’espressione regolare il carico con la variante si muove al di là di trascurabile.

  3. 1

    È possibile utilizzare una semplice espressione regolare per specificare un numero seguito da nulla e utilizzare questa funzione per sostituire ciò che corrisponde al pattern:

    Function Regex_Replace(strOriginal As String, strPattern As String, strReplacement, varIgnoreCase As Boolean) As String
    Dim objRegExp As Object
    
    Set objRegExp = CreateObject("vbscript.regexp")
    With objRegExp
        .Pattern = strPattern
        .IgnoreCase = varIgnoreCase
        .Global = True
    End With
    
    Regex_Replace = objRegExp.Replace(strOriginal, strReplacement)
    Set objRegExp = Nothing
    End Function

    Si possa chiamare così:

    Sub DeleteAfterNums()
    Dim cell As Excel.Range
    
    'Change "Selection" to your range
    For Each cell In Selection
    '"\d.+" is a numeral and whatever follows it
    cell.Value = Regex_Replace(cell.Value, "\d.+", "", True)
    Next cell
    End Sub
    • Grazie Doug. Non ho provato ancora, ma gestisce solo i numeri ma non i caratteri come la sottolineatura o trattini o barre rovesciate, ecc giusto? Perché ho bisogno di isolare il più a sinistra di a-zA-Z solo. Qualsiasi altro personaggio (non solo numeri) deve essere trovato e analizzato. Btw, io ho modificato il mio post originale con il codice che ha finora testato per bene che hanno bisogno.
    • + 1 Ben fatto 🙂 il codice funziona quando il cellulare inizia con un numero, per esempio 5_ABCD. Tuttavia, il codice non funzionerà su sidffgS_5gfsfdgsfdg
    • Vedere questo esempio
    • 5th4x4, come è ormai chiaro, la vostra comprensione dei limiti della mia risposta è corretta. Sembra che ho due altri buoni, oltre a quello che avete scoperto da soli, per arrotondare fuori.
  4. 0

    Qui è un leggero e veloce metodo che evita la regex/riferimento aggiunte, aiutando il sovraccarico e trasportabilità dovrebbe essere un vantaggio.

    Public Function GetText(xValue As String) As Variant
    
    For GetText = 1 To Len(xValue)
        If UCase(Mid(xValue, GetText, 1)) Like "[!A-Z]" Then GetText = Left(xValue, GetText - 1): Exit Function
    Next
    
    GetText = xValue
    
    End Function

    Questo viene chiamato utilizzando GetText(“Presentazione Stringa”) da vba o presentato con un “=” dall’interno di una cella della formula.

Lascia un commento