Caractères invalides dans une liste de noms

Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010 - 2 nov. 2009 à 15:00
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 - 3 nov. 2009 à 16:19
Bonjour bonjour tout le monde,

J'ai un tableau sous excel, avec deux colonnes. Dans la première, ont met souvent à jour des services par des copiers coller. Je voudrais grâce à une macro, pouvoir contrôler et si besoin "renommer" les noms qui poserons problèmes plus tard, genre les 'sans noms', les + de 31 caractères, les caractères interdits etc...

Donc j'ai commencé ma macro, mais je n'ai pas bien l'habitude de ces fonctions là donc voici ce que j'ai fais :
Sub ValideNomService()
  
   Sheets("Base").Activate
   Range("A2").Select
   'pour chaque cellule dans la 1ère
   'colonne de la plage nomée "bd_noms"
   Dim i As Byte
   Dim services As Range
     For Each services In ActiveSheet.Range("bd_noms").Columns(1).Cells
            'si le nom comprend des caractères interdits -> espace
            For i = 1 To Len(services)
             Select Case Mid(services, i, 1)
               Case ":", "/", "", "?", "*", "[", "]": Mid(Nom, i, 1) = " "
             End Select
             'si le nom est trop long -> tronquer à 31 caractères
             If Len(services) > 31 Then
             services = Left(services, 31)
             End If
          Next
      Next
End Sub

9 réponses

Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010
2 nov. 2009 à 15:01
oups,

donc fin du message :
ma macro tourne en boucle sur la cellule "a2" et ne modifie rien.

Donc si vous pouviez m'orienter ce serai sympa
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 nov. 2009 à 16:38
Salut
Faute d'innattention : Le Mid ne modifie pas la bonne variable.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
2 nov. 2009 à 16:57
Hé hé !

Bien vu, Jack ! Il modifie la favriable nom
0
Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010
3 nov. 2009 à 09:01
Arf, ben déjà si je fais même pas attention à ce que je met...

Je change ça et je remets mon code

Merci Jack et jmf0
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010
3 nov. 2009 à 10:35
Bon j'ai fait quelques retouches mais je n'arrive pas à comprendre ce qui cloche.
Sub ValideNomService()
  
Application.StatusBar = "Mis à jour des services en cours..."
Sheets("Base").Activate
Range("A2").Select
'pour chaque cellule(cellule est une variable avec un nom explicite) dans la 1ère
'colonne de la plage nomée "bd_noms"
For Each Cellule In ActiveSheet.Range("bd_noms").Columns(1).Cells
   'Emplacement de stockage nommé contenant les données à modifier
   Dim i As Byte
   'i représente la variable et renvoie une valeur de type long
   For i = 1 To Len(Cellule)
      'Execute les instructions Mid servant à remplacer les caractères de la cellule
      Select Case Mid(Cellule, i, 1)
        'si le nom comprend des caractères interdits -> espace
        Case ":", "/", "", "?", "*", "[", "]": Mid(Cellule, i, 1) = "_"
      End Select
        'si le nom est trop long -> tronquer à 31 caractères
        If Len(Cellule) > 31 Then
        Cellule = Left(Cellule, 31)
        End If
      If Cellule "" Then Cellule "Sans nom"
        Next
    Next
    Application.StatusBar = False
    MsgBox "traitement terminé", vbInformation, "Mis à jour des services"
End Sub


AH je penses commencer à comprendre... En fait, avec l'instruction
Mid(cellule, i, 1)
, ma variable ici c'est cellule. Mais dans ce cas, c'est avec mon instruction d'avant que ca bloque non?
'Emplacement de stockage nommé contenant les données à modifier
   Dim i As Byte
   'i représente la variable et renvoie une valeur de type long
   For i = 1 To Len(Cellule)


En fait non je pige pas tout, car ca tourne en boucle sur la cellule a2 sans changer et surtout sans bugger...

vous pourriez m'aider un poil plus parceque ma réflexion est bloquée sur Mid
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
3 nov. 2009 à 10:51
pprends à sérier un problème.
Commence par voir ce que contient cellule
For Each Cellule In ActiveSheet.Range("bd_noms").Columns(1).Cells
  msgbox cellule ' et tu le sauras et commenceras à yt voir plus clair...

Je préfère quant à moi spécifier les choses, plutôt que de laisser VB se montrer "généreux"
Cellule.Value est bien plus précis
Et typer I en byte me parait un peu court. Type en Integer.
0
Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010
3 nov. 2009 à 13:08
Génial, c'est ce genre de réponse j'attendais (et c'est pas une blague)

Merci encore jmf0. Je regarde ca de plus près. En tout cas j'apprends beaucoup grâce à vous

PS : sans vouloir abuser de votre temps, je remettrais mon code alors si vous pouviez jeter un oeil après^^

PS 2 : je suis autodidacte en vb, comme bcp j'imagine, donc je n'apprends pas toujours les bonnes choses au bon moment
0
Eversan Messages postés 27 Date d'inscription jeudi 17 septembre 2009 Statut Membre Dernière intervention 22 février 2010
3 nov. 2009 à 16:11
Re,

Bon est bien je dois avouer que je n'y arrive pas. Voici le code :
Sub ValideNomService()
  
Application.StatusBar = "Mis à jour des services en cours..."
Sheets("Base").Activate
Range("A2").Select
'pour chaque cellule(cellule est une variable avec un nom explicite) dans la 1ère
'colonne de la plage nomée "bd_noms"
For Each Cellule In ActiveSheet.Range("bd_noms").Columns(1).Cells
   'Emplacement de stockage nommé contenant les données à modifier
   MsgBox Cellule
   Dim i As Integer
   'i représente la variable et renvoie une valeur de type long
   For i = 1 To Len(Cellule)
      'Execute les instructions Mid servant à remplacer les caractères de la cellule
      Select Case Mid(Cellule, i, 1)
        'si le nom comprend des caractères interdits -> espace
        Case ":", "/", "", "!", "?", "*", "[", "]": Mid(Cellule, i, 1) = " "
      End Select
    Next
        'si le nom est trop long -> tronquer à 31 caractères
        If Len(Cellule) > 31 Then
        Cellule = Left(Cellule, 31)
        End If
      If Cellule "" Then Cellule "Sans nom"
      Next
    Application.StatusBar = False
    MsgBox "traitement terminé", vbInformation, "Mis à jour des services"
End Sub


J'ai bien dans le MsgBox Cellule ma chaîne de caractères (pour le teste ma cellule a2 est service1/service1/service1/service1/service1), mais parfois ca la racourci sans corriger les caractères interdits et parfois non.
Ensuite j'observe que l'instruction ne passe pas à la cellule suivante
Dernier point, ca tourne en boucle sur la cellule a3 à cet endroit du code
Select Case Mid(Cellule, i, 1)
        'si le nom comprend des caractères interdits -> espace
        Case ":", "/", "", "!", "?", "*", "[", "]": Mid(Cellule, i, 1) = " "
      End Select
    Next

Et je crois que c'est ca qui me pose le plus de problème, car de ce fait je n'arrive pas à débogger et à surtout à cibler le(s) problème(s).
0
jmf0 Messages postés 1566 Date d'inscription mardi 26 décembre 2000 Statut Membre Dernière intervention 5 avril 2013 8
3 nov. 2009 à 16:19
Tu le dis toi-même :
Ensuite j'observe que l'instruction ne passe pas à la cellule suivante

Reprends mon conseil plus haut : apprendre à sérier les problèmes ...
Oublie donc pour l'instant tes modifications du contenu des cellules ...
Concentre-toi uniquement, (problème N° 1 à traiter en exercice) sur le "déroulé" des cellules d'une plage spécifiée, en utilisant une boucle For)
Car ton vrai problème est là et non dans le reste (qui viendra ensuite tout seul... tu en connais le code ... tu l'as même écrit )
0
Rejoignez-nous