2009-06-16 15 views
7

Desidero sostituire in blocco la parte "07" di un elenco di stringhe (numeri di telefono cellulare) con la versione internazionale "447".Sostituzione sottostringa di espressioni regolari in Microsoft Excel

L'elenco di stringhe attualmente forma un columnn in un foglio di calcolo di Excel.

ho l'espressione regolare per abbinare le stringhe che necessitano di modifica:

^07[0-9]{9}$ 

... ma non so come fare la sostituzione di cui ho bisogno.

I dati si trovano in un foglio di calcolo Excel, ma possono ovviamente essere esportati.

soluzione preferita sarebbe mantenere i dati in Microsoft Excel, ma può naturalmente essere esportato e quindi reimportato. So che TextMate ha una funzione di sostituzione di espressioni regolari. Questo può aiutarmi?

risposta

17

stavo per andare via alla ricerca di soluzioni VBA eleganti o qualsiasi altra cosa, allora ho pensato: 'Aspetta. Vogliamo solo manipolare alcuni dati in un foglio di calcolo che possediamo. Perché complicare le cose?'

Come funziona questo suono idea per voi:

  • inserire una nuova colonna dopo la colonna con i dati esistenti (supponiamo che è colonna C)

  • riempire la nuova colonna con questa formula: ="447" & RIGHT(C1, 9)

  • selezionare la colonna D (che ora contiene i nuovi valori) e incollare valori (che si trova nella finestra Incolla speciale) sulla colonna C, sostituendo i valori esistenti

  • eliminare il 'lavoro' colonna D

Non è la programmazione, ma se si ha a che fare solo una volta non avete bisogno di un programma, giusto?

+6

Dalla domanda sembra che non tutti i numeri di telefono debbano essere convertiti (cioè non tutti iniziano con 07). È sufficiente racchiudere la formula sopra in un IF per far fronte a questo: = IF (LEFT (C1,2) = "07", "447" & RIGHT (C1,9), C1) – barrowc

9

Dovrete includere Microsoft espressioni regolari nel foglio (aggiungerlo come riferimento)

poi fare una rapida macro, come la seguente, per usarlo:

Dim reg As New RegExp 
Public Function RegMatch(Source As Range, Pattern As String, Optional IgnoreCase As Boolean = True, Optional MultiLine As Boolean = True) As Long 
    Dim rng As Range, i As Long, j As Long 

    reg.IgnoreCase = IgnoreCase 
    reg.MultiLine = MultiLine 
    reg.Pattern = Pattern 

    i = 0: j = 0 
    For Each rng In Source 
     i = i + 1 
     If reg.test(rng.Value) Then 
      j = i 
      Exit For 
     End If 
    Next 
    RegMatch = j 
End Function 

Poi, semplicemente chiamare come una macro nel foglio (per esempio):

=INDEX(B6:B15, RegMatch($A$6:$A$15, $A$3)) 

Dove il primo argomento è l'intervallo, e il secondo è la sequenza (come sopra)

+0

Suggerimento, il nome completo della libreria è 'Microsoft VBScript Regular Expressions 5.5' – jeb

11

Utilizzare Excel VBA. Fare riferimento a "Microsoft VBScript Regular Expressions 5.5".

Poi fare, in un nuovo modulo regolare VBA:

Sub ReplaceMobileNumbers 
    Dim re as New RegExp 

    re.Pattern = "^0(?=7[0-9]{9}$)" ''# look-ahead 

    Dim cell As Range 
    For Each cell In ActiveSheet.Range("Your Range Address in A1:B1 notation") 
    cell.Value = re.Replace(cell.value, "44") 
    Next cell 
End Sub 

e chiamare questo sub nella finestra immediata. Quanto sopra è un codice throw-away, non progettato pensando alla riutilizzabilità. Lo so, quindi non dirmelo. ;-)

Anche se probabilmente si può ottenere via con una funzione delle cellule:

=IF(AND(LEN(A1) = 11;LEFT(A1; 2) = "07"); "44" & RIGHT(A1; 10); A1) 
+0

+1 più completo e pratico –

Problemi correlati