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 :

Associer une variable au nom d'un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut Associer une variable au nom d'un fichier
    Bonjour,

    Je cherche à associer une variable à un nom d'un fichier afin de pouvoir utiliser ces variables dans une boucle Do... Loop.

    Le premier fichier s'appellerait fichier1 et le deuxième fichier s'appellerait fichier2. Je ne peux pas spécifier un nom précis ou un chemin précis de fichier car il porte chaque fois un nom différent et sont situés à des endroits différents.

    Voici ma macro d'essai:

    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
    Sub Macro1()
    Call Utilisation_FileDialog_SelectionFichier
    With Application.FileDialog(msoFileDialogFilePicker)
            .InitialFileName = "fichier1"
    End With
    Call Utilisation_FileDialog_SelectionFichier
    With Application.FileDialog(msoFileDialogFilePicker)
            .InitialFileName = "fichier2"
    End With
    Workbooks(fichier1).Select
    Sheets("toto").Select
    Cells("D65536").End(xlUp).Select
     Do
        IF(VLOOKUP(RC,'fichier2'ACCOUNT!C18:C41,24,'false')=READ-ONLY then
        MsgBox (RC)
        Else
        ActiveCell.Offset(-1, 0).Select
        Loop Until ActiveCell.Row = 0
     
    End Sub
    Sauriez-vous transformer cet essai de code afin que cela fonctionne ?

    Merci d'avance,

    lbroc84

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Ci dessous une fonction "Ouvrir" qui gère la demande d'ouverture d'un fichier
    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
    Function Ouvrir() As String
     
    Dim file As FileDialog
    Dim strfichier As String
    Dim str() As String
     
    Set file = Application.FileDialog(msoFileDialogFilePicker)
     
    'Creation des filtres
    file.Filters.Clear
    file.Filters.Add "Fichier Excel", "*.xls"
     
    'Si pas de sélection sortir de la procedure
    If file.Show = False Then
        Exit Function
    End If
     
    'file.SelectedItems(1) => Retourne le chemin complet du fichier (ou du premier fichier de la selection)
    str = Split(file.SelectedItems(1), "\")
    strfichier = str(UBound(str))
     
    'StrFichier => Nom du fichier
    Ouvrir = file.SelectedItems(1)
     
    End Function
    A utiliser comme suit
    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
    Dim Wrk1 As Workbook
    Dim Wrk2 As Workbook
     
    Dim Sh1 As Worksheet
    Dim Sh2 As Worksheet
     
    Dim Rg As Range
     
     
    Set Wrk1 = Application.Workbooks.Open(Ouvrir)
    Set Wrk2 = Application.Workbooks.Open(Ouvrir)
     
    Set Sh1 = Wrk1.Sheets("toto")
    Set Sh2 = Wrk2.Sheets("ACCOUNT")
     
    For Each cell In Sh1.Range("A1:A" & Sh1.Range("A" & Rows.Count).End(xlUp).Row)
     
     
    Next
    Dans la boucle j'utiliserais la méthode Find pour chercher l'information, mais j'ai du mal a décoder ta recherche, car la matrice est en colonne C et tu retourne la colonne 24 hors de la matrice

  3. #3
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup, cela m'aide énormément...

    En fait, je veux voir si les comptes d'un fichier (en col.D) sont en READ-ONLY dans un autre fichier (via un vlookup)...

    Grâce à votre aide, j'ai refait la macro comme ceci :

    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
    Sub Macro1()
     
    Dim Wrk1 As Workbook
    Dim Wrk2 As Workbook
     
    Dim Sh1 As Worksheet
    Dim Sh2 As Worksheet
     
    Dim Rg As Range
     
     
    Set Wrk1 = Application.Workbooks.Open(Ouvrir)
    Set Wrk2 = Application.Workbooks.Open(Ouvrir)
     
    Set Sh1 = Wrk1.Sheets("toto")
    Set Sh2 = Wrk2.Sheets("ACCOUNT")
     
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
    Set readcell = VLookup(cell, Sh2.Range("R20:AO20"), 24, False)
     
    If readcell = "READ-ONLY" Then
    MsgBox (cell)
     
    Next
     
    End Sub
    Mais il me dit que la fonction Vlookup n'est pas définie...

    lbroc84

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    La ligne ci dessous fait une recherche verticale sur une seule ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     VLookup(cell, Sh2.Range("R20:AO20"), 24, False)
    Si tu veux rechercher dans la colonne R et retourner la colonne AO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
    Set rg = Sh2.Range("R:R").Find(what:=cell.Value, lookat:=xlwhole)
     
    if not rg is nothing and rg.Value =  "READ-ONLY" then
     
         sh2.range("AO" & rg.Row).Value
     
    end if
     
    Next

  5. #5
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'ai essayé votre solution mais il me met :
    "Erreur de compilation : Utilisation incorrecte de la propriété" pour "Value" dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sh2.range("AO" & rg.Row).Value
    lbroc84

  6. #6
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Ajoute Msgbox devant la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox sh2.range("AO" & rg.Row).Value

  7. #7
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Merci...

    Mais maintenant ca bugue à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not rg is nothing and rg.Value =  "READ-ONLY" then
    en me disant "Variable Objet ou Variable de bloc With non définie"...

    Pourtant j'ai délcaré la variable en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Rg As Range
    ...
    Set rg = Sh2.Range("R:R").Find(what:=cell.Value, lookat:=xlwhole)
    La seule chose également qui me semble erronée c'est que je ne veux pas retourner AO de la sheet 2 mais bien la cell dans la colonne D de la sheet 1 (qui est comparé à la colonne R de la sheet 2 pour voir si dans la colonne AO de cette même ligne il y a READ_ONLY"...).

    Exemple:
    Col D Sheet 1 : compte A

    Col R Sheet 2 : on cherche où il y a ce compte A => ex : ligne 13

    Col AO Sheet 2 : on regarde si il est indiqué "READ_ONLY" sur la ligne 13

    => si oui, on retourne le compte A.

    Merci d'avance de votre aide,

    lbroc84

  8. #8
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Désolé, il faut faire le test en 2 fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
    Set rg = Sh2.Range("R:R").Find(what:=cell.Value, lookat:=xlwhole)
     
    if not rg is nothing then
     
        If rg.Value =  "READ-ONLY" then
     
           sh2.range("AO" & rg.Row).Value
     
        end if
     
    end if
     
    Next

  9. #9
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour lbroc84, jfontaine, le forum,

    Si j'ai bien compris ce que souhaite lbroc84
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
        Set rg = Sh2.Range("R:R").Find(what:=cell.Value, lookat:=xlWhole)
        If Not rg Is Nothing Then
            If rg.Offset(0, 23).Value = "READ-ONLY" Then
                MsgBox "READ-ONLY trouvé sur compte " & rg
            End If
        End If
    Next
    Cordialement.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Oui, on y est presque... C'est tout à fait cela que je veux... excepté le fait que quand je fait marcher la macro boucle par boucle, je constate que le code ci-dessous renvoie au numéro de la ligne plutôt que la valeur qui se trouve dans la colonne D de cette ligne... est-ce normal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
    Merci d'avance,

    lbroc84

  11. #11
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Voici une traduction « maison » de ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row
    Examine chaque cellule de la plage D1 à D(x) de la feuille Sh1; (x) est le numéro de la dernière ligne renseignée déterminé avec Sh1.Range("D" & Rows.Count).End(xlUp).Row.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set rg = Sh2.Range("R:R").Find(what:=cell.Value, lookat:=xlWhole)  
    If Not rg Is Nothing Then
    Si tu trouves une valeur identique à cette cellule dans la colonne R de la feuille Sh2, alors…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If rg.Offset(0, 23).Value = "READ-ONLY" Then MsgBox "READ-ONLY trouvé sur compte " & rg
    Si la valeur de la cellule située en colonne AO de la même ligne est "READ-ONLY" alors affiche le numéro de compte.

    En espérant que cette explication pourra te satisfaire.

    Cordialement.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Merci pour votre explication détaillée... C'est en effet, le résultat que je souhaite obtenir...

    Le seul problème c'est que Rg renvoie "Nothing" alors que le nombre qui se trouve dans "cell" se trouve bien dans le deuxième fichier...

    Je ne sais pas pourquoi ?

    lbroc84

  13. #13
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Le seul problème c'est que Rg renvoie "Nothing" alors que le nombre qui se trouve dans "cell" se trouve bien dans le deuxième fichier...
    La fonction Find cherche la valeur exact dans le code proposé. (lookat:=xlWhole), si tu as un espace devant ou derriere la valeur cherchée, find ne trouvera pas.

    Essais en remplaçant xlWhole par xlPart

Discussions similaires

  1. Load data avec une variable pour nom de fichier
    Par kelk1 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 14/01/2016, 14h41
  2. [Batch] Renommage d'une partie du nom d'un fichier à nb de caractères variable
    Par jjaffeux dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 08/07/2009, 18h36
  3. Réponses: 4
    Dernier message: 27/09/2007, 15h05
  4. Utiliser une variable comme nom de fichier
    Par lo00_ dans le forum MATLAB
    Réponses: 1
    Dernier message: 28/06/2006, 13h57
  5. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58

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