IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Macro dans Excel en VB


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut Macro dans Excel en VB
    Bonjour!

    J'ai un petit souci de programmation avec virtual basic.
    Je dois créer une macro capable de rechercher une référence dans un fichier excel.
    Je débute en VB, mais je "sais" programmer en C/C++

    Mon souci est le suivant:

    J'ai une ListBox qui affiche des mots clés (suite à une recherche). J'aimerais pouvoir selectionner un élément de cette liste et récuperer l'emplacement de celle-ci pour pouvoir afficher la ligne complète (dans excel) dans une autre ListBox.

    J'ai bien tenté d'utiliser ListIndex mais sans résultat convenable. Je ne suis pas sûr de bien comprendre son fonctionnement

    Voici le code qui execute la recherche (après un click sur un bouton):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    Private Sub CommandButton1_Click()
     
    Dim ref As String
    Dim export As Worksheet
    Dim MotCle As String
    Dim erreur As String
    Set export = Sheets("A")
    Dim i As Integer
     
    If OptionButton1.Value = False And OptionButton2.Value = False Then
    erreur = MsgBox("Veuillez choisir une méthode de recherche", vbOKOnly + vbCritical, "Erreur")
    End If
     
     
     
    If OptionButton1.Value = True Then
        ref = InputBox("Saisir la référence recherchée")
     
        With Worksheets(1).Columns(1)
            Set c = .Find(What:=ref, LookAt:=xlWhole)
     
            If ref = ("") Then
     
                ref = MsgBox("Veuillez entrer au moins un caractère", vbCritical + vbOKOnly, "Attention")
     
            ElseIf c Is Nothing Then
                MsgBox ("Référence inexistante, affichage des références les plus ressemblantes")
                Set c = .Find(What:=ref, LookAt:=xlPart)
     
                If Not c Is Nothing Then
                    firstAddress = c.Address
     
                    Do
                    Set c = .FindNext(c)
     
                    ListBox1.AddItem c
                    CommandButton3.Enabled = True
     
                    Loop While Not c Is Nothing And c.Address <> firstAddress
     
                End If
     
            Else
                CommandButton3.Enabled = True
                ListBox1.AddItem c
            End If
        End With
     
     
    End If
     
     
    If OptionButton2.Value = True Then
        MotCle = InputBox("Saisir un mot clé")
     
        With Worksheets(1).Columns(2)
            Set d = .Find(What:=MotCle, LookAt:=xlPart)
            If Not d Is Nothing Then
                firstAddress = d.Address
     
                Do
                    Set d = .FindNext(d)
                    If MotCle = ("") Then
                        MotCle = MsgBox("Veuillez entrer au moins un caractère", vbCritical + vbOKOnly, "Attention")
     
                    ElseIf d Is Nothing Then
                    MsgBox ("Mot(s) clé(s) non trouvé(s)")
                    Else
                        ListBox1.AddItem d
                        CommandButton3.Enabled = True
                    End If
     
                    Loop While Not d Is Nothing And d.Address <> firstAddress
     
            End If
        End With
     
    End If
     
    End Sub
    Et voici le pseudo code que j'ai tenté de taper pour au moins réafficher le mot clé sélectionné dans la ListBox1 vers la ListBox2
    Evidemment ça ne marche pas du tout ^^
    Ca écris juste 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub CommandButton2_Click()
     
    UserForm4.Height = 500
    ListBox2.Enabled = True
    ListBox2.Visible = True
    Dim Compteur As Integer
    Dim Detail As String
     
    Compteur = ListBox1.ListCount
     
    If Compteur > 0 Then
     
        Detail = ListBox1.ListIndex
     
    End If
     
    ListBox2.AddItem Detail
     
    End Sub
    Merci d'avance pour votre aide.
    Épargnez votre cerveau : éteignez votre télé !

  2. #2
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Bien j'ai trouvé mon erreur...
    J'avais simplement mis un selected(0) quelque part qui perturbait le ListIndex ^^

    Parcontre, je voudrais maintenant faire une recherche d'un mot dans un fichier Excel et que le résultat de la recherche m'indique la position du mot dans la feuille excel. (Ligne, colonne)
    J'utilise la fonction Find mais je ne sais pas comment faire avec cette fonction.

    Est-ce possible avec cette fonction?
    Dois-je utiliser une autre fonction?

    Pourriez-vous m'aider s'il vous plaît?
    Épargnez votre cerveau : éteignez votre télé !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Re Yolak,

    Nouvelle version, car j'avais oublié de prévoir le cas où votre texte ne serait pas trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub Macro1()
    mrech = "abcd"
     
    On Error GoTo N_trouv
        Range("A1").Select
        Cells.Find(What:=mrech, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
            xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _
            .Activate
     
     
     
    ActiveCell.Value = "=row(RC)"
    numl = ActiveCell.Value
    ActiveCell.Value = "=column(RC)"
    numc = ActiveCell.Value
     
    MsgBox "Texte trouvé en :" & Chr(10) & Chr(13) _
                & "Ligne " & numl & " Colonne " & numc, _
                vbOKOnly + vbInformation + vbApplicationModal, "Information"
    Exit Sub
     
    N_trouv:
     
    MsgBox "Aucune occurrence trouvée dans la recherche", _
                  vbOKOnly + vbInformation + vbApplicationModal, "Information"
     
    End Sub
    Dernière modification par Invité ; 30/03/2007 à 15h01.

  4. #4
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Bonjour et merci d'avoir répondu

    En fait ton code fonctionne mais il remplace le texte trouvé par le chiffre 1!!

    Mais bon, pour l'instant ça m'aide pas mal donc merci beaucoup!!

    (Je ne clique pas sur résolu car je reviendrais sans doute pour des questions sur le même sujet si besoin est)
    Épargnez votre cerveau : éteignez votre télé !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Re Yolak,

    Exact; grossière erreur de ma part. Toutes mes excuses.

    Plus simple :

    Vous remplacez cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ActiveCell.Value = "=row(RC)"
    numl = ActiveCell.Value
    ActiveCell.Value = "=column(RC)"
    numc = ActiveCell.Value
     
    MsgBox "Texte trouvé en :" & Chr(10) & Chr(13) _
                & "Ligne " & numl & " Colonne " & numc, _
                vbOKOnly + vbInformation + vbApplicationModal, "Information"
    Exit Sub
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ad = ActiveCell.Address
     
    MsgBox "Texte trouvé en : " & ad, _
                vbOKOnly + vbInformation + vbApplicationModal, "Information"
    ad = ActiveCell.Address
    Exit sub

  6. #6
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Effectivement, ce code marche bien mieux, et merci beaucoup pour cette aide!

    J'ai donc maintenant l'adresse exacte du résultat de la recherche.
    Par exemple: $B$78

    Je voudrais maintenant afficher dans ma listbox la ligne entière!

    Comment dois-je procéder?

    J'ai un autre petit souci: Lorsque je lance ma recherche, si le mot recherché dans le fichier excel comporte des espaces après la dernière lettre, le petit programme que j'ai fait considère que ce n'est pas le même mot...
    Est-il possible d'indiquer dans le code que les espaces ne doivent pas être pris en compte?

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    Private Sub CommandButton1_Click()
     
    'Declarations des variables
    Dim ref As String
    Dim Export As Worksheet
    Dim MotCle As String
    Dim erreur As String
    Set Export = Sheets("A")
    Dim i As Integer
     
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'Actions si le bouton d'option n°1 est selectionné(référence):
     
    If OptionButton1.Value = False And OptionButton2.Value = False Then
    erreur = MsgBox("Veuillez choisir une méthode de recherche", vbOKOnly + vbCritical, "Erreur")
    End If
     
    If OptionButton1.Value = True Then
     
        'Affichage d'un boîte de dialogue pour la saisie de la référence
        ref = InputBox("Saisir la référence recherchée")
     
        'Recherche dans la première colonne de la feuille de travail n°1
        With Worksheets(1).Columns(1)
            Set c = .Find(What:=ref, LookAt:=xlWhole)
            'xlWhole signifie que la recherche s'effectue sur un mot entier
     
            'Si l'utilisateur(trice) n'écris rien dans la boîte de dialogue, un message d'erreur s'affiche
            If ref = ("") Then
     
                ref = MsgBox("Veuillez entrer au moins un caractère", vbCritical + vbOKOnly, "Attention")
     
            'Si la reference est imcomplete ou erronnée, on affiche les references les plus ressemeblantes
            ElseIf c Is Nothing Then
                ref = MsgBox("REFERENCE INEXISTANT.Affichage des références les plus ressemblantes", vbOKOnly + vbInformation)
                Set h = .Find(What:=ref, LookAt:=xlPart)
     
                If Not h Is Nothing Then
                    firstAddress = h.Address
     
                    Do
                    Set h = .FindNext(h)
                    'Agrandissement de la fenêtre pour l'affichage des résultats
                    UserForm4.Width = 500
                   'On ajoute un résultat dans une liste et on active le bouton "contenu"
                    ListBox1.ListStyle = 1
                    ListBox1.AddItem h
                    CommandButton3.Enabled = True
     
                    Loop While Not h Is Nothing And h.Address <> firstAddress
     
                End If
     
            Else
                'Agrandissement de la fenêtre pour l'affichage des résultats
                UserForm4.Width = 500
                'On ajoute un résultat dans une liste et on active le bouton "contenu"
                ListBox1.ListStyle = 1
                CommandButton3.Enabled = True
                ListBox1.AddItem c
            End If
        End With
     
     
    End If
     
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'Actions si le bouton d'option n°2 est selectionné(mot clé):
     
    If OptionButton2.Value = True Then
        'Affichage d'une boîte de dialogue pour la saisie du mot clé
        MotCle = InputBox("Saisir un mot clé")
     
        'Recherche dans la deuxième colonne de la feuille de travail n°1
        With Worksheets(1).Columns(2)
            Set d = .Find(What:=MotCle, LookAt:=xlPart)
            'xlPart signifie que la recherche s'effectue sur une partie de mot
     
            If Not d Is Nothing Then
                firstAddress = d.Address
     
                Do
                    Set d = .FindNext(d)
     
                    'Si l'utilisateur(trice) n'écris rien dans la boîte de dialogue, un message d'erreur s'affiche
                    If MotCle = ("") Then
                        MotCle = MsgBox("Veuillez entrer au moins un caractère", vbCritical + vbOKOnly, "Attention")
     
                    'Si il n'y a pas de résultat, un message d'erreur s'affiche
                    ElseIf d Is Nothing Then
                    MsgBox ("Mot(s) clé(s) non trouvé(s)")
     
                    Else
                        'Agrandissement de la fenêtre
                        UserForm4.Width = 500
                        'On ajoute un résultat dans une liste et on active le bouton "contenu"
                        ListBox1.ListStyle = 1
                        ListBox1.AddItem d
                        CommandButton3.Enabled = True
                    End If
     
                    Loop While Not d Is Nothing And d.Address <> firstAddress
     
            End If
        End With
     
    End If
     
    End Sub
    J'ai tenté d'utiliser la fonction Trim mais sans résultat.
    (il faudrait que j'utilise Trim pour la première colonne de la feuille d'excel)
    Épargnez votre cerveau : éteignez votre télé !

  7. #7
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Bon... J'ai réussi à régler le problème des listbox!
    Ouf

    Parcontre, je n'arrive vraiment pas à effacer les espaces en trop dans la première colonne de mon fichier excel.

    Je sais bien que la fonction "Trim" peut être utile, par contre, je n'arrive pas à l'utiliser!!!

    Pourriez vous m'aider s'il vous plaît?
    Épargnez votre cerveau : éteignez votre télé !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re Yolak,

    Déjà pour la 1ère question.
    Sur votre feuille vous collez le code suivant (vos données seront réécrites sans les espaces) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Sub Sup_space()
    
    '1ère ligne de données (modifier éventuellement).
    l = 2
    
    Init:
    
    'la variable n prend la valeur de la cellule en cours
    n = Cells(l, 1)
    
    'Si n ne contient pas de texte on termine la procédure
    If n = "" Then
    Exit Sub
    End If
    
    Suite:
    
    'la variable bn va contenir le nombre de caractères contenus dans n
    'ce nombre est revoyé par la fonction Len (et les espaces sont bien des 
    'caractères
    nb = Len(n)
    
    'la variable dc va contenir le code du dernier caractères du texte contenu 'dans n (ce code est 32 si le caractère est un espace  
    'La fonction Right(n, 1) renvoie le dernier caractère de droite du texte.
    'La fonction Asc renvoie le code de ce caractère 
    dc = Asc(Right(n, 1))
    
    If dc = 32 Then
    'Ici le dernier caractère détecté est un espace.
    'on prend donc la partie gauche du texte pour le nombre de caractères
    'déterminé au départ par la fonction Len mais réduit de 1
    'et on continue la boucle jusqu'à ce que le code du dernier caractère
    'soit différent de 32
     
    n = Left(n, nb - 1)
    GoTo Suite
    Else
    Cells(l, 1) = n
    l = l + 1
    GoTo Init
    End If
    
    End Sub
    Dernière modification par Invité ; 02/04/2007 à 15h56.

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'avais mal compris votre question ou plutôt j'avais confondu la fonction Trim dont vous parlez avec une autre, donc même résultat que précédemment avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub Sup_space()
    
    '1ère ligne de données (modifier éventuellement)
    l = 2
    
    Init:
    n = Cells(l, 1)
    If n = "" Then
    Exit Sub
    Else
    n = Trim(Cells(l, 1))
    Cells(l, 1) = n
    l = l + 1
    GoTo Init
    End If
     End Sub

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    j'ai juste lu en diagonale, et sans tout saisir, je sugere
    soit a mettre en fonction, soit dans le code si ça n'est utilisé qu'une fois

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour Alsimbad,

    Oui cela doit fonctionner aussi.

    Mais Yolak veut supprimer les espaces de fin et dans le cas où le texte est séparé par des espaces il disparaîtront aussi.

    Ma 1ère solution supprime les espaces de fin (mais pas ceux de l'intérieur).

    Ma 2ème solution supprime les espaces de début et de fin (et là également pas ceux de l'intérieur)

    Amicalement.

  12. #12
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Merci beaucoup pour ce code qui marche a merveille bien que je ne comprend absolument rien...
    Quelques commentaires n'auraient pas été de trop
    Encore merci!!
    Épargnez votre cerveau : éteignez votre télé !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Yolak,

    Regardez le 1er code. J'ai mis des commentaires.
    Le 2ème code peut donc se comprendre de la même façon avec la différence :

    au lieu de faire une boucle sur les caractères de fin de texte, j'utilise la fonction Trim qui supprime systématiquement les espaces avant le texte et ceux à la fin du texte.

    Je pense que vous pouvez maintenant indiquer "Résolu" sur votre sujet ?

    En cas de nouvelle question aucun problème pour créer un nouveau sujet.

    Amicalement.

  14. #14
    Membre actif Avatar de Yolak
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Mars 2007
    Messages : 341
    Points : 206
    Points
    206
    Par défaut
    Le problème est effectivement résolu grâce à vous,merci.

    De plus les commentaires sont très explicitent et m'ont aidé pour d'autres problème!!
    Merci beaucoup beaucoup beaucoup

    Je clique sur résolu et si j'ai d'autres questions je referait un post
    Épargnez votre cerveau : éteignez votre télé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Execution d'une macro dans excel
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/04/2007, 13h50
  2. lancement de macro dans excel
    Par jm_force dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 17h27
  3. disable macros dans EXCEL XP
    Par cada01a dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/05/2006, 11h41
  4. macro dans Excel
    Par mavean dans le forum Access
    Réponses: 5
    Dernier message: 08/04/2006, 11h21
  5. Macro dans excel permettant de voir si un fichier est ouvert
    Par VirginieGE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2004, 07h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo