Problème macro excel

fredbel

Membre confirmé
5 Mai 2009
21
1
Bonjour,

Mon problème vient de ma méconnaissance de l'utilisation des macros sous excel 2011 (version 14.0.0)

je suis entraineur et l'informatique aidant, les engagements se font par échange de fichier excel.

Le seul soucis est que la fédération utilise excel avec une macro programmé pour importer des fichiers (téléchargés directement de la base de donnée fédérale) préalablement enregistrer à la racine "C:"

1ère question qu'est ce qui correspondrait de près ou de loin à la racine "C:" sous mac?

Je n'y comprends pas grand chose mais en ouvrant le gestionnaire de macro, différentes fenêtres s'ouvrent, dont celle-ci qui me dit que c'est ici (enfin je pense) qu'il faut indiquer le chemin pour trouver le dit fichier.

Sub Macro1()
'
' Macro1 Macro
'

'
Sheets("FFN Licences").Select
Workbooks.OpenText Filename:= _
"C:\licencies.ffn", Origin:= _
xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=False, Space:=False, Other:=True, OtherChar:="|", FieldInfo:= _
Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7 _
, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array _
(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), _
Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array( _
27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1)) _
, TrailingMinusNumbers:=True
Columns("E:E").Select
Selection.Copy
Columns("B:B").Select
ActiveSheet.Paste
Columns("D:D").Select
Application.CutCopyMode = False
Selection.Copy
Columns("C:C").Select
ActiveSheet.Paste
Columns("I:I").Select
Application.CutCopyMode = False
Selection.Copy
Columns("E:E").Select
ActiveSheet.Paste

Columns("G:G").Select
Application.CutCopyMode = False
Selection.Copy
Columns("D:D").Select
ActiveSheet.Paste
Columns("A:A").Select
Application.CutCopyMode = False
Selection.Copy
Columns("G:G").Select
ActiveSheet.Paste
Columns("B:E").Select
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("licencies").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("licencies").Sort.SortFields.Add Key:=Range("B1"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("licencies").Sort
.SetRange Range("B1:G2000")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B1").Select

Columns("B:G").Select
Selection.Copy
Windows( _
"Engagements Pass compétition (officiel CD75).xls"). _
Activate
Columns("B:B").Select
ActiveSheet.Paste
Sheets("Filtre").Select
Application.Workbooks("licencies.ffn").Close SaveChanges:=False
End Sub

2nd question, la macro est elle adaptée pour une utilisation sous mac?

J'espère avoir été clair dans l'explication de mon problème et pouvoir vous lire rapidement.

Cordialement
 
Pour autant que je puisse en juger, une fois que dans la troisième ligne, tu as remplacé "C:\" par "nom_de_ton_disque_dur:", ça doit fonctionner, à condition, bien sûr que le fichier "licencies.ffn" soit sur la racine de ton disque.

Par contre, si tu mets ce dossier sur le bureau de ton Mac, alors, le chemin serait :

"nom_de_ton_disque_dur:Users:nom_de_ton_dossier_maison:Desktop:licencies.ffn
 
Merci Pascal pour ta réponse rapide.

j'ai appliqué scrupuleusement tes conseils et quand je lance le fichier une fenêtre s'ouvre avec le message d'erreur suivant:
Erreur de compilation
Argument nommé introuvable.

Ce message s'accompagne de la macro ci dessus avec "TrailingMinusNumbers:=" surligné.

Une petite idée de ce que cela peut vouloir dire?

Merci encore d'avance.
 
Bourk, quelle vilaine macro enregistrée et non révisée/optimisée ! :D

L'argument TrailingMinusNumbers (par défaut, sa valeur est True) n'est pas utilisable dans les versions Mac (tu risques de rencontrer d'autres problèmes du même type). Si tu enregistrais le même genre d'opération (importation d'un fichier texte) avec Excel 2011, tu n'aurais pas cet argument. Ce n'est pas très important, tu peux effacer cet argument (au besoin, il prendrait donc la valeur par défaut), il est inutile dans la grande majorité des cas de figure. Je cite (enfin, plus ou moins) John Peltier :
Dans les versions anciennes d'Excel (avant Excel 2003), l'import de certains fichiers sortis de gros systèmes (anciens) pouvait poser problème car le signe moins pouvait se trouver après le nombre et non avant. Cet argument a donc été rajouté (dans les versions Windows à partir de Excel 2003) pour permettre la prise en compte de ce cas de figure, le cas échéant.

A vue de nez, une fois le chemin d'accès adapté (cf. le message de Pascal 77) et cet argument supprimé, je pense que ta macro devrait fonctionner sur Mac.
 
Merci beaucoup pour vos réponses précises et réactives,

problème résolu et engagements terminés.

Au plaisir de vous relire.

ps: à titre personnel qu'est ce qui pourrait être révisée/optimisée et surtout comment? Et par curiosité n'existerait il pas une possibilité de programmation pour une utilisation multiplateforme (windows, OS X, Linux, etc..)?
 
Dernière édition:
qu'est ce qui pourrait être révisée/optimisée et surtout comment ?
Difficile de donner une réponse très précise sans connaître le contexte. Disons qu'il serait peut-être utile de ne pas rafraîchir l'affichage pendant l'exécution (Application.Screenupdating = False). Après, il faut voir si les trois instructions de tri successives sont utiles. Et puis les nombreuses instructions "Select" qui ne servent généralement à rien sauf à ralentir l'exécution (évidemment, ce n'est pas trop sensible sur une macro aussi courte)…


n'existerait il pas une possibilité de programmation pour une utilisation multiplateforme (windows, OS X, Linux, etc..)?
Si, bien sûr, du moins en ce qui concerne Windows et Mac OS X (il n'existe pas d'Excel qui tourne sous Linux ou sous etc) on peut inclure des instructions qui rendent la macro compatible. Comme tu as pu le voir, il faut adapter le chemin d'accès en fonction de la plateforme. Ce qu'on peut faire avec une instruction de "Compilation conditionnelle" (les instructions ne seront prises en compte que si la plateforme est la bonne). Tu peux par exemple mettre en début de macro quelque chose comme :
Bloc de code:
#If Mac Then
    MonClasseur = "Disque Dur:Users:tonnom:Desktop:licencies.ffn"
#Else
    MonClasseur = "C:\licencies.ffn"
#End If
et ensuite utiliser cette variable MonClasseur pour l'argument Filename : il aura automatiquement la valeur adaptée à l'environnement.

Pour le reste, comme on l'a vu, une fois l'argument TrailingMinusNumbers (incompatible avec la version Mac mais inutile avec la version Windows) supprimé, la macro ne devrait pas poser de problèmes...
 
Merci beaucoup Aliboron,

voici en lien le fichier excel en question, car il m'est difficile de décrire le contexte.
https://drive.google.com/file/d/0B3QL8WvquIledVEwdlBJYnh6TkE/edit?usp=sharing

La base de donnée je ne peux la communiquer car il y a toutes les informations personnelles des adhérents (noms, adresses, tel, etc..)
Le fichier extrait de la base de donnée, nom, prénom, date de naissance, numéro de licence, et met toutes ces informations sous forme de tableau.

J'ai essayé :
Tu peux par exemple mettre en début de macro quelque chose comme :
Code:
#If Mac Then
MonClasseur = "Disque Dur:Users:tonnom:Desktop:licencies.ffn"
#Else
MonClasseur = "C:\licencies.ffn"
#End If
et ensuite utiliser cette variable MonClasseur pour l'argument Filename : il aura automatiquement la valeur adaptée à l'environnement.
mais mes connaissances limités m'ont bloquées. Je ne sais plus où placer la variable "Monclasseur".

Je vous remercie de votre patience et de vos réponses instructives.
 
Dernière édition:
  • J’aime
Réactions: Aliboron
Est-ce que la proposition d'Aliburon peut être étendue pour un fichier pouvant s'exécuter en général sur Windows mais aussi sur Mac :
# if windows Then
..
# Else
...
# Endif
Ou faut-il imbriquer un # If Mac Then ?
Note : je ne peux pas tester sur un Windows ....
 
Est-ce que la proposition d'Aliburon peut être étendue pour un fichier pouvant s'exécuter en général sur Windows mais aussi sur Mac :
# if windows Then.../...
Pas d'intérêt particulier, puisque si tu utilises #If Mac Then, c'est automatiquement Windows lorsque la condition n'est pas remplie.
Ceci dit, tu peux aussi utiliser d'autres constantes (comme Win32 ou Win64 si tu cherches à vérifier de quelle famille de version Windows il est question, par exemple). Si besoin, tu peux imbriquer à l'aide de #Else if aussi. Quelque chose du genre :
Bloc de code:
#If Mac Then
    MonMessage = MsgBox("Je suis en train de tourner sur Mac OS X !", vbOKOnly, "Coucou !")
#ElseIf Win64 Then
    MonMessage = MsgBox("Je suis en train de tourner sur un PC en 64 bits !", vbOKOnly, "Coucou !")
#ElseIf Win32 Then
    MonMessage = MsgBox("Je suis en train de tourner sur un PC en 32 bits !", vbOKOnly, "Coucou !")
#Else
    MonMessage = MsgBox("Je ne sais pas trop où je suis...", vbOKOnly, "Coucou !")
#End If
Au besoin, tu peux trouver la liste des constantes de compilation conditionnelle sur cette page...
 
Dernière édition:
à la place de "C:\licencies.ffn" (guillemets comprises).

Merci Pascal j'ai effectué la manipulation et voici le message d'erreur qui apparait

Erreur d'exécution "1004":
'MonClasseur' introuvable. Vérifiez l'orthographe du nom du fichier et la validité de l'emplacement.

Si vous essayez d'ouvrir le fichier à partir de la liste des derniers fichiers ouverts (menu Fichiers), vérifiez que ce fichier n'a pas été renommé, déplacé ou supprimé.

Une petite idée, s'il vous plait?
 
Une petite idée, s'il vous plait ?
A priori, il semble y avoir un problème de guillemets. Est-ce que après Filename:= tu écris bien MonClasseur sans guillemets (dans la mesure où il s'agit d'une variable, il ne faut pas mettre de guillements, sous peine de la voir être considérée comme un chaîne et donc la macro va chercher le classeur "MonClasseur" et pas le classeur dont la variable contient le nom) ?

Si ça ne suffit pas à résoudre le problème, est-ce que tu peux copier les lignes de code concernées ? Sans ça, il va être difficile de dire où ça cloche.
 
Euréka

j'avais mis la variable entre guillemets. Problème résolu.

Par contre, en vous demandant s'il était possible d'utiliser la même macro que ce soit via un mac ou un pc, je n'avais pas réfléchi au fonctionnement du fichier légèrement différent.

Je m'explique, si j'ai bien compris la macro initial recherche sur "C:/" le fichier fédéral (licencies.ffn)
Le fait de mettre sur le "C:/" évite de passer par la nomination du chemin d'accès

"nom_de_ton_disque_dur:Users:nom_de_ton_dossier_maison:desktop:licencies.ffn"

Y a t'il un moyen (au même titre que pour windows) qui éviterait de rentrer dans la macro afin de noter manuellement le chemin d'accès? De la sorte le fichier serait exploitable pour tous les utilisateurs et peu importe leur interface.

Je vous remercie par avance de tous vos conseils qui m'auront beaucoup appris, et m'excuse de ma curiosité.
 
si j'ai bien compris la macro initial recherche sur "C:/" le fichier fédéral (licencies.ffn). Le fait de mettre sur le "C:/" évite de passer par la nomination du chemin d'accès
Oui. Mais ce n'est pas forcément un bon emplacement. Disons que je ne recommanderais pas d'utiliser C:\ sur un PC. Le "bon" emplacement serait plutôt "Mes Documents".

Y a t'il un moyen (au même titre que pour windows) qui éviterait de rentrer dans la macro afin de noter manuellement le chemin d'accès ? De la sorte le fichier serait exploitable pour tous les utilisateurs et peu importe leur interface.
Disons que, sur Mac OS X, le "bon emplacement" pourrait être le dossier ~/Documents ou le dossier ~/Téléchargements, selon le cas. Ils sont relativement faciles à identifier sans qu'on aie à connaître le nom de l'utilisateur courant ou le nom du disque dur, comme on peut le voir, toujours sur le site de Ron de Bruin, grâce à une petite boucle AppleScript.

En gros, pour déterminer correctement le chemin, tu peux écrire comme ça :
Bloc de code:
#If Mac Then
    Dim MonClasseur  As String
    '  Obtention par AppleScript du chemin d'accès au dossier "Téléchargements" de l'utilisateur
    '  pour le dossier "Documents" mettre "documents folder", pour le bureau "Desktop folder"
    MonClasseur = MacScript("return (path to downloads folder) as string") & "licencies.ffn"
#Else
    MonClasseur = "C:\licencies.ffn"
#End If
À adapter selon que tu utilises le dossier "Téléchargements", le dossier "Documents" ou le bureau de ton compte utilisateur courant.
 
Merci encore pour votre patience et vos retours si précis.

Dernière requête et j'arrête de vous importuner avec mes questions, puis-je me permettre de proposer votre travail à la fédé. pour être utiliser par l'ensemble des usagers?

Cordialement.
 
puis-je me permettre de proposer votre travail à la fédé. pour être utiliser par l'ensemble des usagers ?
Ben oui. Bien sûr. Si c'étaient des secrets, on ne les donnerait pas sur des sites publics. ;) Ceci dit, ça serait sympa de mentionner MacGénération quelque part dans un coin, puisque le seul "bénéfice" que les contributeurs retirent de leurs interventions, c'est justement un peu de reconnaissance de la part de ceux qui ont trouvé de l'aide...