Problème macro sélection données/copie ou caché des lignes

pour copier plusieurs cellules contigües, par exemple D5:G20 :

[D5:G20].Copy fait la copie dans le presse-papiers de Windows ; ensuite, pour coller la destination, indique seulement la cellule du coin supérieur gauche ; 2 exemples pour un copier / coller en K8 :

[D5:G20].Copy [K8] : copie des données et des formats de cellule ; pour copier seulement les données :

[D5:G20].Copy puis : [K8].PasteSpecial xlPasteValues ou [K8].PasteSpecial -4163

dhany

Du coup là comme j'utilise un indicateur i pour faire changer de ligne à chaque fois et copier ce qui m'intéresse, je fais : [Ai:AJi].Copy[K8] ou ["A"&i:"AJ"&i] ?

i n'est pas un indicateur mais un indice !

* utilise : Range("A" & i & ":AJ" & i) si c'est bien des cellules de la même ligne i

* si c'est des cellules de la ligne i à la ligne j : Range("A" & i & ":AJ" & j)

dhany

i n'est pas un indicateur mais un indice !

* utilise : Range("A" & i & ":AJ" & i) si c'est bien des cellules de la même ligne i

* si c'est des cellules de la ligne i à la ligne j : Range("A" & i & ":AJ" & j)

dhany

Oui pardon un indice, tellement l'habitude de parler d'indicateur XD

pourquoi ? t'es dans la police ?

dhany

je blague, hein ? ça m'dérange pas du tout si t'es policier et qu't'as des indicateurs partout !

(bon, j'avoue : j'vois trop d'films policiers ! )

dhany

pourquoi ? t'es dans la police ?

dhany

Non en industrie, et on doit mettre plein d'indicateur partout (performance etc)

Merci c'est bon ça fonctionne nickel

Sub pdp() Dim i As Integer, dl As Integer, dl2 As Integer dl = Sheets("Page de garde ").Cells(Rows.Count, "A").End(xlUp).Row dl2 = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1 With Sheets("Page de garde ") If dl > 107 Then dl = 107 For i = 58 To dl If .Range("A" & i) <> "" And .Range("AK" & i) = "X" Then Worksheets("Page de garde ").Range("A" & i & ":AJ" & i).Copy _ Destination:=Worksheets("Feuil1").Range("A" & dl2): dl2 = dl2 + 1 If .Range("AK" & i) <> "X" Then .Rows(i).Hidden = True Next i End With End Sub

Voici le code. Par contre la mise en page de la copie ne se fait pas correctement, c'est possible que ça garde parfaitement la mise en page original sans devoir à chaque fois remettre en page soit même car le but de base est d'automatisé si je dois refaire ma mise en page à chaque fois ça sert à rien ^^

Bonsoir Minato,

pour mettre du code VBA dans ton post, tu peux utiliser la balise « Inline » (comme tu l'as déjà fait) quand ça dépasse pas une ligne de texte ; mais sinon, en particulier pour un code VBA complet, utilise cette balise « code » : ; ça s'présente alors comme suit :

Sub pdp()
  Dim dl2 As Long, dl As Long, i As Long
  dl2 = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1
  With Worksheets("Page de garde")
    dl = .Cells(Rows.Count, "A").End(xlUp).Row: If dl > 107 Then dl = 107
    For i = 58 To dl
      If .Range("A" & i) <> "" And .Range("AK" & i) = "X" Then
        .Range("A" & i & ":AJ" & i).Copy Worksheets("Feuil1").Range("A" & dl2)
        dl2 = dl2 + 1
      End If
    Next i
  End With
End Sub

j'ai indenté le code VBA ; attention aux types : pour les 3 variables de numéros de ligne, utilise Long au lieu d'Integer

j'ai aussi réécrit ton code VBA en l'optimisant ; note que Worksheets("Page de garde") apparaît une seule fois !

alors ne remets pas la ligne dl = avant la ligne dl2 =, donc ne la remets pas avant le With !

Worksheets("Feuil1") apparaît une fois pour le calcul de dl2, et une autre fois pour la destination du collage ; comme cette destination est en tant que 1er argument du .Copy, c'est donc un collage des cellules entières, donc y compris leur format ; pourtant, tu as écrit : « Par contre la mise en page de la copie ne se fait pas correctement »


de quoi s'agit-il exactement ? la hauteur des lignes ? la largeur des colonnes ? autre ? donne la liste complète de tout c'qui manque ! mais normalement, du fait qu'ça copie tous les formats de cellule, ça fait qu'ça copie déjà tout ceci :

* le « format de nombre » : Standard, Nombre, Date, Heure, Texte, ou autre (et même un format personnalisé)

* l'« alignement horizontal » : standard, gauche, centré, droite... ; l'« alignement vertical » : bas, centré, haut...

* la « police de caractères » : nom, taille, gras, italique, souligné, barré, exposant, indice, couleur

* les « bordures » : tous les traits (y compris si tu as utilisé des diagonales)

* le « remplissage » : couleur d'arrière-plan (+ motif et texture éventuels)

* la « protection » : cellule verrouillée / masquée


c'est déjà beaucoup, mais bien sûr, ça concerne uniquement les cellules copiées / collées ; pour tout le reste, tu dois envisager l'utilisation d'une feuille modèle .xltx (sans macros) ; tu auras donc ton classeur .xlsm (avec macros), dans lequel tu ajouteras une feuille modèle .xltx personnalisée ; cela chaque fois que tu auras besoin d'une nouvelle feuille modèle.

regarde l'aide Excel sur la création d'un modèle.

dhany

C'est la hauteur et la largeur des cellules qui ne correspondent pas, par contre la fusion de cellule le contenu etc est respecté

@Minato

alors essaye ceci :

Sub pdp()
  Dim dl2&, dl&, i&: Application.ScreenUpdating = 0
  dl2 = Worksheets("Feuil1").Cells(Rows.Count, "A").End(3)(2).Row
  With Worksheets("Page de garde")
    For i = 1 To 36
      Worksheets("Feuil1").Columns(i).ColumnWidth = .Columns(i).ColumnWidth
    Next i
    dl = .Cells(Rows.Count, "A").End(xlUp).Row: If dl > 107 Then dl = 107
    For i = 58 To dl
      If .Range("A" & i) <> "" And .Range("AK" & i) = "X" Then
        .Range("A" & i & ":AJ" & i).Copy Worksheets("Feuil1").Range("A" & dl2)
        dl2 = dl2 + 1
      End If
      Worksheets("Feuil1").Rows(i).RowHeight = .Rows(i).RowHeight
    Next i
  End With
End Sub

dhany

Il y a un mieux mais ce n'est pas encore ça au niveau de la hauteur de cellule. Sinon pour que ça fasse propre est ce que je peux programmer pour que la hauteur de cellule s'adapte au contenu?

* pour la largeur d'une colonne par rapport au contenu, regarde : Worksheets("Feuil1").Columns(i).AutoFit

* pour la hauteur d'une ligne par rapport au contenu, regarde : Worksheets("Feuil1").Rows(i).AutoFit

dhany

La hauteur ne se régule pas par rapport au contenu avec cette formule. Il ne manque plus que ça fasse propre

ben là, désolé : j'ai plus rien d'autre à proposer !

dhany

en tout cas merci beaucoup pour l'aide ^^

de rien, c'était avec plaisir !

dhany

Et sinon je règle avant la hauteur même si c'est plus grand que ce qu'il faut pour certaine cellule mais ça sera déjà mieux, si c'est possible? ^^

alors peut-être comme ceci :

Sub pdp()
  Dim dl2&, dl&, i&: Application.ScreenUpdating = 0
  dl2 = Worksheets("Feuil1").Cells(Rows.Count, "A").End(3)(2).Row
  With Worksheets("Page de garde")
    For i = 1 To 36
      Worksheets("Feuil1").Columns(i).ColumnWidth = .Columns(i).ColumnWidth
    Next i
    dl = .Cells(Rows.Count, "A").End(xlUp).Row: If dl > 107 Then dl = 107
    Worksheets("Feuil1").Rows("58:" & dl).RowHeight = 50 'hauteur 50 : à adapter
    For i = 58 To dl
      If .Range("A" & i) <> "" And .Range("AK" & i) = "X" Then
        .Range("A" & i & ":AJ" & i).Copy Worksheets("Feuil1").Range("A" & dl2)
        dl2 = dl2 + 1
      End If
    Next i
  End With
End Sub

dhany

ajout : note que cette fois, on fixe la hauteur de toutes les lignes en même temps, cela en dehors de la boucle For i

dhany

Rechercher des sujets similaires à "probleme macro selection donnees copie cache lignes"