Chaîne de caractères sur Excel

Résolu/Fermé
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016 - Modifié par SakiManiac le 3/11/2016 à 10:14
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016 - 4 nov. 2016 à 11:24
Bonjour,

Je suis en période de stage et il m'a été une première mission qui est assez compliquée vu que je ne m'y connais pas en VBA
.
J'ai une base de données Excel (Feuille 1 : contient : Nom, Prenom, Sexe, Mail, Ville etc.., Feuille 2 contient une liste de noms d'hommes, Feuille 3 contient une liste de noms d'hommes), mais le problème est que le sexe et même le prénom pour quelque uns est vide et ils souhaitent connaître le sexe de la personne par son adresse mail, oui je sais que c'est impossible pour une grande tranche mais leurs but est de récupérer le maximum possible d'informations.

Un petit exemple rapide : L'adresse mail rentrée est xfrançois91@ccm.fr, la fonction va chercher si le nom François (qui figures déjà sur la table des noms hommes) figure dans la chaîne de caractères de l'adresse mail, si oui elle va mettre "M" dans la colonne sexe et ainsi de suite.
Je sais que je ne pourrai pas tout obtenir mais mon but est de récuper un minimum.
J'ai essayé de trouver une solution par un autre moyen et j'ai grandement été aidé mais on m'a conseillé que c'est possible en VB (ce qui me faciliteras la tâche vu que j'agis directement sur le fichier excel) et de venir ici demander de l'aide.

Merci de bien vouloir m'aider.
PS : http://html-js-editor.blogspot.com/?id=0t3q8 ceci est un script JS qui a été fait par un membre du forum et contient tout l'algorithme nécessaire si ça peut aider.
http://www.cjoint.com/c/FKdjjMCIL3s et voici le fichier excel.
A voir également:

3 réponses

Whismeril Messages postés 19055 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 10 juin 2024 913
3 nov. 2016 à 15:23
Bonjour

comme je te l'ai dit hier VBA n'est pas mon fort, mais j'ai bricolé un truc, ça n'est surement pas optimisé, d'autres pourront mieux faire.
Je n'ai pas accés au site ou Konseil a posté son code (mon boulot le bloque et ma tablette me mets une page vide sur fond bleu), donc j'ai fait comme je le sentais

Sub Macro1()
    Dim lesGarcons() As String
    lesGarcons = TableauDeDonnees("Feuil2", "A")

    Dim lesFilles() As String
    lesFilles = TableauDeDonnees("Feuil3", "A")
    
    Dim lesAdresses() As String
    lesAdresses = TableauDeDonnees("Feuil1", "E")
        
    For i = LBound(lesAdresses) To UBound(lesAdresses)
        Dim prenom As String
        Dim sexe As String
        
        Dim garcon As Boolean
        Dim prenomGarcon As String
        garcon = CompareAdresseEtTableau(lesGarcons, lesAdresses(i), prenomGarcon)
        
        Dim fille As Boolean
        Dim prenomFille As String
        fille = CompareAdresseEtTableau(lesFilles, lesAdresses(i), prenomFille)
        
        If fille And garcon Then
            'si on a trouvé un prénom de fille et de garcon
            MsgBox (lesAdresses(i) + " donne " + prenomGarcon + "  ou " + prenomFille)
            prenom = prenomGarcon + "  ou " + prenomFille
            sexe = ""
            
        ElseIf garcon Then
            sexe = "M"
            prenom = prenomGarcon
    
            
        ElseIf fille Then
            sexe = "F"
            prenom = prenomFille
            
        End If
        
        If garcon Or fille Then 'si un résultat a été trouvé on l'affiche
            With Worksheets("Feuil1")
                .Range("F" & i + 2).Value = sexe
                .Range("C" & i + 2).Value = prenom
            End With
        End If
        
    Next i
    

    
End Sub

Function TableauDeDonnees(NomFeuille As String, Colonne As String) As String()
With Worksheets(NomFeuille)
    Dim donnees As Variant
    Dim dernierLigne As Integer
    
    dernierLigne = .Range(Colonne & Rows.Count).End(xlUp).Row 'dernière ligne non vide
    
    Dim leRange As String
    leRange = Colonne & "2:" & Colonne & dernierLigne
    donnees = .Range(leRange).Value 'toutes les données de la plage A2-> ADerniereLigneNonVide
    
    Dim tailleTableau As Integer
    Dim resultat() As String
    ReDim resultat(dernierLigne - 2)
    
    For i = 1 To UBound(donnees, 1) 'Extraction des données sous forme d'un tableau de string
        resultat(i - 1) = donnees(i, 1)
    Next i
    
    TableauDeDonnees = resultat
End With
End Function

Function CompareAdresseEtTableau(TableauDePrenoms() As String, Adresse As String, ByRef PrenomTrouve) As Boolean
    'comparaison avec l'opérateur Like
    For i = LBound(TableauDePrenoms) To UBound(TableauDePrenoms)
    
        If Adresse Like "*" & TableauDePrenoms(i) & "*@*.*" Then'si ça ressemble à un email avec le prénom dedans
        'si l'adresse correspond à un prénom, on affecte le resulat et on sort
            CompareAdresseEtTableau = True
            PrenomTrouve = TableauDePrenoms(i)
            Exit Function
        End If
    Next i

    'si aucun prenom trouvé
    CompareAdresseEtTableau = False
    PrenomTrouve = ""
End Function



1
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016
3 nov. 2016 à 18:45
Bonsoir Whismeril,

Je te remercie de ta réponse. Après avoir lus et relus le code je crois que ça devrai marcher.
Parcontre quand je crée une macro et je copie le code dessus, je n'ai pas la possibilité d'enregistrer le code. Voici le message d'erreur : https://imgur.com/a/hCCa1
Je m'excuse pour le tas de questions mais je suis complétement débutant en macros tout ce que j'ai fait auparavant c'est utiliser des formules Excel.
0
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016
3 nov. 2016 à 19:19
La solution marche parfaitement, merci énormement !
0
Whismeril Messages postés 19055 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 10 juin 2024 913
3 nov. 2016 à 18:54
Petite info utile pour l'utilisation de CCM, si tu cliques sur le gros bouton bleu Répondre, au lieu du petit lien "commenter la reponse de..." tu auras accès à une boîte de saisie qui permet de placer une image directement sur le forum, c'est plus pratique pour le lecteur.
Voir https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#insertion-via-le-bouton-d-edition

Pour ton problème, dans les versions récentes d'excel (à partir de 2007 je crois), un classeur avec macro n'a pas la même extension qu'un classeur sans macro:
  • xlsx pas de macro
  • xlsm macro.


Il te suffit donc de faire enregistrer sous et de choisir le format xlsm
1
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016
Modifié par SakiManiac le 4/11/2016 à 10:55
Bonjour Whismeril,

En essayant le code sur une base excel plus longue, on me renvoie une erreur "Dépassement de capacité" après la position 32767 exactement.


0
Bonjour SakiManiac et Whismeril,
Il faut remplacer Dim dernierLigne As Integer
par : Dim dernierLigne As Long
Cordialement.  😊
0
SakiManiac Messages postés 24 Date d'inscription mardi 1 novembre 2016 Statut Membre Dernière intervention 15 novembre 2016
4 nov. 2016 à 11:24
Bonjour,

Merci ça a marché. :D

Bonne journée
0