Macro VBA

joquetino

XLDnaute Junior
Bonsoir,

J'aimerais vous poser une question, vous expert du Excel.
J'ai un gros fichier qui est lié à un autre fichier, et cette liaison m'empêche de partager.

La solution à laquelle je viens de penser, serait de copier ce gros fichier dans un autre, en ne copiant que les valeurs : de cette façon, je n'aurais plus ce problème de liaison.

Seulement, c'est assez fastidieux à faire, vu la taille du fichier. Une macro VBA pourrait-elle être envisageable dans ce cas précis?

Merci d'avance.
 

pedro123456

XLDnaute Junior
Re : Macro VBA

Je ne suis pas le plus grand des experts, cependant, peut tu envoyer les fichiers?
( vu que ton fichier est gros tu ne pourras pas l'uploader dans ce cas fait un petit exemple du meme style, apres il suffira d'elargir la macro)

et donne plus de precision sur les valeurs que tu veux copier, ou sont elles, format, y a t'il plusieurs pages etc comment tu veux faire la copie etc, car ce sont des parametres qu'il va falloir integrer dans la macro.

Avec toute ces donnees on pourra certainement mieux t'aider!
 

joquetino

XLDnaute Junior
Re : Macro VBA

Bonsoir et merci pour ta réponse,

alors le fichier sur lequel je travaille, en plus d'être volumineux, contient quelques données confidentielles. Je ne peux donc pas l'uploader pour illustrer mon problème. J'ai crée deux fichiers pour essayer de montrer ce que je souhaiterais faire.

Dans le fichier classeur1.xls, j'ai 5 onglets dont chacun comporte un type d'informations. J'ai mis sur chaque onglet un tableau très simple, qui a un format particulier (motif notamment).

Ce que j'aimerais, c'est que l'utilisateur puisse déclencher une macro VBA à partir de ce classeur1.xls. Cette macro aura pour objectif de copier (valeurs + format) les données du classeur1.xls dans le classeur2.xls, en ayant vider ce dernier au préalable (dans mon exemple, il est vide pour le moment). Le format ainsi que les valeurs devront être copiées. Les données présentes sont soit des entiers, soit des chaines de caractère.

Suis-je explicite? N'hésitez pas dans le cas contraire.
SI qq pouvait m'aiguiller sur la façon de procéder ...

Merci d'avance.
 

Pièces jointes

  • Classeur1.xls
    17.5 KB · Affichages: 58
  • Classeur1.xls
    17.5 KB · Affichages: 57
  • Classeur1.xls
    17.5 KB · Affichages: 57
  • Classeur2.xls
    13.5 KB · Affichages: 51
  • Classeur2.xls
    13.5 KB · Affichages: 56
  • Classeur2.xls
    13.5 KB · Affichages: 52

joquetino

XLDnaute Junior
Re : Macro VBA

Bonjour,

J'aurais une petite question par rapport au code que tu m'as gentillement mis à disposition.
Voici le code :
PHP:
Private Sub cmdCopieValeurs_Click()
    Dim wshFeuille  As Worksheet
    Dim wbkBook     As Workbook
    
    ' copier toutes les feuilles dans un nouvel onglet
    Sheets.Copy
    
    ' identifier le nouveau clmasseur
    Set wbkBook = ActiveWorkbook
    
    ' détruire le bouton
    ActiveSheet.Shapes(1).Delete
    
    For Each wshFeuille In wbkBook.Sheets
        ' activer la feuille
        wshFeuille.Select
        ' copier toutes les cellules
        wshFeuille.Cells.Copy
        ' coller en valeur
        wshFeuille.Cells.PasteSpecial xlPasteValues
        ' curseur en A1
        wshFeuille.Range("A1").Select
    Next
    
    ' quitter le mode copie
    Application.CutCopyMode = False
    
    ' libérer la mémoire des variables objet
    Set wbkBook = Nothing: Set wshFeuille = Nothing
End Sub

J'aimerais que la macro ne copie pas les feuilles cachées. Pour le moment, si j'exécute la macro en cachant une feuille, il y a une erreur : est-ce normal? Et comment faire pour contourner l'erreur?

Merci d'avance.
 

Kobaya

XLDnaute Occasionnel
Re : Macro VBA

salut joquetino,

oui, effectivement, si la feuille est cachée, ça plante.
donc en modifiant un peu, ça donne ceci (modifs en bleu) :
Code:
Private Sub cmdCopieValeurs_Click()
    Dim wshFeuille  As Worksheet
    Dim wbkBook     As Workbook
    
    ' copier toutes les feuilles dans un nouvel onglet
    Sheets.Copy
    
    ' identifier le nouveau clmasseur
    Set wbkBook = ActiveWorkbook
    
    ' détruire le bouton
    ActiveSheet.Shapes(1).Delete
    
    For Each wshFeuille In wbkBook.Sheets
[COLOR=Blue]        If wshFeuille.Visible = xlSheetVisible Then[/COLOR]
            ' activer la feuille
            wshFeuille.Select
            ' copier toutes les cellules
            wshFeuille.Cells.Copy
            ' coller en valeur
            wshFeuille.Cells.PasteSpecial xlPasteValues
            ' curseur en A1
            wshFeuille.Range("A1").Select
[COLOR=Blue]        End If[/COLOR]
    Next
    
    ' quitter le mode copie
    Application.CutCopyMode = False
    
    ' libérer la mémoire des variables objet
    Set wbkBook = Nothing: Set wshFeuille = Nothing
End Sub
 

joquetino

XLDnaute Junior
Re : Macro VBA

Merci Kobaya. Une dernière petite question, et c'est promis je ne t'embête plus : si je souhaite qu'il me copie uniquement les 5 premières feuilles (donc si le classeur a 8 feuilles, seules les 5 premières seront copiées), quelles modifs dois-je apporter au code?

Va falloir que je me plonge dans un bon bouquin pour apprendre le VBA : au passage, tu me conseilles lesquels?

Un grand merci.
 

ODVJ

XLDnaute Impliqué
Re : Macro VBA

Bonsoir à tous,

j'arrive un peu tard sur le sujet, mais une simple rupture de la ou des liaisons ne sufirait-elle pas?
si nécessaire, ça peut aussi s'automatiser avec un code du genre :
Code:
    liaisons = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)
    For i = 1 To UBound(liaisons)
        ActiveWorkbook.BreakLink _
            Name:=liaisons(i), _
            Type:=xlLinkTypeExcelLinks
    Next

A+
 

Kobaya

XLDnaute Occasionnel
Re : Macro VBA

Salut ODVJ,

Je n'avais pas pensé à ça ! J'essaierai de m'en souvenir :).

Pour le nombre limité de feuilles à copier :
Code:
Private Sub cmdCopieValeurs_Click()
    Dim wshFeuille  As Worksheet
    Dim wbkBook     As Workbook
    
    ' copier toutes les feuilles dans un nouvel onglet
    Sheets.Copy
    
    ' identifier le nouveau clmasseur
    Set wbkBook = ActiveWorkbook
    
    ' détruire le bouton
    ActiveSheet.Shapes(1).Delete
    
    For Each wshFeuille In wbkBook.Sheets
        If wshFeuille.Visible = xlSheetVisible Then
            ' activer la feuille
            wshFeuille.Select
            ' copier toutes les cellules
            wshFeuille.Cells.Copy
            ' coller en valeur
            wshFeuille.Cells.PasteSpecial xlPasteValues
            ' curseur en A1
            wshFeuille.Range("A1").Select
        End If
    Next
    
    ' empêche l'affichage du message de confirmation d'effacement
    Application.DisplayAlerts = False
    
    ' supprimer les onglets au-delà du 5e
    Do Until wbkBook.Sheets.Count = 5
        wbkBook.Sheets(wbkBook.Sheets.Count).Delete
    Loop
    
    Application.DisplayAlerts = True
    ' quitter le mode copie
    Application.CutCopyMode = False
    
    ' libérer la mémoire des variables objet
    Set wbkBook = Nothing: Set wshFeuille = Nothing
End Sub
Pour le bouquin, je dirais "VBA pour Excel 2003", de John WALKENBACH, éditions Eyrolles. Un gros pavé de +40€ très complet mais très accessible (enfin, je pense ; je n'ai fait que le feuilleter, mais je pense que je vais craquer un jour...)
 

joquetino

XLDnaute Junior
Re : Macro VBA

Bonsoir,

Je me permets de vous reposer une question à propos du code VBA que vous m'avez proposé, qui m'est très utile.
J'aimerais adapter le code suivant :
Code:
Private Sub cmdCopieValeurs_Click()
    Dim wshFeuille  As Worksheet
    Dim wbkBook     As Workbook
    
    ' copier toutes les feuilles dans un nouvel onglet
    Sheets.Copy
    
    ' identifier le nouveau clmasseur
    Set wbkBook = ActiveWorkbook
    
    ' détruire le bouton
    ActiveSheet.Shapes(1).Delete
    
    For Each wshFeuille In wbkBook.Sheets
        If wshFeuille.Visible = xlSheetVisible Then
            ' activer la feuille
            wshFeuille.Select
            ' copier toutes les cellules
            wshFeuille.Cells.Copy
            ' coller en valeur
            wshFeuille.Cells.PasteSpecial xlPasteValues
            ' curseur en A1
            wshFeuille.Range("A1").Select
        End If
    Next
    
    ' empêche l'affichage du message de confirmation d'effacement
    Application.DisplayAlerts = False
    
    ' supprimer les onglets au-delà du 5e
    Do Until wbkBook.Sheets.Count = 5
        wbkBook.Sheets(wbkBook.Sheets.Count).Delete
    Loop
    
    Application.DisplayAlerts = True
    ' quitter le mode copie
    Application.CutCopyMode = False
    
    ' libérer la mémoire des variables objet
    Set wbkBook = Nothing: Set wshFeuille = Nothing
End Sub

J'aimerai, que la macro copie les onglets du classeur courant, dans un fichier existant, fichierTest.xls, et non dans un nouveau fichier : il faudrait donc effacer les données des onglets du fichier "fichierTest.xls" dans un premier temps, puis copier les données.
Si vous pouviez me donner des pistes pour résoudre mon pb, ça serait super sympa.

Un grand merci d'avance.
 

Discussions similaires

Réponses
26
Affichages
530
Réponses
12
Affichages
426

Statistiques des forums

Discussions
312 595
Messages
2 090 093
Membres
104 374
dernier inscrit
cheick.coulibaly@dcsmali.