Optimisation macro excel et copie automatisé

chafoo

Nouveau membre
Bonjour tout le monde,

Je suis nouveau sur le Forum, après l'avoir parcouru plusieurs fois pour obtenir des solutions à mes problèmes, je suis contraint de vous demander de l'aide :)!

J'ai deux bases de données une qui s'appelle "Base_art EMC-IMC.xlsx" ou je vais chercher mes données et l'autre où j'importe mes données qui s'appelle "Pilotage Quotidien CHAFIK.xlsm" j'ai réussi tant bien que mal à réaliser ce que je voulais grâce à l'enregistreur de macro mais je pense qu'il y a possibilité de l'optimiser grâce à des variables ou autres que je ne maitrise pas du tout!

Tout d'abord, je filtre ma base "Base_art EMC-IMC.xlsx" grâce à un code gestion en dur vu que je n'arrive pas à le faire avec un filtre avancée puis j'importe les données de ce code gestionnaire dans ma base de données "Pilotage Quotidien CHAFIK.xlsm" feuille ("J+5") le premier inconvénient c'est qu'à chaque fois qu'il importe les données de la base de données "Base_art EMC-IMC.xlsx" il me demande si je veux enregistrer avant qu'il se ferme! Puis j'ai réalisé une mise en forme sur la première ligne "A6" que je copie sur le reste des lignes importer mais ce n'est pas dynamique ça prend pas en compte juste les lignes que j'ai importées (Ex: jusqu'à la dernière ligne remplis sur mon tableau ) si 65536 est-ce que j'ai indiqué dans ma macro il ira jusqu'a la! Dernier points, ce qui me fait peur si je n'utilise pas de variable c'est que mon programme utilise le presse papier continuellement chose que je ne veux pas au vu nombre de ligne qui peuvent augmenter et vu que j'ai encore d'autre ligne à remplir.

Sur la feuille "PARAMETRE le bouton (MAJ Quot) permet d'activer la macro

Modérator dixit : pas de fichier plein de macros à télécharger !

http://www.xxxxxxxxxxxxxxxxxx


[strike]Vous trouverez mes deux fichiers ci-joints[/strike]

En espérant que vous pourrez m'aider, si la compréhension et compliquer je peux essayer de la reformuler
Merci d'avance
 

zeb

Modérateur
Salut,

Pas de fichier potentiellement dangereux en téléchargement !

SI tu veux, tu peux nous proposer le code de tes macros directement dans le forum. Pour ça, utilise la balise [code=vb]...[/code]
 

chafoo

Nouveau membre
Bonsoir Zeb,

Désolé je ne savais pas! Je vous propose mon code directement ci dessous et peut etre pourrez vous m'aidez j'ai déjà réussi à répondre à deux de mes questions
1. La fermeture de ma basse de donnée sans l'enregistrer avec la ligne de code suivante

Code:
Windows("Base_art EMC-IMC.xlsx").Activate
    ActiveWorkbook.Close SaveChanges:=False

2. et la mise en forme de mon tableau grâce a cette ligne de code y a peut être mieux mais j'arrive a ce que je voulais
c'est le principal
Code:
    Selection.Copy
    Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False

et voici tous le code de mon fichiers que j'ai essayé d'expliquer au fur et mesure pour que vous compreniez et moi savoir ou j'en suis :)! D'après ce que j'ai lu sur certains forum j'utilise le "Select" intempestivement et j'aimerais utiliser des variables pour déclarer mes cellules sources que je copie, je suis entrain de voir comment faire mais j'ai un peut de mal, car pour le moment ça me demande a chaque fois si je veux vider le presse papier ce qui n'est pas terrible donc si vous pouvez m'expliquer ou me donner un exemple et par la même occasion me dire s'il est possible de réalisé un filtre variable sur un classeur en fonction de critères sur un autre classeur

Voici mon code en espérant avoir des réponses!

Code:
  'Importation des données de la "Base_art EMC-IMC" vers "J+5"
'=========================================================================================================
'

Sub ImporterDonnees()

     Application.ScreenUpdating = False
 '------------------------------- Suppression des données presente sur la feuille J+5 & du filtre -----------------
        Sheets("J+5").Activate
        Rows("4:4").Select
    Selection.AutoFilter
    Rows("5:786448").Select
    Selection.Delete Shift:=xlUp
     
 '------------------------------- Connection à la base "Base_art EMC-IMC"  -----------------
 
         Application.WindowState = xlNormal
    Workbooks.Open Filename:=ThisWorkbook.Path & "\Base_art EMC-IMC"
    Rows("1:1").Select
    Range("X1").Activate

 '----Mise en place d'un filtre et exctraction des données en fonction du "Code gestionnaire"---------------
 
    Selection.AutoFilter
        ActiveSheet.Range("$A$1:$AL$11469").AutoFilter Field:=5, Criteria1:=Array( _
        "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "280", "289"), Operator _
        :=xlFilterValues
        
 '---- Copie & collage des données d'un classeur vers l'autre ---------------

    Range("B2:E65536,G2:H65536,AA2:AA65536").Select
    Selection.Copy
    
        Windows("Pilotage Quotidien CHAFIK.xlsm").Activate
        Sheets("J+5").Activate
    Range("A5").Select
    ActiveSheet.Paste
    
        Windows("Base_art EMC-IMC.xlsx").Activate
    Range("Z2:Z65536").Select
    Selection.Copy
    
        Windows("Pilotage Quotidien CHAFIK.xlsm").Activate
        Sheets("J+5").Activate
    Range("H5").Select
    ActiveSheet.Paste
    
        Windows("Base_art EMC-IMC.xlsx").Activate
    Range("L2:M65536").Select
    Selection.Copy
    
        Windows("Pilotage Quotidien CHAFIK.xlsm").Activate
        Sheets("J+5").Activate
    Range("I5").Select
    ActiveSheet.Paste
    
        Windows("Base_art EMC-IMC.xlsx").Activate
    Range("J2:K65536,AG2:AG65536,AI2:AI65536").Select
    Selection.Copy
    
        Windows("Pilotage Quotidien CHAFIK.xlsm").Activate
        Sheets("J+5").Activate
    Range("K5").Select
    ActiveSheet.Paste
    
  '------------------------------- Fermeture du classeur sans l'enregistrer "Base_art EMC-IMC"  -----------------
    
        Windows("Base_art EMC-IMC.xlsx").Activate
    ActiveWorkbook.Close SaveChanges:=False
                Application.DisplayAlerts = 1
                
    Application.ScreenUpdating = True
    
     '---- Mise en place d'un filtre sur les en-têtes des données copier ---------------
    
            Rows("4:4").Select
    Selection.AutoFilter
        
     '------------------------------- Mise en Forme des données copier -----------------------------------------------
        
        
        Range("A5:BV65536").Select
    With Selection.Font
        .Name = "Arial"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = 6
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    With Selection.Font
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
End With

     '------------------------------- Mise en Forme de la premiere ligne -----------------------------------------------

    Range("A5,E5,G5,R5,X5,AJ5,AN5,AZ5,BK5,BO5").Select
    Selection.Style = "Style 1"
    Range("B5:C5,H5:P5,S5:U5,Y5:AH5,AO5:AW5,BA5:BI5,BL5:BM5,BP5:BQ5").Select
    Selection.Style = "Style 4"
    Range("D5,F5,Q5,V5,AI5,AX5,BJ5,BN5,BR5").Select
    Selection.Style = "Style 5"
    Range("W5,AJ5,AK5,AL5,AM5,AY5,BS5,BT5,BU5,BV5").Select
    Selection.Style = "Style 6"
    
     '--------------- selection de la premiere ligne et copie de la mise en forme sur le tableau variable --------------
            Rows("5:5").Select
    Selection.Copy
    Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False

End Sub
 

chafoo

Nouveau membre
Si jamais je me suis trompé sur la mise en forme du code sur le forum dites le moi je supprimerai le message et je le referai

Merci d'avance à ce qui pourrons m'apporter des réponses!
 

chafoo

Nouveau membre
Bonsoir le Forum,

J'ai continuer à travailler sur mon fichier ce week-end j'ai trouvé des tuto qui explique comment marche les variables et les fonctions
j'ai donc réussi à l'optimiser un peut et surtout a moins utiliser le presse papier, mais je sais que je peut encore l'optimiser

Si vous pouvez me donner votre avis et vos conseil sa serai super cool!

Code:
   'Importation des données de la "Base_art EMC-IMC" vers "J+5"
'=========================================================================================================
Sub ImporterDonnees()

'Déclaration des compteurs et variables

    Dim classeur, WB_Principal As Workbook, feuil1, feuil2  As Worksheet
    Dim maPlage, maPlage1, maPlage2 As Range
    Dim DernLigne, DernLigne1, DernLigne2 As Long
   
    ' Amène le classeurs cible en avant plan, celui-ci devient le [ ActiveWorkbook ]
            Set WB_Principal = ActiveWorkbook
        Set feuil2 = WB_Principal.Worksheets("J+5")
        
' Neutraliser le rafraîchissement de l'écran
Application.ScreenUpdating = False

 '------------------------------- Suppression des données presente sur la feuille J+5 & du filtre -----------------
                Sheets("J+5").Activate
        Rows("4:4").Select
    Selection.AutoFilter
    Rows("5:786448").Select
    Selection.Delete Shift:=xlUp
     
 '------------------------------- Connection à la base "Base_art EMC-IMC"  -----------------
         Application.WindowState = xlNormal
         
' Ouverture du classeur
    Set classeur = Workbooks.Open("C:\Users\A172243\Desktop\Chafik\Base_art EMC-IMC.xlsx", _
    False, True)
    Set feuil1 = classeur.Worksheets("Base_art EMC-IMC")
    Rows("1:1").Range("X1").Activate

 '----Mise en place d'un filtre et exctraction des données en fonction du "Code gestionnaire"---------------
    
    Selection.AutoFilter
        ActiveSheet.Range("$A$1:$AL$11469").AutoFilter Field:=5, Criteria1:=Array( _
        "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "280", "289"), Operator _
        :=xlFilterValues
        
 '---- Copie & collage des données d'un classeur vers l'autre ---------------

        Range("B2:E65536,G2:H65536,AA2:AA65536").Copy Destination:=feuil2.Range("A5")
       
                   DernLigne1 = feuil1.Range("Z" & Rows.Count).End(xlUp).Row
        Set maPlage1 = feuil1.Range("Z2:Z" & DernLigne1)
                         maPlage1.Copy Destination:=feuil2.Range("H5")
        
                    DernLigne2 = feuil1.Range("L" & Rows.Count).End(xlUp).Row
        Set maPlage2 = feuil1.Range("L2:M" & DernLigne2)
                         maPlage2.Copy Destination:=feuil2.Range("I5")


        feuil1.Range("J2:K65536,AG2:AG65536,AI2:AI65536").Copy Destination:=feuil2.Range("K5")
        
    CutCopyMode = False
    
  '------------------------------- Fermeture du classeur sans l'enregistrer "Base_art EMC-IMC"  -----------------
    
        feuil1.Activate
    ActiveWorkbook.Close SaveChanges:=False

                Application.DisplayAlerts = 1
                
' Déneutraliser le rafraîchissement de l'écran
    Application.ScreenUpdating = True
    
     '---- Mise en place d'un filtre sur les en-têtes des données copier ---------------
    
            Rows("4:4").Select
    Selection.AutoFilter
        
     '------------------------------- Mise en Forme de la premiere ligne -----------------------------------------------

    Range("A5,E5,G5,R5,X5,AJ5,AN5,AZ5,BK5,BO5").Style = "Style 1"
    Range("B5:C5,H5:P5,S5:U5,Y5:AH5,AO5:AW5,BA5:BI5,BL5:BM5,BP5:BQ5").Style = "Style 4"
    Range("D5,F5,Q5,V5,AI5,AX5,BJ5,BN5,BR5").Style = "Style 5"
    Range("W5,AJ5,AK5,AL5,AM5,AY5,BS5,BT5,BU5,BV5").Style = "Style 6"
    
     '--------------- selection de la premiere ligne et copie de la mise en forme sur le tableau variable --------------
            Rows("5:5").Select
    Selection.Copy
    Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    
End Sub

Sinon j'ai plusieurs questions comment je peut faire pour déclarer une variable avec plusieurs colonne comme j'ai fait ci-dessus mais avec une seule colonne

Code:
 feuil1.Range("J2:K65536,AG2:AG65536,AI2:AI65536").Copy Destination:=feuil2.Range("K5")

J'ai vu aussi que je pouvez optimiser mon collage spéciale à la fin de mon code en passant de ça

Code:
Rows("5:5").Select
    Selection.Copy
    Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False

à ça, mais ça marche pas et je ne comprend pas vraiment pourquoi

Code:
Rows("5:5").Copy Destination:=feuil2.Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).PasteSpecial Paste:=xlPasteFormats

Dernière question pour faire mon filtre sur ma base de données ( Set feuil1 = classeur.Worksheets("Base_art EMC-IMC"))
je voudrais utiliser des lignes d'une colonne en l’occurrence ici ça serait ma variable "WB_Principal.feuil3("PARAMTRES").Range("L28:L39")
au lieu de mettre ça en dur

Code:
 ActiveSheet.Range("$A$1:$AL$11469").AutoFilter Field:=5, Criteria1:=Array( _
        "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "280", "289"), Operator _

Merci d'avance a vous tous qui pourrez m'apportez des éclaircissement à mes problèmes en attendant je continue a cherche vue comment je suis tellement content quand ça marche :)!!!
 

zeb

Modérateur
Salut,

Pense "objet".
Code:
' Pour commencer, ne fais pas de [b]Select[/b]. C'est mal.
Rows("5:5").Select
Selection.Copy
' bien
Rows(5).Copy

' pas de calcul compliqué. mal
Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)

' bien. Deux solutions
Cells(65536, 1).End(xlUp).Offset(0, 73)
Cells(65536, 1).End(xlUp)(1, 74)


Code:
Rows("5:5").Copy Destination:=feuil2.Range(Cells(5, 1), Cells(Cells(65536, 1).End(xlUp)(1).Row, 74)).PasteSpecial Paste:=xlPasteFormats
Que fabriques-tu ? Destination attend un "Range". Pas un "Range.PasteSpecial Paramètre".
Code:
Rows(5).Copy Cells(65536, 1).End(xlUp)(1, 74)

Sinon j'ai plusieurs questions comment je peut faire pour déclarer une variable avec plusieurs colonne comme j'ai fait ci-dessus mais avec une seule colonne
feuil1.Range("J2:K65536,AG2:AG65536,AI2:AI65536").Copy Destination:=feuil2.Range("K5")

Je n'ai pas bien compris. Peut-être que Union et Intersect sont des instructions qui peuvent t'intéresser.
Exemple :
Code:
Dim tout_sauf_L1 As Range
Set tout_sauf_L1 = Range(Rows(2), Rows(Rows.Count))

Dim colonnes_J_K_AG_AI As Range
Set colonnes_J_K_AG_AI = Union(Columns("J:K"), Columns(33), Columns("AI"))

Intersect(colonnes_J_K_AG_AI, tout_sauf_L1 As Range).Copy feuil2.Range("K5")
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 042
Membres
1 586 389
Dernier membre
ROCKET8
Partager cette page
Haut