Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2012, 17h48   #1
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
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 :
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
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 18h15   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Bonjour,

Ci dessous une fonction "Ouvrir" qui gère la demande d'ouverture d'un fichier
Code :
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 :
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/01/2012, 10h08   #3
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
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 :
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
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 10h36   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
La ligne ci dessous fait une recherche verticale sur une seule ligne
Citation:
Code :
 VLookup(cell, Sh2.Range("R20:AO20"), 24, False)
Si tu veux rechercher dans la colonne R et retourner la colonne AO

Code :
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 14h13   #5
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
Bonjour,

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

Code :
sh2.range("AO" & rg.Row).Value
lbroc84
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 14h16   #6
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Ajoute Msgbox devant la ligne

Code :
Msgbox sh2.range("AO" & rg.Row).Value
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 17h34   #7
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
Merci...

Mais maintenant ca bugue à :

Code :
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 :
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
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h24   #8
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Désolé, il faut faire le test en 2 fois

Code :
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 19h02   #9
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Bonjour lbroc84, jfontaine, le forum,

Si j'ai bien compris ce que souhaite lbroc84
Code :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 15h11   #10
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
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 :
For Each cell In Sh1.Range("D1:D" & Sh1.Range("D" & Rows.Count).End(xlUp).Row)
Merci d'avance,

lbroc84
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 18h41   #11
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 696
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 696
Points : 1 448
Points : 1 448
Bonjour,

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

Code :
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 :
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 :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 11h45   #12
Invité régulier
 
Femme
Administrateur de base de données
Inscription : 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 : 6
Points : 6
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
lbroc84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 11h52   #13
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 920
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 920
Points : 7 237
Points : 7 237
Citation:
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h19.


 
 
 
 
Partenaires

Hébergement Web