XL 2016 Remplacer Coller par coller valeurs

Aloha

XLDnaute Accro
Bonjour,
J'ai déjà expérimenté beaucoup pour motiver le code suivant:
Code:
Set Suchzeile = Cible.Worksheets(WS.Name).Range("A5000").End(xlUp)
Debug.Print Suchzeile.AddressLocal
WS.Range("A5:A35").Copy Suchzeile.Offset(1, 0)
WS.Range("F5:AC35").Copy Suchzeile.Offset(1, 1)
Application.CutCopyMode = False
          
With Cible.Worksheets(WS.Name)
    lRow = .Range("A" & .Rows.Count).End(xlUp).Offset(1).Row
    WS.Range("A5:A35").Copy .Range("A" & lRow)
    WS.Range("F5:AC35").Copy .Range("B" & lRow)
End With
à coller les valeurs et surtout pas le formatage. Avec ce code je dois reformater les feuilles cible par après.

D'ailleurs, vu ma modeste maîtrise de VBA, je ne comprends pas ce que ce bout de code
Code:
WS.Range("A5:A35").Copy Suchzeile.Offset(1, 0)
WS.Range("F5:AC35").Copy Suchzeile.Offset(1, 1)
fait exactement par rapport à ce bout de code:
Code:
WS.Range("A5:A35").Copy .Range("A" & lRow)
WS.Range("F5:AC35").Copy .Range("B" & lRow)
.

Bonne journée
Aloha
 

vgendron

XLDnaute Barbatruc
Hello
je n'ai pas bien compris la question.. en fait. suis meme pas sur qu'il y en ait une :)

sinon, d'après le titre du post
pour copier coller juste les valeurs d'une zone, tu peux faire
range("A5:C35").value=range("A5:C35").value
 

Aloha

XLDnaute Accro
Bonjour,
Il y a bien des questions, mais sans point d'interrogation!
Il y en a deux exactement:
1. comment modifier le code de la première fenêtre code (tout le code) pour qu'il ne copie que les valeurs, parce que si je copie comme ça mon formatage du fichier cible est détruit.
Tu as répondu à cette question, mais ne faut-il pas mettre Ws. avant Range? Et avec ça il ne fonctionne pas.
2. la deuxième question (indirecte aussi): que fait le premier bout de code (avec Offset)
Bonne après-midi
Aloha
 
Dernière édition:

vgendron

XLDnaute Barbatruc
VB:
Set Suchzeile = Cible.Worksheets(WS.Name).Range("A5000").End(xlUp) 'ici, tu définis Suchzeile comme la dernière cellule non vide en colonne A de la feuille ws.name dans ton classeur cible
Debug.Print Suchzeile.AddressLocal
WS.Range("A5:A35").Copy Suchzeile.Offset(1, 0) 'tu copie la zone A5:A35 une ligne en dessous de la cellule Suchzeile
WS.Range("F5:AC35").Copy Suchzeile.Offset(1, 1) 'tu copies la zone F5:C35: une ligne en dessous et une colonne à coté de SuchZeile
Application.CutCopyMode = False
      
With Cible.Worksheets(WS.Name) 'Dans le classeur Cible, feuille "Ws.name"
    lRow = .Range("A" & .Rows.Count).End(xlUp).Offset(1).Row 'tu récupères le numéro de la première ligne vide sur la colonne A
    WS.Range("A5:A35").Copy .Range("A" & lRow) 'et tu copies les infos ==> ca fait donc la meme chose que précédemment...et au meme endroit
    WS.Range("F5:AC35").Copy .Range("B" & lRow)
End With

et l'utilisation du ws.. la. ca ne va pas marcher.. parce que ws n'est pas défini....(du moins. dans le bout de code que tu as posté): il faudrait que tu postes ton fichier exemple

parce que je sens que ce qu'il te faut, c'est du pastespecial (xlpastevalues)
 
Dernière édition:

Aloha

XLDnaute Accro
Re,
Merci beaucoup pour tout ce travail!
==> ca fait donc la meme chose que précédemment...et au meme endroit)
Veux-tu dire par là qu'il y a double emploi et que
Code:
WS.Range("A5:A35").Copy Suchzeile.Offset(1, 0) 'tu copie la zone A5:A35
WS.Range("F5:AC35").Copy Suchzeile.Offset(1, 1)
fait la même chose que
Code:
WS.Range("A5:A35").Copy .Range("A" & lRow)
WS.Range("F5:AC35").Copy .Range("B" & lRow)
?

je sens que ce qu'il te faut, c'est du pastespecial (xlpastevalues)
Oui, c'est ce que je voulais faire et j'ai expérimenté pour coller les valeurs, mais comme la fonction Paste n'est pas utilisée, mais seulement Copy, je ne sais comment faire.
Jusqu'à récemment je ne connaissais même pas cette possibilité et j'avais déjà du mal à comprendre qu'avec Copy on ne peut pas seulement copier mais coller en même temps.

Ws est bien défini dans la Sub:
Code:
Dim WS As Worksheet, Cible As Workbook, Source As Workbook
Dim WSC As Worksheet

Je vais voir s'il m'est possible de modifier mon exemple pour qu'il corresponde à la situation réelle.
A+
Aloha
 

Aloha

XLDnaute Accro
Re,

oui exactement:
Je peux donc enlever (ou mettre un apostrophe avant) les lignes avec Offset?
Je connais et utilise la méthode F8.

Et comment faudrait-il modifier:
Code:
WS.Range("A5:A35").Copy.Range("A" & lRow)
WS.Range("F5:AC35").Copy.Range("B" & lRow)
pour qu'uniquement les valeurs soient collées?
J'ai essayé ceci
Code:
WS.Range("A5:A35").Copy
.Range("A" & lRow).PasteSpecial.xlPasteValues
WS.Range("F5:AC35").Copy
.Range("B" & lRow).PasteSpecial.xlPasteValues
, mais j'obtiens un message d'erreur:
"Compile error
Invalid or unqualified reference"
Si j'enlève le point entre PasteSpecial et xlPasteValues, cela ne change rien: j'ai le même message d'erreur.

J'ai encore un autre bout de code qui colle dans une ligne définie:
Code:
WS.Range("A5:A35").Copy Cible.Worksheets(WS.Name).Range("A16")
WS.Range("F5:AC35").Copy Cible.Worksheets(WS.Name).Range("B16")

A+
Aloha
 

vgendron

XLDnaute Barbatruc
Pour le PasteSpecial, il y a quand meme une syntaxe à respecter (cf aide)

VB:
Sub test()
Set cible = ActiveWorkbook
Set ws = ActiveSheet
     
With ws
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'tu récupères le numéro de la première ligne vide sur la colonne A
    .Range("A5:A35").Copy
    .Range("A" & lRow).PasteSpecial (xlPasteValues) 
    .Range("F5:AC35").Copy
    .Range("B" & lRow).PasteSpecial (xlPasteValues)
End With

End Sub

ce qui peut se simplifier par
VB:
Sub test()
Set cible = ActiveWorkbook
Set ws = ActiveSheet
     
With ws
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'tu récupères le numéro de la première ligne vide sur la colonne A
    .Range("A5:A35,F5:AC35").Copy
    .Range("A" & lRow).PasteSpecial (xlPasteValues) '

End With

End Sub

Ce code recopie SOUS ton tableau, les colonnes A et F:AC: UNE SEULE FOIS
si tu laisses la partie qui fait la meme chose (avec le SuchZeile), tu copiais DEUX fois l'une sous l'autre..
 

Aloha

XLDnaute Accro
Re,
Si je transforme ceci
WS.Range("A5:A35").Copy Cible.Worksheets(WS.Name).Range("A16")
WS.Range("F5:AC35").Copy Cible.Worksheets(WS.Name).Range("B16")
en
WS.Range("A5:A35").Copy Cible.Worksheets(WS.Name).Range("A16").PasteSpecial (xlPasteValues)
WS.Range("F5:AC35").Copy Cible.Worksheets(WS.Name).Range("B16").PasteSpecial (xlPasteValues)
je reçois un message d'erreur:
"Rune-time error 1004 : Unable to get the PasteSpecial property of the Range class"
Je suppose que la syntaxe n'est pas exacte?
D'ailleurs, pour exécuter le code avec F8, je suis embêté par le fait qu'à un certain moment Excel saute à
"Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)" où il y a une interminable boucle For...Next qui rend l'utilisation de F8 pratiquement impraticable et qui n'a rien à voir avec le code actuel.
Comment éviter cela?
A+
Aloha
 

vgendron

XLDnaute Barbatruc
il faut que les instructions Copy et Pastespecial soient sur DEUX lignes différentes.. comme dans ma proposition..
pour éviter le lancement des evènements, tu peux ajouter en début de macro
application.enableevents=false
et le remettre à true à la fin de la macro
 

Aloha

XLDnaute Accro
Ca fonctionne!...mais très lentement.
Et maintenant j'ai un autre problème: la fonction EOMONTH ne veut plus fonctionner.
Un exemple d'une formule comme elle se présente à présent:
Code:
=MIN('C:\Program Files (x86)\Microsoft Office\root\Office16\LIBRARY\Analyse\ATPVBAEN.XLA'!eomonth($B370;0);MAX($B370;D$328))
.
En réalité le dossier "Analyse" s'appelle "Analysis", mais lorsque je corrige le nom, je reçois le message "There is a problem with this formula":
 

Aloha

XLDnaute Accro
Tu dis que c'est imprudent; quelle est le risque?
Et si le nom n'est pas exact? S'il cherche dans "Analyse" et en réalité le dossier s'appelle "Analysis", il ne peut pas trouver.
Demain (ou plutôt aujourd'hui) je vais réinstaller Excel.
Bonne nuit
Aloha
 

Discussions similaires

Réponses
4
Affichages
491

Statistiques des forums

Discussions
311 720
Messages
2 081 900
Membres
101 834
dernier inscrit
Jeremy06510