J'ai ce code qui me permet de faire un export de données présentent dans ma FEUIL1 vers ma FEUIL3.
Toutefois, cela inclus toutes les mises en formes présentent dans les cellules copiées (fond de la cellule, mise en forme conditionnelle...).
Serait-il possible d'avoir, lorsque les données sont ajoutées à la FEUIL3 uniquement des valeurs "brutes" dans ces mise en forme ?
VB:
Sub Export()
If Feuil3.Range("A3").Value = "" Then
''Si Feuil 3 vide ( mais avec l'en-tête sur la ligne 1)
Feuil1.Range("A5:U" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1)
Else
''Si Feuil 3 non vide
Feuil1.Range("A5:U" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1)
End If
Feuil1.Activate
End Sub
Sub Export()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination))
Set OS = Worksheets("Feuil1") 'définit l'onglet source OS
DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet source OS
Set OD = Worksheets("Feuil3") 'définit l'onglet destination OD
'définit la cellule de destination DEST (A3 si A3 est vide, sinon la première cellule vide de la colonne A de l'onglet destination OD
If OD.Range("A3").Value = "" Then Set DEST = OD.Range("A3") Else Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0)
OS.Range("A5:U" & DL).Copy 'copie la plage de l'onglet source
DEST.PasteSpecial (xlPasteValues) 'colle les valeurs dans DEST
Application.CutCopyMode = False 'supprime le clignotement de la plage copiée
OS.Activate 'active l'onglet source OS
End Sub
Dans l'ensemble ça fonctionne mais :
-> La première ligne de chaque export est en gras
-> Est-il possible de nommer les feuilles excel par leur nom "unique" et non avec le nom donnée par l'utilisateur ? Worksheets("Feuil1")
De plus, j'ai modifié mon code initial pour y rajouter d'autres procédures d'export. Je suppose qu'il faut ajouter autant de déclarations (OS, OD, DL et DEST) que j'ai d'export différents ?
Mon nouveau code :
VB:
Sub Export()
'Export n° 1 :
If Feuil3.Range("A3").Value = "" Then
''Si Feuil 3 vide
Feuil1.Range("A5:U" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1)
Else
''Si Feuil 3 non vide
Feuil1.Range("A5:U" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1)
End If
'Export n° 2 :
If Feuil3.Range("X3").Value = "" Then
''Si Feuil 3 vide
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1)
Else
''Si Feuil 3 non vide
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1)
End If
'Export n° 3 :
If Feuil3.Range("AI3").Value = "" Then
''Si Feuil 3 vide
Feuil4.Range("A25:I32" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("AI" & Feuil3.Range("AI" & Feuil3.Rows.Count).End(xlUp).Row + 1)
Else
''Si Feuil 3 non vide
Feuil4.Range("A25:I32" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy Feuil3.Range("AI" & Feuil3.Range("AI" & Feuil3.Rows.Count).End(xlUp).Row + 1)
End If
'On ajuste la taille de la colonne A, B et E (export VAE inopinée)
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
'On retourne sur la Feuil1
Feuil1.Activate
End Sub
Comme je ne sais pas d'avance le nombre de lignes à copier dans la Feuil1, le code "compte" toutes les cellules de la colonne A non vides pour copier les lignes correspondantes puis effectue un coller dans la première ligne disponible de la colonne A de Feuil3.
Je ne sais pas du tout si ce fonctionnement est possible avec la méthode que tu indiques :
Salut Patrick (c'est aussi une contrepèterie), Ça faisait longtemps... Pas vraiment d'accord avec toi, pourquoi travailler avec des colonne entières ou être obligé d'utiliser un Resize pour utiliser les Values...
@ Horusbk : la première ligne est en gras ?!... je demande à voir.
Avec ton code ça donnerait :
VB:
Sub Export()
'Export n° 1 :
Feuil1.Range("A5:U" & Feuil1.Range("A" & Feuil1.Rows.Count).End(xlUp).Row).Copy
If Feuil3.Range("A3").Value = "" Then
Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
Else
Feuil3.Range("A" & Feuil3.Range("A" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
End If
'Export n° 2 :
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy
If Feuil3.Range("X3").Value = "" Then
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
Else
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
End If
'Export n° 3 :
Feuil4.Range("A25:I32" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy
If Feuil3.Range("AI3").Value = "" Then
Feuil3.Range("AI" & Feuil3.Range("AI" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
Else
Feuil3.Range("AI" & Feuil3.Range("AI" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
End If
'ici il te te faut spécifier rur quel onglet tu veux agir !...
'On ajuste la taille de la colonne A, B et E (export VAE inopinée)
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
'On retourne sur la Feuil1
Feuil1.Activate
End Sub
Bonjour,
Autant pour moi pour la ligne en gras... (un petit oubli de ma part dans un autre code).
Pour coller uniquement les valeurs c'est parfait !
J'ai une dernière question concernant l'export n° 2.
VB:
'Export n° 2 :
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy
If Feuil3.Range("X3").Value = "" Then
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
Else
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
End If
Les données à copier sont présentent uniquement dans la plage A5:I20. Or actuellement, la macro copier/coller me prend les valeurs situées après cette plage. Est-il possible de délimiter la partie du code (ci-dessous) en indiquant qu'on prend uniquement les lignes avec des valeurs dans les cellules pour les lignes comprises dans la plage : A5:I20 ?
quand on cherche la derniere
xlup pour colonne
xltoleft pour ligne
find("*", searchdirection:=xlprevious pour une plage
je parle même pas du else dans le quel tu fait la meme chose (ca sert a quoi????????)
conclusion TOUT A REVOIR
perso si je me fie a ce code si dessous tout du moins a ce qui est espéré
Code:
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy
If Feuil3.Range("X3").Value = "" Then
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
Else
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)
End If
bien entendu je vire le else qui sert a rien dans le code ci dessus
et donc je ferais plutôt ca
Code:
Dim F4, F3, Plage
Set F4 = Feuil4: Set F3 = Feuil3
Set Plage = F4.Range("A5:I" & F4.Range("A" & Rows.Count).End(xlUp).Row)
If F3.Range("X3").Value = "" Then
F3.Range("X" & F3.Range("X" & Rows.Count).End(xlUp).Row).offset(1).Resize(Plage.Rows.Count, Plage.Columns.Count) = Plage.Value
End If
et basta tes valeurs sont copiées
j'ai laisser le if bien que dans le code de base du demandeur il est caduque puisque le else le fait quand meme donc a voir
pour éventuellement ne prendre que les lignes pleines sans boucle il faudra soit filtrer soit faire un visible false complet sur la range puis un specialcell xlconstant visible puis union des areas
mais avant faut reprendre les bases