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

VBA Access Discussion :

Rechercher une valeur dans fichier Excel depuis VBA Access


Sujet :

VBA Access

  1. #1
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut Rechercher une valeur dans fichier Excel depuis VBA Access
    Bonjour.

    J'ai un soucis lors du parcour d'un fichier Excel depuis VBA Access.

    En effet j'utilise la fonction "Find" pour trouver une valeur dans mon fichier. Une fois cette valeur trouvée je récupère le contenut de la case à ça gauche. (Ex : je recherche "Test" contenut dans la case A3. Je veux la valeur de la case A2).

    Tout fonctionne à merveille jusqu'au moment où je décide de définir un "range" ne commençant pas par la cellule "A1". A partir de ce moment il trouve bien les valeur mais me renvoie toujours une valeur "" pour le contenut de la cellule ...

    Voici ma fonction :
    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
    Private Function ValeurCaseGauche(P_Range As Range, P_MotRecherche As String, P_NbCaseAGauche As Integer) As Variant
    'on recherc le text passé par le paramêtre "P_MotRecherche" dans la zone de sélection défini par "P_Range"
    'Si on le trouve on remonte de "P_NbCaseAGauche" sur la gauche et on renvoie la valeur
    'Si c'est une cellule fusionné on renvoie la valeur contenut dans la case la plus en haut à gauche de la fusion
    'dans tous les cas on renvoie le nombre de valeur trouvé à l'adresse (0,2) du tableau de résultats
    'dans tous les cas on renvoie le nombre de valeur de case à gauche <> "" à l'adresse (0,1) du tableau de résultats
     
      Dim RGE_C                     As Range    'Permet de faire la recherche
      Dim STR_FA                    As String   'contient l'adresse du premier résultat de la recherche
      Dim STR_Cel                   As String   'récupère le contenut d'une cellule renvoié par la recherche
      Dim TAB_Res(0 To 50, 1 To 4)  As Variant  'contient la liste des tous les résultats de la recherche
      Dim INT_i                     As Integer  'Incrément
      Dim INT_Nb                    As Integer  'contient le nombre de fois que la chaine de caractère recherché à été trouvée
     
        'MsgBox P_Range.Address
        With P_Range
            'on recherche le mot passé en paramêtre
            Set RGE_C = .Find(P_MotRecherche, LookIn:=xlValues, LookAt:=xlPart)
            INT_i = 0
            INT_Nb = 0
            If (Not RGE_C Is Nothing) Then
                'on stock la première adresse pour ne pas rechercher en boucle
                STR_FA = RGE_C.Address
                'on récupère une première fois la valeurs contenut "P_NbCaseAGauche" puis on boucle tant qu'on trouve la chaine recherché
                Do
                    'on incrément le nombre de fois que la chaine de caractère a été trouvé
                    INT_Nb = INT_Nb + 1
                    'on récupère le contenut de la cellule, Si c'est une cellule fusionné on récupère la valeur de la cellule la plus à gauche
                    STR_Cel = .Cells(RGE_C.Row, RGE_C.Column - P_NbCaseAGauche).MergeArea.Cells(1, 1).Value
                    If ((Not IsNull(STR_Cel)) And (STR_Cel <> "")) Then
                        INT_i = INT_i + 1
                        TAB_Res(INT_i, 1) = STR_Cel
                        TAB_Res(INT_i, 2) = RGE_C.Address
                        TAB_Res(INT_i, 3) = RGE_C.Row
                        TAB_Res(INT_i, 4) = RGE_C.Column
                    End If
                    Set RGE_C = .FindNext(RGE_C)
                Loop While ((Not RGE_C Is Nothing) And (RGE_C.Address <> STR_FA))
            End If
        End With
     
        'l'adresse du tableau (0.1) permet de stocker le nombre d'éléments actif dans le tableau
        TAB_Res(0, 1) = INT_i
        'l'adresse du tableau (0.2) permet de stocker le nombre de fois qu'a été trouvé la chaine de caractère
        TAB_Res(0, 2) = INT_Nb
        'on retourne le résultat
        ValeurCaseGauche = TAB_Res
     
    End Function
    Voici l'appel de la fonction qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAB_Titre = ValeurCaseGauche(.Range("A1:AA69"), "Titre", 1)
    Voici l'appel de la fonction qui ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAB_Titre = ValeurCaseGauche(.Range("A2:AA69"), "Titre", 1)
    J'avoue ne pas comprendre le pourquoi du comment ...
    Si quelqu'un à une explication rationnel à me fournir ce serai vraiment très simpa!!!

    Merci d'avance!!!

  2. #2
    Membre actif Avatar de tribaleur
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 401
    Points : 237
    Points
    237
    Par défaut
    Héhé j'ai trouvé la solution à mon problème ...

    En fait c'était tout simple.
    Dans mes fonctions "RGE_C.Column" et "RGE_C.Row" renvoie le numéro de la ligne/colonne dans le fichier. (La case C2 => RGE_C.Row = 2, RGE_C.Column=3)
    Dans mon ANCIENNE fonction je récupérai le contenu de ma case avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    STR_Cel = .Cells(RGE_C.Row, RGE_C.Column - P_NbCaseAGauche).MergeArea.Cells(1, 1).Value
    Mon erreur venait du fait que je prenais la cellule (ligne 2 et colonne 3) de ma sélection. Ce qui ne correspondait pas du tout avec la ligne 2 et colonne 3 du fichier.

    Petit exemple pour illustrer.
    Mon text recherché ce trouve dans la case C2 (Ligne 2, colonne 3)
    MaSelection.Range("A3:C9").Cells(2,3)... me renvoie le contenu de la cellule C4 (2éme ligne de ma sélection et 3éme colonne de ma sélection)


    Voici donc ma nouvelle fonction :
    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
     
    '  /\
    ' /| \ ne pas oublier les référence à Excel (Outils/Références/"Microsoft Excel 11.0 ObjectLibrary")
    '/_.__\
    Private Function ValeurCaseGauche(P_NomFeuille As String, P_Range As String, P_MotRecherche As String, P_NbCaseAGauche As Integer) As Variant
    'on recherc le text passé par le paramêtre "P_MotRecherche" dans la zone de sélection défini par "P_Range"
    'Si on le trouve on remonte de "P_NbCaseAGauche" sur la gauche et on renvoie la valeur
    'Si c'est une cellule fusionné on renvoie la valeur contenut dans la case la plus en haut à gauche de la fusion
    'dans tous les cas on renvoie le nombre de valeur trouvé à l'adresse (0,2) du tableau de résultats
    'dans tous les cas on renvoie le numéro de ligne de la première valeur trouvé à l'adresse (0,3) du tableau de résultats
    'dans tous les cas on renvoie le numéro de colonne de la première valeur trouvé à l'adresse (0,4) du tableau de résultats
    'dans tous les cas on renvoie le nombre de valeur de case à gauche <> "" à l'adresse (0,1) du tableau de résultats
     
      Dim RGE_C                     As Range    'Permet de faire la recherche
      Dim STR_FA                    As String   'contient l'adresse du premier résultat de la recherche
      Dim STR_Cel                   As String   'récupère le contenut d'une cellule renvoié par la recherche
      Dim TAB_Res(0 To 50, 1 To 4)  As Variant  'contient la liste des tous les résultats de la recherche
      Dim INT_i                     As Integer  'Incrément
      Dim INT_Nb                    As Integer  'contient le nombre de fois que la chaine de caractère recherché à été trouvée
         'OBJ_Classeur_Excel est une variable global qui s'inititalise  comme ça :
         'Dim OBJ_Appli_Excel     As Excel.Application 'pour l'utilisation du fichier Excel
         'Dim OBJ_Classeur_Excel  As Excel.Workbook    'pour l'utilisation du fichier Excel
         'Set OBJ_Appli_Excel = CreateObject("Excel.Application")
         'enlève les messages d'alertes
         'OBJ_Appli_Excel.DisplayAlerts = False
     
         'Set OBJ_Classeur_Excel = OBJ_Appli_Excel.Workbooks.Open(Filename:="Chemin\de\mon\fichier.xls/xlt")
     
        With OBJ_Classeur_Excel.Sheets(P_NomFeuille).Range(P_Range)
            'on recherche le mot passé en paramêtre
            Set RGE_C = .Find(P_MotRecherche, LookIn:=xlValues, LookAt:=xlPart)
            INT_i = 0
            INT_Nb = 0
            If (Not RGE_C Is Nothing) Then
                'on stock la première adresse pour ne pas rechercher en boucle
                STR_FA = RGE_C.Address
                'on stock le numéro de la ligne et de la colonne de la première cellule trouvé
                TAB_Res(0, 3) = RGE_C.Row
                TAB_Res(0, 4) = RGE_C.Column
                'on récupère une première fois la valeurs contenut "P_NbCaseAGauche" puis on boucle tant qu'on trouve la chaine recherché
                Do
                    'on incrément le nombre de fois que la chaine de caractère a été trouvé
                    INT_Nb = INT_Nb + 1
                    'on récupère le contenut de la cellule, Si c'est une cellule fusionné on récupère la valeur de la cellule la plus à gauche
                    If ((RGE_C.Column - P_NbCaseAGauche) > 0) Then
                        STR_Cel = OBJ_Classeur_Excel.Sheets(P_NomFeuille).Range("A1:AA1000").Cells(RGE_C.Row, RGE_C.Column - P_NbCaseAGauche).MergeArea.Cells(1, 1).Value
                    Else
                        STR_Cel = ""
                    End If
     
                    If ((Not IsNull(STR_Cel)) And (STR_Cel <> "")) Then
                        INT_i = INT_i + 1
                        TAB_Res(INT_i, 1) = STR_Cel
                        TAB_Res(INT_i, 2) = RGE_C.Address
                        TAB_Res(INT_i, 3) = RGE_C.Row
                        TAB_Res(INT_i, 4) = RGE_C.Column
                    End If
                    Set RGE_C = .FindNext(RGE_C)
                Loop While ((Not RGE_C Is Nothing) And (RGE_C.Address <> STR_FA))
            End If
        End With
     
        'l'adresse du tableau (0.1) permet de stocker le nombre d'éléments actif dans le tableau
        TAB_Res(0, 1) = INT_i
        'l'adresse du tableau (0.2) permet de stocker le nombre de fois qu'a été trouvé la chaine de caractère
        TAB_Res(0, 2) = INT_Nb
        If (INT_i = 0) Then
            TAB_Res(1, 1) = ""
        End If
        'on retourne le résultat
        ValeurCaseGauche = TAB_Res
     
    End Function
    et voici son appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TAB_Produits = ValeurCaseGauche("Fiche inter-usine", "A2:AA15", "FK_IDFab", 2)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox = ValeurCaseGauche("Fiche inter-usine", "A2:AA15", "FK_IDFab", 2)(1,1)
    Bon bin avec de la chance cela servira à quelqu'un.
    Merci quand même de votre aide!!!

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

Discussions similaires

  1. [AC-2010] Pb gestion de fichiers Excel depuis VBA access
    Par Dixies dans le forum VBA Access
    Réponses: 1
    Dernier message: 23/02/2014, 16h16
  2. [AC-2000] Ouverture d'un fichier Excel depuis VBA Access
    Par Aeltith dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/06/2010, 15h43
  3. Recherche d'une valeur dans un txt depuis vba excel
    Par Ted37 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/08/2008, 08h28
  4. Tracé graphique sur fichier excel depuis vba access
    Par kdestine dans le forum VBA Access
    Réponses: 0
    Dernier message: 26/09/2007, 12h37
  5. Rechercher une valeur dans excel avec VBA
    Par kebab666 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/06/2007, 10h00

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