Appel de fichier source macro excel

Résolu/Fermé
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017 - 18 janv. 2017 à 10:39
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017 - 23 janv. 2017 à 10:30
Bonjour !

Voila je travaille sur un remplissage automatique de formulaire par les informations d'un autre formulaire. Le formulaire source est un Ordre de Mission et je cherche à récupérer les informations servant à établir l’État de Frais de Mission.

Avec mes quelques connaissances j'ai crée un bouton ActiveX pour faire le rapprochement des deux ayant comme code ce qui suit :

Private Sub cm1_Click()
'Rapprochement entre données de l'ordre de mission et de l'état de frais de mission

'valeurs fixes
Application.ActiveSheet.Range("D8").Value = "=OMtest!$C$9"
Application.ActiveSheet.Range("L8").Value = "=OMtest!$G$9"
Application.ActiveSheet.Range("A11").Value = "=OMtest!$B$12"
Application.ActiveSheet.Range("D13").Value = "=OMtest!$C$15"
Application.ActiveSheet.Range("L13").Value = "=OMtest!$F$15"
Application.ActiveSheet.Range("D15").Value = "=OMtest!$C$18"
Application.ActiveSheet.Range("L15").Value = "=OMtest!$F$18"
Application.ActiveSheet.Range("I70").Value = "=OMtest!$C$29"

'valeurs modifiées
Application.ActiveSheet.Range("L3").Value = "=OMtest!$C$6"
If Application.ActiveSheet.Range("L3").Value = "Présidence Direction" Then
Application.ActiveSheet.Range("L3").Value = "PDS"
ElseIf Application.ActiveSheet.Range("L3").Value = "Relations extérieures et formation continue" Then
Application.ActiveSheet.Range("L3").Value = "DRE"
ElseIf Application.ActiveSheet.Range("L3").Value = "Etudes" Then
Application.ActiveSheet.Range("L3").Value = "DE"
ElseIf Application.ActiveSheet.Range("L3").Value = "Technique" Then
Application.ActiveSheet.Range("L3").Value = "PDS"
Else: Application.ActiveSheet.Range("L3").Value = ""
End If


Application.ActiveSheet.Range("N3").Value = "=OMtest!$F$6"
If Application.ActiveSheet.Range("N3").Value = "Atelier Ludwigsburg Paris" Then
Application.ActiveSheet.Range("N3").Value = "FACAD"
ElseIf Application.ActiveSheet.Range("N3").Value = "Financier" Then
Application.ActiveSheet.Range("N3").Value = "FINAN"
ElseIf Application.ActiveSheet.Range("N3").Value = "Relations extérieures" Then
Application.ActiveSheet.Range("N3").Value = "FAEXT"
ElseIf Application.ActiveSheet.Range("N3").Value = "Echanges" Then
Application.ActiveSheet.Range("N3").Value = "FECHA"
ElseIf Application.ActiveSheet.Range("N3").Value = "Festivals" Then
Application.ActiveSheet.Range("N3").Value = "FFEST"
ElseIf Application.ActiveSheet.Range("N3").Value = "Formation Continue" Then
Application.ActiveSheet.Range("N3").Value = "FCONT"
ElseIf Application.ActiveSheet.Range("N3").Value = "1ère Année" Then
Application.ActiveSheet.Range("N3").Value = "F1A"
ElseIf Application.ActiveSheet.Range("N3").Value = "2ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F2A"
ElseIf Application.ActiveSheet.Range("N3").Value = "3ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F3A"
ElseIf Application.ActiveSheet.Range("N3").Value = "4ème Année" Then
Application.ActiveSheet.Range("N3").Value = "F4A"
ElseIf Application.ActiveSheet.Range("N3").Value = "Commun années" Then
Application.ActiveSheet.Range("N3").Value = "FCOA"
ElseIf Application.ActiveSheet.Range("N3").Value = "Distribution Exploitation" Then
Application.ActiveSheet.Range("N3").Value = "FDIST"
ElseIf Application.ActiveSheet.Range("N3").Value = "Recherche" Then
Application.ActiveSheet.Range("N3").Value = "FRECH"
ElseIf Application.ActiveSheet.Range("N3").Value = "Résidence" Then
Application.ActiveSheet.Range("N3").Value = "FRSD"
ElseIf Application.ActiveSheet.Range("N3").Value = "Série TV" Then
Application.ActiveSheet.Range("N3").Value = "FTV"
ElseIf Application.ActiveSheet.Range("N3").Value = "Technique" Then
Application.ActiveSheet.Range("N3").Value = "FINAN"
Else: Application.ActiveSheet.Range("N3").Value = ""
End If

Application.ActiveSheet.Range("I54").Value = "=OMtest!$C$23"
If Application.ActiveSheet.Range("I54").Value = "Indemnité forfaitaire de repas" Or Application.ActiveSheet.Range("I54").Value = "Facturé directement à La Fémis (2)" Then
Application.ActiveSheet.Range("I54").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I54").Value = ""
End If

Application.ActiveSheet.Range("I61").Value = "=OMtest!$F$23"
If Application.ActiveSheet.Range("I61").Value = "Indemnité forfaitaire de nuitée" Or Application.ActiveSheet.Range("I61").Value = "Facturé directement à La Fémis (2)" Then
Application.ActiveSheet.Range("I61").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I61").Value = ""
End If

Application.ActiveSheet.Range("I74").Value = "=OMtest!$F$29"
If Application.ActiveSheet.Range("I74").Value = "Facturé directement à La Fémis" Then
Application.ActiveSheet.Range("I74").Value = "La FEMIS"
Else: Application.ActiveSheet.Range("I74").Value = ""
End If

End Sub


Actuellement j'obtiens bien le résultat que je veux.
Par contre, je dois sélectionner le fichier source dans la fenêtre d'ouverture de fichier pour chaque ligne de code.
Le fichier source étant toujours le même pour chaque ligne, j'aimerais un moyen de ne le sélectionner qu'une seule fois au début et qu'il serve de référence pour toutes les lignes suivantes !

Merci d'avance de votre aide.
A voir également:

8 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
18 janv. 2017 à 13:00
Bonjour Wizaar, bonjour le forum,

Pour éviter toute confusion, je passe par des variables pour nommer classeur source / classeur destination, onglet source et onglet destination.
Comme dans ton code je ne vois aucune ligne correspondant à l'activation d'un classeur ou d'un onglet, je vais avoir du mal a te proposer un code adapté à ton cas. Mais disons que :

- le classeur destination contient la macro
- l'onglet destination soit nommé Feuil1
- le classeur source soit nommé Classeur Source.xlsx
- l'onglet source soit nommé OMTest
(tu adapteras à ton cas...)

Ça donnerait un code du type :

Private Sub cm1_Click()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)

Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination (à adapter à ton cas)
Set CS = Workbooks("Classeur Source.xlsx") 'définit le classeur source CS (nom à adapter à ton cas) - Il faut impérativement que se classeur soit ouvert !
Set OS = CS.Worksheets("OMTest") 'définit l'onglet source OS

OD.Range("D8").Value = OS.Range("C9").Value 'plus besoin de sélectionner ni le classeur ni l'onglet, il sont spécifiés dans le code
'autres lignes à adapter...

End Sub

0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
18 janv. 2017 à 14:51
Merci pour la réponse rapide !

Ce que tu me proposes ressemble à ce que j'ai essayé de faire en premier lieu en me basant sur des infos que j'ai trouvé sur les différents forums.

Malheureusement ça ne me convient pas.
Dans ce que tu proposes, le classeur source est défini il me semble.
Or, dans mon cas, le classeur source est différent pour chaque utilisation.
A un Etat de Frais de Mission correspond un Ordre de Mission unique.

Dans la version actuelle de mon code, l'activation du bouton de commande ouvre une fenêtre pour sélectionner le fichier source, ce qui est parfait, j'aimerais seulement pouvoir ne le sélectionner qu'une seule fois et non pour chaque ligne de code.

Donc le code que tu me propose me conviendrais si et seulement si il serait possible de sélectionner le Classeur Source (ou CS dans ton code) manuellement à l'initialisation de la macro.

Existe-t'il une commande pour remplacer la ligne :
Set CS = Workbooks("Classeur Source.xlsx")
ou le choix serait donné à l'utilisateur de sélectionner le classeur source parmi tous les ordres de mission existants ?

Merci d'avance !
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
18 janv. 2017 à 19:53
Re,

Dans la version actuelle de mon code, l'activation du bouton de commande ouvre une fenêtre pour sélectionner le fichier source, ce qui est parfait, j'aimerais seulement pouvoir ne le sélectionner qu'une seule fois et non pour chaque ligne de code.

Pourquoi tu ne fournis pas le code intégral ? Si tu as déjà un code d'ouverture de classeur, juste après l'ouverture, il suffit de définir le classeur source avec la ligne de code :

Set CS = ActiveWorkbook

Puis tu reprends toutes tes lignes...

Sinon, pour rajouter le code d'ouverture, il me faudrait au moins le chemin d'accès complet du dossier où se trouvent tous les fichiers source...
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
19 janv. 2017 à 10:10
Re !

J'ai bien posté l'intégralité de mon code...
Je ne sais pas pourquoi ça marche, mais ça marche ^^
J'imagine qu'excel reconnait automatiquement un chemin incomplet sur la première commande ou quelque chose comme ça.

Du coup je suis un peu perdu...

Le chemin d'accès au dossier contenant les classeurs source ressemble à
C:\Users\Username\Desktop\User\Documents test

J'attends que ça fonctionne pour le passer sur le serveur commun mais j'imagine qu'il suffira de changer le chemin ensuite par la nouvelle localisation du fichier.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
19 janv. 2017 à 10:50
Bonjour Wizaar, bonjour le forum,

Si les fichiers source se trouvent dans le même dossier que le fichier destination on n'a pas besoin du chemin d'accès...
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
19 janv. 2017 à 10:57
C'est seulement le cas pour les versions test. Les versions finales seront bien dans des dossiers différents sur un serveur commun.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
19 janv. 2017 à 11:24
Re,

Le code avec la boîte de dialogue Ouvrir qui permet de sélectionner le fichier source :

Private Sub cm1_Click()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim FD As FileDialog 'déclare la variable FD (FileDialog)
Dim CA As String 'déclare la varaible CA (Chemin d'accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)

Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("Feuil1") 'définit l'onglet destination (à adapter à ton cas)
CA = CD.Path 'définit le chemin d'accès CA du classeur destination
Set FD = Application.FileDialog(msoFileDialogOpen) 'définit la variable FD (Fichier Ouvrir)
With FD 'prend en compte la variable FD
    .InitialFileName = CA & "\*.xlsx" 'définit le chemin d'accès et les fichiers ciblés par défaut
    .AllowMultiSelect = False 'ne permet la sélection que d'un seul fichier
    If .Show = 0 Then Exit Sub 'si bouton "Annuler", sort de la procédure
End With 'fin de la prise en compte de la varaible FD
Set FD = Nothing 'vide la variable de la mémoire
Set CS = ActiveWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("OMTest") 'définit l'onglet source OS

OD.Range("D8").Value = OS.Range("C9").Value 'plus besoin de sélectionner ni le classeur ni l'onglet, il sont spécifiés dans le code
'autres lignes à adapter...
End Sub
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
19 janv. 2017 à 13:12
Ok j'essaie de mettre ça en place cet après-midi.

Merci bien !
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
20 janv. 2017 à 11:00
Re-bonjour !

Pas eu le temps de tester hier.

Je viens de faire l'essai ce matin !

Quand j'active la macro, après m'avoir demandé de sélectionner le classeur source, elle plante.

Le message d'erreur :

Erreur d’exécution "9" :

L'indice n'appartient pas à la sélection.

Et apparemment c'est cette ligne qui coince :
Set OS = CS.Worksheets("OMtest") 'définit l'onglet source OS

Pourtant l'onglet en question est correctement nommé...
J'ai essayé avec la dénomination CS.Worksheets(1) puisque c'est le premier onglet en partant de la gauche et que j'ai lu quelque part qu'on pouvait l'appeler aussi de cette manière.
Quand je lance la macro avec ce changement, elle ne plante plus, mais je n'ai aucun résultat...

Des idées ?
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
20 janv. 2017 à 11:58
Re,

Oui, si tu es sûr que l'onglet est toujours le premier ton changement est correct. Mais malheureusement, sans les fichiers (le destination et au moins un source), je ne pourrai pas t'aider plus que ça...
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
20 janv. 2017 à 12:08
L'onglet source est bien toujours le premier, pourtant les informations ne sont pas récupérées. Pourtant avec ma première version "à l'arrache" ça fonctionnait ce qui me laisse perplexe...

Le classeur destination : https://ufile.io/ec8b4

Le classeur source : https://ufile.io/c6e41
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
20 janv. 2017 à 12:13
Re,

Je ne pourrai regarder ça que plus tard dans la soirée...
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
20 janv. 2017 à 12:16
Pas de problème déjà que tu m'aides je vais pas te presser en plus ;)
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
20 janv. 2017 à 15:18
Désolé mais je n'arrive pas à télécharger tes fichiers. FireFox me bloque l'accès... Regarde avec https://www.cjoint.com/
0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
20 janv. 2017 à 15:25
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
20 janv. 2017 à 19:25
Bonsoir,

Il y avait en effet une erreur dans mon code qui n'ouvrait pas le classeur source. C'est corrigé, regarde si ça convient. Tu m'as envoyé un fichier source vierge et évidemment la macro récupère des valeurs vides. Pense a pré remplir le fichier source pour récupérer ses données dans la fichier destination...
Le code corrigé :
Private Sub cm1_Click()
'Rapprochement entre données de l'ordre de mission et de l'état de frais de mission

Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim FD As FileDialog 'déclare la variable FD (FileDialog)
Dim CA As String 'déclare la varaible CA (Chemin d'accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)

Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Worksheets("MISSION") 'définit l'onglet destination
CA = CD.Path 'définit le chemin d'accès CA du classeur destination
Set FD = Application.FileDialog(msoFileDialogOpen) 'définit la variable FD (Fichier Ouvrir)

With FD 'prend en compte la variable FD
    .InitialFileName = CA & "\*.xlsx" 'définit le chemin d'accès et les fichiers ciblés par défaut
    .AllowMultiSelect = False 'ne permet la sélection que d'un seul fichier
    If .Show = 0 Then Exit Sub Else .Execute 'si bouton "Annuler", sort de la procédure, sinon ouvre le fichier
End With 'fin de la prise en compte de la variable FD

Set FD = Nothing 'vide la variable de la mémoire
Set CS = ActiveWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("OMtest") 'définit l'onglet source OS

'valeurs fixes
    OD.Range("D8").Value = OS.Range("C9").Value
    OD.Range("L8").Value = OS.Range("G9").Value
    OD.Range("A11").Value = OS.Range("B12").Value
    OD.Range("D13").Value = OS.Range("C15").Value
    OD.Range("L13").Value = OS.Range("F15").Value
    OD.Range("D15").Value = OS.Range("C18").Value
    OD.Range("L15").Value = OS.Range("F18").Value
    OD.Range("I70").Value = OS.Range("C29").Value
    
'valeurs modifiées
    OD.Range("L3").Value = OS.Range("C6").Value
        If OD.Range("L3").Value = "Présidence Direction" Then
            OD.Range("L3").Value = "PDS"
        ElseIf OD.Range("L3").Value = "Relations extérieures et formation continue" Then
            OD.Range("L3").Value = "DRE"
        ElseIf OD.Range("L3").Value = "Etudes" Then
            OD.Range("L3").Value = "DE"
        ElseIf OD.Range("L3").Value = "Technique" Then
            OD.Range("L3").Value = "PDS"
        Else: OD.Range("L3").Value = ""
        End If
        

    OD.Range("N3").Value = OS.Range("F6").Value
        If OD.Range("N3").Value = "Atelier Ludwigsburg Paris" Then
            OD.Range("N3").Value = "FACAD"
        ElseIf OD.Range("N3").Value = "Financier" Then
            OD.Range("N3").Value = "FINAN"
        ElseIf OD.Range("N3").Value = "Relations extérieures" Then
            OD.Range("N3").Value = "FAEXT"
        ElseIf OD.Range("N3").Value = "Echanges" Then
            OD.Range("N3").Value = "FECHA"
        ElseIf OD.Range("N3").Value = "Festivals" Then
            OD.Range("N3").Value = "FFEST"
        ElseIf OD.Range("N3").Value = "Formation Continue" Then
            OD.Range("N3").Value = "FCONT"
        ElseIf OD.Range("N3").Value = "1ère Année" Then
            OD.Range("N3").Value = "F1A"
        ElseIf OD.Range("N3").Value = "2ème Année" Then
            OD.Range("N3").Value = "F2A"
        ElseIf OD.Range("N3").Value = "3ème Année" Then
            OD.Range("N3").Value = "F3A"
        ElseIf OD.Range("N3").Value = "4ème Année" Then
            OD.Range("N3").Value = "F4A"
        ElseIf OD.Range("N3").Value = "Commun années" Then
            OD.Range("N3").Value = "FCOA"
        ElseIf OD.Range("N3").Value = "Distribution Exploitation" Then
            OD.Range("N3").Value = "FDIST"
        ElseIf OD.Range("N3").Value = "Recherche" Then
            OD.Range("N3").Value = "FRECH"
        ElseIf OD.Range("N3").Value = "Résidence" Then
            OD.Range("N3").Value = "FRSD"
        ElseIf OD.Range("N3").Value = "Série TV" Then
            OD.Range("N3").Value = "FTV"
        ElseIf OD.Range("N3").Value = "Technique" Then
            OD.Range("N3").Value = "FINAN"
        Else: OD.Range("N3").Value = ""
        End If

    OD.Range("I54").Value = OS.Range("C23").Value
        If OD.Range("I54").Value = "Indemnité forfaitaire de repas" Or OD.Range("I54").Value = "Facturé directement à La Fémis (2)" Then
            OD.Range("I54").Value = "La FEMIS"
        Else: OD.Range("I54").Value = ""
        End If
        
    OD.Range("I61").Value = OS.Range("F23").Value
        If OD.Range("I61").Value = "Indemnité forfaitaire de nuitée" Or OD.Range("I61").Value = "Facturé directement à La Fémis (2)" Then
            OD.Range("I61").Value = "La FEMIS"
        Else: OD.Range("I61").Value = ""
        End If
        
    OD.Range("I74").Value = OS.Range("F29").Value
        If OD.Range("I74").Value = "Facturé directement à La Fémis" Then
            OD.Range("I74").Value = "La FEMIS"
        Else: OD.Range("I74").Value = ""
        End If
        
End Sub

0
Wizaar Messages postés 10 Date d'inscription mercredi 18 janvier 2017 Statut Membre Dernière intervention 23 janvier 2017
Modifié par Wizaar le 23/01/2017 à 10:30
Salut !

J'ai mis en place le changement ce matin et tout a l'air de rouler !

Merci beaucoup pour ton aide, c'est une fonction que je réutiliserais ^^

Je clôture le sujet.

Encore merci !
0