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

VBScript Discussion :

Script désactiver les liaisons Excel


Sujet :

VBScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Script désactiver les liaisons Excel
    Bonjour à tous,

    Je viens de mettre en service un petit bout de script permettant de copier un fichier Excel et de le coller dans un dossier.
    Le script fonctionne, sauf que maintenant je cherche comment désactiver ou supprimer les liaisons Excel de ce fichier copier :-)

    Merci de votre aide. Jérôme

    Ci-dessous le script utilisé pour copier le fichier Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Déclaration des variables
    Dim Date_Maintenant, Heure_Maintenant, FSCopie
    'Formatage de la date et de l'heure
    Date_Maintenant = date
    Date_Maintenant = day(Date_Maintenant) & month(Date_Maintenant) & year(Date_Maintenant)
    Heure_Maintenant = time
    Heure_Maintenant = Hour(Heure_Maintenant) & Minute(Heure_Maintenant) '& Second(Heure_Maintenant)
    'Copie du fichier
    Set FSCopie = CreateObject("Scripting.FileSystemObject")
    FSCopie.CopyFile "C:\Users\ADMIN\Essai1.xlsx" , "C:\Users\ADMIN\Desktop\Test\" & Date_Maintenant & "_" & Heure_Maintenant & ".xlsx"

  2. #2
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Il y a peut-être un moyen de copier le fichier sans se soucier des liaisons : On copie seulement les données(et formules s'il y en a) :
    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
    Option Explicit     
       Dim appExcel, wBook1, wBook2, Cnt
       Dim iRow, Y, RowsCount, ColsCount
     
      Set appExcel = CreateObject("Excel.Application")
      appExcel.Visible = True
      appExcel.DisplayAlerts = False
      ' Adapte le chemin des fichiers selon ce que tu as dans la ligne suivante :
      Call CopyDataToNewFile("C:\TESTDIR\Temp\Essai1.xlsx", "C:\TESTDIR\Tmp\Essai1.xlsx")
      Wscript.Sleep 5000 ' Attente de 5 secondes avant fermeture des fichiers
      appExcel.Quit 
      Set appExcel = Nothing 
    '===========================
    Sub CopyDataToNewFile(XLFile1, XLFile2)
        Cnt = 0
        iRow = 1
     
        Set WBook1 = appExcel.Workbooks.Open(XLFile1, , True) ' Ouvre le fichier Excel source en lecture seule
        appExcel.WorkBooks(1).Activate
        RowsCount = WBook1.ActiveSheet.UsedRange.Rows.Count      ' Nombre de lignes dans le fichier excel source
        ColsCount = WBook1.ActiveSheet.UsedRange.Columns.Count   ' Nombre de colonnes dans le fichier excel source
        Set wBook2 = appExcel.Workbooks.Add()                   ' Ouvre un nouveau classeur
     
        Do While iRow < RowsCount+1
        Cnt = Cnt + 1 
        For Y = 1 To ColsCount
          ' Copie la formule(la valeur s'il n'y a pas de formule)
            WBook2.Sheets(1).Cells(Cnt, Y).Formula = WBook1.Sheets(1).Cells(Cnt, Y).Formula
          ' Copie la taille de la cellule
            WBook2.Sheets(1).Columns(cnt).ColumnWidth = WBook1.Sheets(1).Columns(cnt).ColumnWidth
            WBook2.Sheets(1).Rows(cnt).RowHeight = WBook1.Sheets(1).Rows(cnt).RowHeight
          ' Copie la taille et le poids de la police
            WBook2.Sheets(1).Cells(Cnt, Y).Font.Size = WBook1.Sheets(1).Cells(Cnt, Y).Font.Size
            WBook2.Sheets(1).Cells(Cnt, Y).Font.Bold = WBook1.Sheets(1).Cells(Cnt, Y).Font.Bold
          ' Mise en forme de la bordure de la cellule
            WBook2.Sheets(1).Range("A" & Cstr(iRow) & ":" & Chr(64 + Y) & Cstr(Y)).BorderAround 1, 2, 0
          Next
          iRow = iRow + 1
        Loop
        WBook1.Close
        WBook2.SaveAs XLFile2, , , , False ' Enregistre le nouveau classeur
    End Sub
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonjour l_autodidacte,

    Le script fonctionne, par contre toutes les valeurs des liaisons sont vide.
    Le script copie bien toutes les valeurs en dur mais celles des liaisons.

  4. #4
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Les liaisons sont-elles internes (relatives au classeur en cours) ou externes(relatives à d'autres classeurs ou autres fichiers) ?
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Les liaisons sont externe. Du style le fichier A comporté une liaison vers un fichier B

  6. #6
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Il y a sur cette page un utilitaire qui pourrait te dépanner.
    La page étant en anglais, j'en donne une traduction exhaustive :
    FINDLINK
    Objectif


    Cet utilitaire populaire est un complément Excel qui recherche dans un classeur une chaîne spécifiée (représentant généralement un lien vers un autre classeur) et vous indique où il se trouve dans le classeur, en remplaçant éventuellement les formules incluant la chaîne par leurs valeurs actuelles.Il peut donc être utilisé pour découvrir pourquoi vous recevez un message aussi inattendu lors de l’ouverture du classeur
    .
    et, en remplaçant les formules contenant les liens par leurs valeurs, le message ne pourra plus apparaître ultérieurement.
    La version actuelle est pour Excel 2007 ou version ultérieure. Pour Excel 2003 ou une version antérieure, cliquez ici.Installation


    • La version actuelle est 11.1 Téléchargez-la ici
    • Extrayez FindLink.xlam du fichier zip dans un dossier de votre ordinateur
    • Vérifiez que Windows ne l'a pas marqué en tant que fichier bloqué. À l'aide de l'Explorateur Windows, dans le dossier où vous avez extrait Findink.xlam, cliquez avec le bouton droit de la souris sur Findlink.xlam> Propriétés> Général, puis cliquez sur le bouton Débloquer s'il est présent.
    • Vous pouvez choisir d'installer FindLink en tant que complément afin qu'il soit disponible chaque fois que vous exécutez Excel ou de simplement l'ouvrir lorsque vous souhaitez l'utiliser.
    • Pour installer en tant que complément dans Excel 2007
      • Bouton Office> Options Excel> Compléments> Gérer: Compléments Excel> Aller> Parcourir où vous avez enregistré FindLink.xlam, sélectionnez FindLink.xlam et cliquez sur OK.

    • Pour installer en tant que complément dans Excel 2010 ou une version ultérieure
      • Fichier> Options> Compléments> Gérer: Compléments Excel> Aller> Parcourir où vous avez enregistré FindLink.xlam, sélectionnez FindLink.xlam et cliquez sur OK.

    • Pour l'exécuter une fois sans l'installer en tant que complément:
      • Dans Excel 2007: Bouton Office> Ouvrir> FindLink.xlam
      • Dans d'autres versions, Fichier> Ouvrir> FindLink.xlam
      • Si vous êtes averti de la présence de macros dans le fichier, activez le contenu.
      • Si vous avez la possibilité de faire confiance à l'éditeur (Bill Manville Associates), faites-le.


    Utilisation


    • FindLink ajoute un élément de menu "Rechercher des liens" au ruban des compléments
      • Si le ruban des compléments n'apparaît pas, dans Excel 2010 ou version ultérieure, Fichier> Options> Personnaliser le ruban. dans la zone de liste de droite, assurez-vous que le ruban des compléments est activé
      • Si le ruban des compléments est toujours absent ou ne contient pas l'élément de menu Rechercher des liens, vérifiez que FindLink.xlam n'est pas marqué comme bloqué (voir ci-dessus), puis redémarrez Excel.

    • Cliquez sur l'élément de menu Rechercher des liens, et FindLink affiche une boîte de dialogue:

    • Il est généralement demandé à FindLink de rechercher un nom de fichier particulier vers lequel figurent des liens dans le classeur, ou ".xl" pour rechercher des liens vers des fichiers Excel.
    • Il recherche dans le classeur actif les formules qui incluent une chaîne spécifiée par l'utilisateur. Il recherche des noms définis, des formules de cellules et également des objets pouvant être liés à des données dans des cellules (par exemple, séries de graphiques, étiquettes de données, zones de texte, listes de validation de données, formules de formatage conditionnel).
    • Il existe des options pour créer une liste dans une feuille de travail indiquant partout où la chaîne spécifiée a été trouvée et / ou pour supprimer toutes les occurrences de la chaîne (par exemple en remplaçant des formules par des valeurs) ou pour donner un message pour chaque occurrence, permettant à l'utilisateur de: décider d'une action:

    • Remarque: Si vous recherchez des liens vers un complément installé, ils ne seront pas trouvés, à moins que vous ne désinstalliez le complément ou que vous ne lanciez Excel en mode sans échec (maintenez la touche Ctrl enfoncée pendant le démarrage d'Excel) pour empêcher l'ajout de l'info-infrom. chargement. Si vous utilisez le mode sans échec, vous devrez alors ouvrir FINDLINK explicitement.

    Quoi de neuf


    • La version 11.1 corrige un problème où la seule instance du lien recherché dans une feuille de calcul se trouvait dans une cellule fusionnée
    • La version 11.0 corrige un lien brisé sur le bouton Aide (!)
    • La version 10.9 apporte quelques améliorations mineures à l'interface utilisateur
    • La version 10.8 détecte certains liens précédemment manqués dans la mise en forme conditionnelle et gère plus efficacement les grands blocs de formules.
    • La version 10.2 fonctionne lorsque les noms de fichier contiennent 'et aussi lorsque des tableaux croisés dynamiques sont connectés à des sources de données externes telles que PowerQuery
    • La version 10.0 améliore la recherche de formules de mise en forme conditionnelle pour inclure ColorScales, DataBars et IconSets
    • La version 9.9a a une adresse électronique mise à jour pour le support et le signalement des erreurs
    • La version 9.9 trouve des liens dans des formules de mise en forme conditionnelle supplémentaires (Excel 2007 et versions ultérieures)
    • La version 9.7 fonctionne mieux sur les versions Mac d'Excel
    • La version 9.6 trouve les liens dans les cellules masquées par filtrage
    • La version 9.5 gère mieux les titres d'axes dans Excel 2010

    Lacunes connues

    En raison de limitations dans le modèle d'objet VBA, les liens ne seront pas trouvés dans:
    • Titres des axes secondaires dans les graphiques
    • Sources des barres d'erreur personnalisées dans les graphiques
    • Lignes cachées par filtrage avancé
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci pour le FindLink mais ce n'est pas ce que je recherche car il faut aller dans complément et l’exécuter!

    Pour faire simple, j'ai un fichier A qui comporte une liaison d'un fichier B.
    Je suis à la recherche d'une solution pour copier le fichier A vers un autre dossier et à la fois de supprimer les liaisons vers le fichier B tout en gardant les valeurs.

    Exemple:
    - La colonne A1 du fichier "A" est = colonne "B1" du fichier B
    - Lancement du script qui copie le fichier A dans un dossier tout en le renommant en fichier C
    Le problème c'est que lors du copier coller, le fichier C garde les liaisons avec le fichier B et je voudrai qu'il prenne les valeurs fixe et non plus les liaisons.

    En résumé:
    - Jour 1, la colonne A1 aura la valeur de 1
    - Jour 2, la colonne A1 aura la valeur de 9999
    etc...
    Le but est de générer le fichier C tous les jours avec les bonnes valeurs sans liaisons afin qu'il ne se rafraîchisse pas

  8. #8
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Pour ne copier que les valeurs et pas les formules(provenant ou non d'une liaison à un autre fichier, essaie de remplacer la ligne 28 du code du post #2 par : WBook2.Sheets(1).Cells(Cnt, Y).Value = WBook1.Sheets(1).Cells(Cnt, Y).Value, en mettant Value à la place de Formula.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Aucun changement.
    Ce qui est bizarre c'est que je viens d'activer dans le script la recopie de la mise en forme des cellules et il quadrille que quelques colonnes.
    Il semblerait que le script ne prend pas toute la feuille! Si je change la liaison en A1, il ne quadrille plus aucune cellule.

    Nom : A1.png
Affichages : 476
Taille : 4,8 Ko

    Si je met la liaison en A1, le script fonctionne, sauf que confirmation, il ne scrute pas toute la feuille

    Après avoir creusé, le script s'arrête à la première cellule vide, du coup si je met un texte vide au plus loin, cela semble fonctionner :-)

    Encore un petit message :-)
    Après des essais, du coup le script est super long et ne me copie pas les liaisons de la seconde feuille

  10. #10
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Pour voir si le nombre de lignes et de colonnes est correctement rapporté, place ceci MsgBox "Colonnes : " & ColsCount & " Lignes : " & RowsCount juste avant la boucle Do While.

    Au fait, est-ce que le classeur ne contient pas d'autres feuilles ?
    Car si c'est le cas, il faut également les traiter.

    Pour trouver les liaisons externes, ajoute après la ligne (de copie) n° 28 ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If InStr(1, WBook1.Sheets(1).Cells(Cnt, Y).Formula, "='") > 0 Then
       MsgBox "Liaison externe trouvée dans la cellule(" & Cstr(Cnt) & " , " & Cstr(Y) & ")" & _
            vbNewLine & "Formule : " & WBook1.Sheets(1).Cells(Cnt, Y).Formula
    End If
    Chez moi, le script fonctionne comme il se doit.

    Est-ce que le classeur(ou la feuille) contient une ou des listes ?
    Pour le savoir, ajoute juste au début avant la boucle Do While la ligne suivante : MsgBox "Nombre de listes : " & WBook1.Sheets(1).ListObjects.Count
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ne fonctionne toujours pas!
    Je viens de créer 2 fichier banal et juste pour quelques cellules le script est lent et ne copie le second onglet.
    Ci-joint l'exemplebil.7z

  12. #12
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Une autre solution je suppose

    On commence par copier le fichier .xlsx vers la destination puis on le traite.
    Il y a deux façon de rompre les liens entre le classeur en cours et les autres fichiers :

    1. On ouvre le classeur et on le lit cellule par cellule. Si une cellule contient une formule on remplace celle-ci par sa valeur.
    2. On utilise la méthode BreakLinks du classeur. Mais le problème avec cette méthode est qu'elle ne peut pas traiter les liaisons du type #REF

    J'opterais donc pour la première, certes plus longue si le fichier est volumineux, mais (je suppose qu'elle est) plus efficace.
    On peut les utiliser conjointement sans problème(mais inutile) sauf que dans ce cas, les liens remplacés par l'une ne sont pas rapportés par l'autre méthode.
    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
    Option Explicit     
      Dim appExcel, WBook, fso                        ' Déclaration des objets
      Dim iRow, Y, Cnt, RowsCount, ColsCount, N       ' Déclaration des entiers
      Dim S, sFileName, strLinks                      ' Déclaration des chaines de caractères
     
      Set fso = CreateObject("Scripting.FileSystemObject")
      ' Chemins des fichiers à adapter dans la ligne suivante :
      fso.CopyFile ".\B1.xlsx", ".\Destination\Essai1.xlsx", True
      N = 0
      Set appExcel = CreateObject("Excel.Application")
      appExcel.Visible = True
      appExcel.DisplayAlerts = False
      sFileName = fso.GetFile(".\Destination\Essai1.xlsx").Path
     
      Set WBook = appExcel.Workbooks.Open(sFileName, , False) ' Ouvre le fichier Excel copié en Lecture/Ecriture
      '################# Si utilisation de la méthode BreakAllLinks ###################
         BreakAllLinks
         WScript.Echo "Nombre de liaisons externes trouvées : " & CStr(n) & vbNewLine & vbNewLine & strLinks
      '---------------------------------------------------------------
      '################# Si utilisation de la méthode ProcessFile ################### 
      Call ProcessFile()
      WScript.Echo "Nombre de liaisons externes trouvées : " & CStr(n) & vbNewLine & vbNewLine & S
      '---------------------------------------------------------------
      Wscript.Sleep 7000 
      appExcel.Quit 
      Set appExcel = Nothing 
    '======================================
    Sub ProcessFile()
        ' J'introduis les variables T1 et T2 pour mesurer la durée de traitement
        Dim Valeur, Formule, T1, T2
        T1 =Time
        Cnt = 0 : iRow = 1 :  S = ""
     
        RowsCount = WBook.ActiveSheet.UsedRange.Rows.Count           ' Nombre de lignes dans le fichier excel copié
        ColsCount = WBook.ActiveSheet.UsedRange.Columns.Count        ' Nombre de colonnes dans le fichier excel copié
        Do While iRow < RowsCount + 1
            Cnt = Cnt + 1 
            For Y = 1 To ColsCount
                 If InStr(1, WBook.Sheets(1).Cells(Cnt, Y).Formula, "='") > 0 Or _
                    InStr(1, WBook.Sheets(1).Cells(Cnt, Y).Formula, "#REF") > 0 Then
                    N = N + 1
                    S = S & "Cellule(" & Cstr(Cnt) & " , " & Cstr(Y) & ")" & _
                     "   Formule : " & WBook.Sheets(1).Cells(Cnt, Y).Formula & vbNewLine & vbNewLine
                    Valeur = WBook.Sheets(1).Cells(Cnt, Y).Value
                    WBook.Sheets(1).Cells(Cnt, Y).Value = Valeur
                 End If
            Next
            iRow = iRow + 1
        Loop
        WBook.Save
        T2 =Time
        MsgBox DateDiff("s", T1, T2) & "  seconde(s)" 
    End Sub
    '====================================
    Sub BreakAllLinks()
        Dim astrLinks, I, T1, T2
        ' Constante pour le type de liaisons :
        Const xlLinkTypeExcelLinks = 1, xlLinkTypeOLELinks = 2
     
        T1 =Time
        astrLinks = WBook.LinkSources(xlLinkTypeExcelLinks)
        ' Supprime les liens dans le classeur en cours s'ils ne sont pas du type #REF(que j'appellerais lien brisé)
        If Not IsEmpty(astrLinks) Then
           For I = 1 To UBound(astrLinks)
              strLinks = strLinks & "Link " & I & " : "   & astrLinks(I) & vbNewLine
              N = N + 1 ' Nombre de liens
              WBook.BreakLink astrLinks(I), xlLinkTypeExcelLinks ' convertit le lien en sa valeur
          Next
        End If
        T2 =Time
        MsgBox DateDiff("s", T1, T2) & "  seconde(s)" 
    End Sub
    Si après toutes ces tentatives, le problème persiste, je déplacerai alors la discussion vers un forum plus approprié.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Salut, je viens de faire un essai sur mon gros fichier et fonctionne :-)
    J'ai juste supprimer les Box de message afin que tout s’exécute sans avoir besoin de cliquer!
    Je ferai des essais en réel cette semaine, merci beaucoup de ton aide

  14. #14
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 415
    Points : 5 806
    Points
    5 806
    Par défaut
    Citation Envoyé par lamjer65 Voir le message
    J'ai juste supprimer les Box de message afin que tout s’exécute sans avoir besoin de cliquer!
    Tout à fait!
    D'ailleurs dans la procédure ProcessFile, j'ai mis le commentaire : "J'introduis les variables T1 et T2 pour mesurer la durée de traitement".
    C'était juste pour la comparaison des durées de traitement et pas comme partie intégrante du script.
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Octobre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Suite aux essais de ce jour, le script fonctionne! Parfait et assez rapide :-) merci beaucoup pour ton aide précieuse!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PPT-2010] Changer la source de données de toutes les liaisons Excel/Powerpoint
    Par Ange HALA dans le forum Powerpoint
    Réponses: 1
    Dernier message: 15/10/2018, 13h24
  2. Désactiver les liens entre les classeurs Excel sans alerte
    Par flevielle dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/09/2007, 15h18
  3. [VBA-E] désactiver les liaisons
    Par repié dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/05/2006, 11h06
  4. Ouvrir excel en désactivant les macro
    Par tiopan dans le forum Access
    Réponses: 2
    Dernier message: 24/11/2005, 17h13
  5. [EXCEL] copier une feuille sans changer les liaisons
    Par DidRocks dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/09/2005, 13h29

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