2011-10-01 9 views
7

Ho la frase "Vorrei 50 di quelli, per favore" nella cella A1. Voglio rendere qualsiasi carattere numerico testo rosso (solo i caratteri numerici). Come faccio a fare questo? Ecco la cornice di quello che ho ...Cambia colore di determinati caratteri in una cella

Sub RedText() 

Dim i As Integer 

For i = 1 To Len(Cells(1, 1).Value) 
    If IsNumeric(Mid(Cells(1, 1).Value, i, 1)) = True Then 
     'make the character red text 
    End If 
Next 

End Sub 

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

11

Offriamo le caratteri (inizio, lunghezza) proprietà per fare questo. È inoltre possibile memorizzare il testo in una stringa e loop su quello, che sarà più veloce quando si lavora con molte celle. Ecco un esempio:

Sub RedText() 

Dim i As Long 
Dim text As String 

text = Cells(1, 1).Value 

For i = 1 To Len(text) 
    If IsNumeric(Mid$(text, i, 1)) = True Then 
     Cells(1, 1).Characters(i, 1).Font.Color = vbRed 
    End If 
Next 

End Sub 
+0

Inoltre non è che ho usato Mid $ invece di mezza dal momento che è la versione stringa (versione non variante) della funzione. Ti darà una piccola spinta in termini di prestazioni che potrebbe aumentare se la gestisci molto, ma è una buona pratica. – aevanko

+0

Sì, il cast extra che VBA deve fare è uno spreco. Analogamente al numero intero, VBA lo lancia a lungo ogni volta, quindi non c'è alcun motivo per utilizzare un intero in VBA. – aevanko

8

È possibile utilizzare un RegExp per lo stesso effetto.

Il vantaggio dell'approccio Regex è che il codice isolerà immediatamente qualsiasi gruppo di caratteri numerici (o salta qualsiasi stringa che non ha numeri) anziché testare ogni singolo carattere.

in modo che offre un vantaggio di velocità, se si elaborano ragionevolmente grandi insiemi di dati

Sub RegExpRed() 

    Dim objRegex As Object 
    Dim RegMC As Object 
    Dim RegM As Object 

    Set objRegex = CreateObject("vbscript.regexp") 
    With objRegex 
     .Global = True 
     .Pattern = "\d+" 
     If .test(Cells(1, 1).Value) Then 
      Set RegMC = .Execute(Cells(1, 1).Value) 
      For Each RegM In RegMC 
       Cells(1, 1).Characters(RegM.FirstIndex + 1, RegM.Length).Font.Color = vbRed 
      Next 
     End If 
    End With 

End Sub 
Problemi correlati