Copier/Coller VBA sans mise en forme

Horusbk

XLDnaute Junior
Bonjour,

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

Merci d'avance pour votre aide
Bapt"
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Horusbk, bonsoir le forum,

Essaie comme ça :

VB:
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
 

Horusbk

XLDnaute Junior
Bonsoir Robert :)
Merci de ta réponse.

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

A+
 

Horusbk

XLDnaute Junior
Bonsoir patricktoulon,

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 :
VB:
feuil3.range(x:y).value=feuil1.range(a:z).value

Cordialement,
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

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
 

Horusbk

XLDnaute Junior
Bonjour,
Autant pour moi pour la ligne en gras... (un petit oubli de ma part dans un autre code). :rolleyes:
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 ?
Code:
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy

A+
 

patricktoulon

XLDnaute Barbatruc
bonjour Robert
pourquoi travailler avec des colonne entières ou être obligé d'utiliser un Resize pour utiliser les Values...
il me semble pas avoir parler de colonne entière ou de resize
bien que pour le resize c'est une obligation quand on passe par le .value

et puis avant tout il faudrait expliquer au demandeur comment le string d'une plage s'ecrit
Or actuellement, la macro copier/coller me prend les valeurs situées après cette plage.

heu......c'est quoi ca !!????????????ca veut rien dir
VB:
Feuil4.Range("A5:I20" & Feuil4.Range("A" & Feuil4.Rows.Count).End(xlUp).Row).Copy

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
 
Dernière édition:

Horusbk

XLDnaute Junior
Bonjour à tous les deux,

je parle même pas du else dans le quel tu fait la meme chose
Un petit oubli... qui avait son intérêt mais à présent ce n'est plus le cas. :rolleyes:

Du coup en simplifiant le code de Robert j'obtient ce que j'espérais :
VB:
Feuil4.Range("A5:I20").Copy
Feuil3.Range("X" & Feuil3.Range("X" & Feuil3.Rows.Count).End(xlUp).Row + 1).PasteSpecial (xlPasteValues)

Merci encore ̂pour le coup de main :)
 

Discussions similaires

Statistiques des forums

Discussions
311 715
Messages
2 081 822
Membres
101 822
dernier inscrit
holale