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 :

Mise à jour de liaisons entre 2 classeurs


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut Mise à jour de liaisons entre 2 classeurs
    Bonjour,

    J'ai une macro excel qui ouvre un classeur, le modifie en important des données externes et le sauve sous le même nom en changeant l'index.
    Exemple:
    classeur à mettre à jour: Rapport_S31.xls
    classeur mis à jour: Rapport_S35.xls

    (Sxx est le numéro de semaine)

    Dans chaque classeur j'ai une liaison vers le classeur précédent qui doit donc être mise à jour.
    Cette liaison sert pour des nom de liste pour des graphiques (j'ai sur le graphique l'ancienne courbe et la nouvelle)

    Je procède de la façon suivante:

    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
     
        Dim wbrapport as Excel.workbook
        Dim wbodrapport as Excel.workbook
     
        ....
        Le programme de mise à jour
        ....
     
        Set wboldrapport = Workbooks.Open(oldrapport)
        wbrapport.Activate
        liaison = ActiveWorkbook.LinkSources
        ActiveWorkbook.ChangeLink liaison(1), oldrapport, xlExcelLinks
        ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
        wboldrapport.Close
        wbrapport.Save
    Mais dès qu'on arrive à la ligne "ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources"

    Excel me sort l'erreur suivante:
    La methode 'UpdateLink' de l'objet '_Workbook' a échouée

    Par contre les liens ont bien été mis à jour...

  2. #2
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour mamax29,

    peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources(1)

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Nop,

    Nada, j'ai la même erreur

  4. #4
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    et que vaut la variable

    ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    même chose....

    Si je l'affiche j'ai bien le chemin complet du nouveau fichier pour la liaison.
    Celui avec lequel je veux faire la mise à jour.

    Il existe bien.

    Deplus le ChangeLink fonctionne bien car sans essayer de faire l'updatelink, si j'ouvre le nouveau fichier, dans Edition=>Liaisons, je vois bien le nouveau fichier.

    Et de là je peu faire "ouvrir fichier lié" puis "mise à jour des valeurs" et cela fonctionne nickel.

  6. #6
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    pas trop d'idées alors

    J'ai fait quelques tests de liens entre 2 classeurs et je n'ai jamais réussi à faire planter la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
    ...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Si quelqu'un d'autre a une idée....

    Pour apporter de l'eau au moulin, voici la macro dans son ensemble:

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
     
    Private Sub OCAGE_Click()
     
        ' Déclaration des variables
        Dim datemacro As String
        Dim semainemacro As String
        Dim repertoire As String
        Dim ocage As String
        Dim ochla As String
     
        Dim rapport As String               'Nom complet avec le chemin du rapport Ocage
        Dim oldrapport As String            'Nom complet avec le chemin du rapport Ocage qui pointera sur l'ancien rapport
        Dim wbrapport As Excel.Workbook     'Variable indiquant le classeur Excel du fichier analyse
        Dim wsrapport As Excel.Worksheet    'Variable indiquant la feuille dans le classeur Excelde la répartition des CIC
        Dim wboldrapport As Excel.Workbook
        Dim liaison As Variant
        Dim oFD As Object                   'Variable pour la fenêtre de sélection du fichier de log
        Dim fichier As String               'fichier csv d'entrée
        Dim sheetname As String
        Dim cpt As Integer                  'Compteur de ligne du fichier de log
        Const Sep = ";"                     'Séparateur des champs dans le fichier de log
        Dim Tablo() As String               'Tableau temporaire qui stockera chaque ligne du fichier de log
        Dim Recup As String                 'Variable qui contiendra la ligne du fichier de log
        Dim NEname As String
        Dim wsrapportname As String
        Dim listeNE(7) As String
        Dim NEindex As Integer
     
        ' Variables pour définir le classeur excel courant (celui-ci)
        Dim wbanalyse As Excel.Workbook
        Dim wstemp As Excel.Worksheet
        Set wbanalyse = ThisWorkbook
     
        ' Variables pour les boucles
        Dim i As Integer
     
        ' Initialisation des variables
        repertoire = "D:\Maximilien\Rapports\Ocage\"
        datemacro = InputBox("Entrez date de l'interrogation OCAGE", "Macro OCAGE")
        semainemacro = InputBox("Entrez la semaine l'interrogation OCAGE", "Macro OCAGE")
        ocage = repertoire & "sources\ocage\final\" & datemacro & "\"
        ochla = repertoire & "sources\ochla\final\" & semainemacro & "\"
     
        Set oFD = Application.FileDialog(msoFileDialogOpen)
     
        With oFD
            'Ajoute les filtres pour fichiers textes et tous
            With .Filters
                .Clear
                .Add "Classeur Excel", "*.xls", 1
                .Add "Tous", "*.*", 2
            End With
            'Aucun nom de fichier par défaut
            .InitialFileName = "D:\Maximilien\Rapports\Ocage\rapports"
            'Interdit la multi sélection
            .AllowMultiSelect = False
     
            'Affiche la fenêtre et vérifie qu'un fichier a bien été choisi
            If .Show Then
                'Récupère le nom du fichier de log choisi dans la variable "fichier"
                rapport = .SelectedItems(1)
            End If
        End With
     
        ' Ouvre l'ancien rapport et le sauve dans un nouveau nom
        Set wbrapport = Workbooks.Open(rapport)
        oldrapport = rapport
        ' Sauvegarde du Workbook à la date actuelle
        wbrapport.SaveAs repertoire & "rapports\" & "SFR_Mobile_OCAGE_" & semainemacro & ".xls"
     
        listeNE(0) = "CT001"
        listeNE(1) = "CT010"
        listeNE(2) = "CT032"
        listeNE(3) = "CT044"
        listeNE(4) = "CT066"
        listeNE(5) = "CT197"
        listeNE(6) = "CT198"
        listeNE(7) = "CT199"
        NEindex = 0
     
     
        For NEindex = 0 To 7
            ' *******************************************
            ' Traitement des feuilles de données des CT
     
            ' Initialisation des variables
            NEname = listeNE(NEindex)
            wsrapportname = "Data " & NEname
     
            ' Effacement des anciennes données
            Set wsrapport = wbrapport.Sheets(wsrapportname)
            wsrapport.Visible = xlSheetVisible
            wsrapport.Range("A2", "B400").ClearContents
            wsrapport.Range("F2", "AE400").ClearContents
     
            ' Paramétrage du comportement
            Application.ScreenUpdating = False
     
            ' ------------------------
            ' Import des données OCHLA
     
            ' Effacement de l'onglet "temp" du classeur de macro s'il existe
            Application.DisplayAlerts = False
            On Error Resume Next
                wbanalyse.Worksheets("temp").Delete
            On Error GoTo 0
            Application.DisplayAlerts = True
     
            'On créé un onglet "temp" dans lequel on importera le fichier de log
            wbanalyse.Worksheets.Add(after:=Worksheets("Index")).Name = "temp"
            Set wstemp = wbanalyse.Sheets("temp")
     
            'On importe le fichier de log OCHLA au format CSV dans l'onglet "temp"
            fichier = ochla & NEname & "_" & semainemacro & ".csv"
            Application.ScreenUpdating = False
            cpt = 0
            Open fichier$ For Input Access Read As #1
                Do Until EOF(1)
                    Input #1, Recup
                    Tablo = Split(Recup, Sep)
                    For i = 0 To 1
                        wstemp.Range("A1").Offset(cpt, i) = Tablo(i)
                    Next i
                    cpt = cpt + 1
                Loop
            Close #1
     
            ' Copie des données OCHLA dans le rapport
            wstemp.Activate
            wstemp.Range("A1", "B400").Select
            Selection.Copy
            wsrapport.Activate
            wsrapport.Range("A2").Select
            ActiveSheet.Paste
     
            ' ------------------------
            ' Import des données OCAGE
     
            ' Effacement de l'onglet "temp" du classeur de macro s'il existe
            Application.DisplayAlerts = False
            On Error Resume Next
                wbanalyse.Worksheets("temp").Delete
            On Error GoTo 0
            Application.DisplayAlerts = True
     
            'On créé un onglet "temp" dans lequel on importera le fichier de log
            wbanalyse.Worksheets.Add(after:=Worksheets("Index")).Name = "temp"
            Set wstemp = wbanalyse.Sheets("temp")
     
            'On importe le fichier de log OCAGE au format CSV dans l'onglet "temp"
            fichier = ocage & NEname & "_OCAGE_" & datemacro & ".csv"
            Application.ScreenUpdating = False
            cpt = 0
            Open fichier$ For Input Access Read As #1
                Do Until EOF(1)
                    Line Input #1, Recup
                    Tablo = Split(Recup, ";")
                    For i = 0 To UBound(Tablo)
                        If (i = 7 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDbl(Tablo(i))
                        ElseIf (i = 16 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDbl(Tablo(i))
                        ElseIf (i = 25 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDbl(Tablo(i))
                        ElseIf (i = 1 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDate(Format(Tablo(i), "dd/MMM/yyyy"))
                        ElseIf (i = 10 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDate(Format(Tablo(i), "dd/MMM/yyyy"))
                        ElseIf (i = 19 And Tablo(i) <> "") Then
                            wstemp.Range("A1").Offset(cpt, i) = CDate(Format(Tablo(i), "dd/MMM/yyyy"))
                        Else
                            wstemp.Range("A1").Offset(cpt, i) = Tablo(i)
                        End If
                    Next i
                    cpt = cpt + 1
                Loop
            Close #1
     
            ' Copie des données OCAGE dans le rapport
            wstemp.Activate
            wstemp.Range("A1", "Z400").Select
            Selection.Copy
            wsrapport.Activate
            wsrapport.Range("F2").Select
            ActiveSheet.Paste
            wsrapport.Range("A1").Select
     
     
            Application.Goto wsrapport.Range("A1"), Scroll:=True
     
            ' Set wsrapport = wbrapport.Sheets(wsrapportname)
            wsrapport.Visible = xlSheetHidden
        Next NEindex
     
        ' Effacement de l'onglet "temp" du fichier Analyse.xls
        Application.DisplayAlerts = False
        On Error Resume Next
            wbanalyse.Worksheets("temp").Delete
        On Error GoTo 0
        Application.DisplayAlerts = True
     
     
        ' selection de la feuille "index" du rapport en fin d'opération
        Set wsrapport = wbrapport.Sheets("index")
        wsrapport.Activate
        wsrapport.Range("A1").Select
     
        ' Mise à jour de la liaison avec l'ancien rapport
        Set wboldrapport = Workbooks.Open(oldrapport)
        wbrapport.Activate
        liaison = ActiveWorkbook.LinkSources
        ActiveWorkbook.ChangeLink liaison(1), oldrapport, xlExcelLinks
        ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
        wboldrapport.Close
        wbrapport.Save
        MsgBox "Mise à jour du rapport OCAGE Terminé", vbInformation
     
    End Sub
    Mais je ne pense pas que cela fasse avancer grands chose.

    Les choses les plus étranges c'est que malgré l'erreur que Excel me claque, la mise à jour des liaisons est tout de même faite correctement...

    Si je retire des deux commandes pour ouvrir et fermer le "oldrapport", ok, la mise a jour des liaisons ne se fait pas, mais Excel passe sans rien dire.

    Y-a-t-il une fonction dans l'outil VBA d'Excel pour voir ce qu'il se passe exactement lors de l’exécution de la commande de mise à jour?

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Mieux vaut tard que jamais, cette commande ne fonctionne pas lorsque le fichier sera ouvert en mode de compatibilité (en tout cas c'est l'analyse qu'on en a fait dans mon équipe). Du coup, tu devrais regarder si tes fichiers ne font pas un mix entre des formats Excel 97-2003 et Excel 2007.

    C'est très pénible et c'est une perte de temps terrible chez nous, mais on n'a toujours pas trouvé d'autres méthodes que de sauvegarder tous les fichiers au bon format...

Discussions similaires

  1. pb mise à jour auto. liaison entre 2 classeurs
    Par m21909 dans le forum Excel
    Réponses: 0
    Dernier message: 23/01/2012, 14h33
  2. [XL-2003] probleme de mise a jour en direct entre 2 classeurs excel
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/08/2011, 07h15
  3. [XL-2007] Mise à jour liaisons entre 2 classeurs
    Par XceSs dans le forum Excel
    Réponses: 3
    Dernier message: 07/10/2010, 03h19
  4. mise à jour des liens entre 2 classeurs
    Par pyrene dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/05/2008, 12h28
  5. Réponses: 2
    Dernier message: 21/10/2005, 17h02

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