2012-05-04 5 views
2

J'ai une feuille de calcul que je reçois régulièrement avec un grand nombre de cellules contenant des noms. Certaines cellules ont un nom complet, y compris une initiale avec une période.Caractère générique dans la chaîne

Par exemple:

Springer, Jerry A.

Chaque maintenant et puis si la feuille que je reçois aura les éléments suivants:

Springer, Jerry.

Je dois me débarrasser de ces initiales du milieu, mais aussi vérifier que je viens de supprimer le "." si c'est là.

Pardonnez-moi mon manque de logique propre, mais je le sous-ca ca suivant:

Sub DeleteMiddleI() 
Dim nr1, nr2 As Range 
Dim col As Integer 

col = 1 
Set nr1 = Cells(65536, col).End(xlUp) 
Set nr2 = Cells(col, 1) 

Do While nr2 <> nr1 
    'Check to be sure the cell isn't empty 
    If Len(nr2) <> 0 Then 
     'Check to see if the last character is a "." 
     If Right$(nr2, 1) = "." Then 
      'Check and be sure there is a character before the "." 
      If InStr(1, nr2.Text, "[A-Z].") > 0 Then '<<<<<<CODE BREAKAGE 
       nr2 = Left$(nr2, Len(nr2) - 3) 
      End If 
     End If 
    End If 

    col = col + 1 
    Set nr2 = Cells(col, 1) 
Loop 

End Sub 

Il brise le

Si InStr (1, nr2.Text, " [AZ]. ") 0 Puis

Je me sens stupide ... mais qu'est-ce qui me manque?

Répondre

4

Cela aiderait-il? Cela remplacerait tous les "." avec rien.

Option Explicit 

Sub Sample() 
    Sheets("Sheet1").Cells.Replace What:=" .", Replacement:="", LookAt:=xlPart, _ 
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 
End Sub 

EDIT

Que vouliez-vous dire en enlevant une partie des initiales? Voulez-vous dire changer Springer, Jerry A. en Springer, Jerry ou Springer, Jerry . en Springer, Jerry

Si oui, cela serait-il utile?

Option Explicit 

Sub Sample() 
    Dim LastRow As Long 
    Dim Pos As Long, i As Long 

    With Sheets("Sheet1") 
     LastRow = .Range("A" & Rows.Count).End(xlUp).Row 

     For i = 1 To LastRow 
      Pos = InStr(1, .Range("A" & i).Value, ", ") + 2 
      If Pos > 2 Then 
       Pos = InStr(Pos, .Range("A" & i).Value, " ") 
       If Pos > 0 Then .Range("A" & i).Value = Mid(.Range("A" & i).Value, 1, Pos - 1) 
      End If 
     Next i 
    End With 
End Sub 
+0

vous êtes suggestion de prendre "Springer, Jerry A." et aussi "Springer, Jerry". "Springer, Jerry" est exactement ce que je cherche à accomplir. Je vais tester ce code et voir si je peux le faire fonctionner. Je vous remercie. – JHizzal

+0

Fonctionne comme un charme. Merci Siddharth Rout – JHizzal

+0

Ce qui précède peut être atteint avec une formule aussi bien :) –

0

Pourriez-vous changer le si le test de:

If Right$(nr2, 1) = "." Then 

à

If (Right$(nr2, 1) = "." AND Left$(nr2, 1) <> ".") Then 
+0

Le seul problème avec ceci est qu'il supprimera toujours une partie d'un nom au format "Last, First."; Cela deviendra "Last, First", au lieu de "Last, First" comme j'essaie de trouver. Merci pour l'aide – JHizzal

Questions connexes