VBA : copie d'une plage de valeurs

Y

yohan

Guest
Coucou, c'est remoi ;-)
Resalutations au forum,
Un nouveau problème m'empêche d'aller de l'avant sur mon projet : je voudrais copier d'une feuille à une autre une plage de cellules (ceci pour faire une feuille à exporter sur l'intranet dans laquelle ne figurent que les éléments importants). Seulement je voudrais copier les valeurs affichées par les cellules, et non les formules qu'elles contiennent.
J'avais essayé ça :
Sub CellSem()
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
CellDef = (CellSemaine - 1) * 28 + 5
Sheets("Planning").Select
Range("A1").Select
ActiveCell.Offset(CellDef, 2).Select
ActiveCell.Range("A1:J24").Select
Selection.Copy
Sheets("ExporWeb").Select
Range("C7").Select
ActiveCell.Range("A1:J24").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= True, Transpose:=True
Application.CutCopyMode = False
End Sub

Mais Excel me renvoie le message suivant : "Erreur 1004 L'opération requiert que les cellules fusionnées soient de taille identique".
Et en effet c'est aussi le message qu'il me donne si j'essaie à la main de ne copier-coller que les valeurs. Ceci ne marche que quand je ne copie-colle qu'une seule celllule.
Quelqu'un connaît-il l'astuce ??
Merci à tous, et bon week-end (pluvieux-orageux sur Paname... Un temps à bosser sur l'Excel ;-))
yohan (après j'arrête, promis ;-))
 
B

Bernard

Guest
Bonsoir Yohan

Essayes ce bout de code ?

Option Explicit
Sub CellSem()
Dim CellSemaine As Variant
Dim CellDef As Variant
CellSemaine = Worksheets(2).Range("H1")
CellDef = (CellSemaine - 1) * 28 + 5
Sheets("Planning").Cells(CellDef + 1, 3).Range("A1:J24").Copy
Sheets("ExporWeb").Range("C7").PasteSpecial Paste:=xlPasteValues, Transpose:=True
Application.CutCopyMode = False
End Sub

Cordialement

Bernard
 
Y

yohan

Guest
Bonsoir Bernard, le Forum,
Merci pour ta proposition, Bernard.
J'ai essayé.
Voici ce que me sort Excel :
"Erreur 1004 Erreur définie par l'application ou par l'objet"
Et quand je clique sur Débogage, voici la ligne mise en évidence :
Sheets("Planning").Cells(CellDef + 1, 3).Range("A1:J24").Copy
Mon ignorance en VBA ne sait quoi en déduire.
Une idée ?
En tout cas merci pour ton message ;-)
'night
Yohan
 
B

Bernard

Guest
Bonjour Yohan

Je travaille avec windows XP et la suite office pro (2002).

Si tu as une autre configuration, cela peut être l'objet d'incohérence !!
J'ai remis le nom de la feuille "ExportWeb", petite erreur de ma part.

Option Explicit
Sub CellSem()
Dim CellSemaine As Variant
Dim CellDef As Variant
CellSemaine = Sheets("ExporWeb").Range("H1")
CellDef = (CellSemaine - 1) * 28 + 5
Sheets("Planning").Cells(CellDef + 1, 3).Range("A1:J24").Copy
Sheets("ExporWeb").Range("C7").PasteSpecial Paste:=xlPasteValues, Transpose:=True
Application.CutCopyMode = False
End Sub

J'ai fait un test est cela marche cez moi.

Cordialement

Bernard
 
Y

yohan

Guest
Bonjour Bernard, le Forum,
Et merci de ton aide.
Au temps pour moi, j'avais oublié de préciser une chose d'importance : je travaille sur Mac. Peut-être que ça vient de ça.
J'ai lancé le nouveau code, et cette fois-ci j'ai eu droit à mon premier message "Erreur 1004 L'opération requiert que les cellules fusionnées soient de taille identique". :-(
Et c'est ligne qui est mise en valeur lors du débogage :
Sheets("ExporWeb").Range("C7").PasteSpecial Paste:=xlPasteValues, Transpose:=True
Come dans mon code.
Je me demande s'il n'y aurait pas une option qq part.
Parce que en effet dans les cellules à copier comme dans celles recevant les valeurs il y a des cellules fusionnées. Mais elles sont strictement de la même taille. Et ton code, comme le mien, marche si la plage de cellules indiquée correspond à une seule cellule.
Et ce même quand j'essai de faire ce copier-coller à la main. J'ai droit au message. Ce qui me fait dire que ce qui coince ne vient pas du code VBA, mais d'Excel ne lui-même : il interdit de faire des copier-coller des seules valeurs dans certains cas, dont apparemment le mien.
As-tu une idée de là où ça peut venir ?
Sinon peut-être faudra-t-il que je trouve une autre piste (je voulais faire ce copier-coller automatique pour pouvoir exporter sur l'intranet de mon boulot la semaine en cours d'un planning. Puisque dans mon modèle les 52 semaines sont sur la même feuille, et donc si j'exporte cette feuille, bin c'est pas très pratique à consulter...)
Merci beaucoup, Bernard,
bon dimanche,
Yohan
 
J

Jean-Claude

Guest
Bonjour Yohan, Bonjour le forum

Ci-jointe une petite macro à adapter à ton projet qui permet de copier des données d'une feuille à l'autre. On stocke les données dans un tableau de variables et on ressort ces mêmes données sur la feuille de calcul cible.

J'espère qu'elle te sera utile.
Personnellement, je n'aime pas trop utiliser le "copier/coller" dans le code

Amicalement

JClaude

Option Explicit
Dim tableau(1 To 30, 1 To 10)
Dim x As Integer, y As Integer

Public Sub copier_feuille1()

For x = 1 To 30
For y = 1 To 10
tableau(x, y) = Worksheets("feuil1").Cells(x, y).Value
Worksheets("feuil2").Cells(x, y).Value = tableau(x, y)
Next y

Next x
End Sub
 
Y

yohan

Guest
Bonjour Jean-Claude, le Forum,
Merci pour ton message.
J'ai essayé ta macro : ça mouline un peu mais ça marche !
Seulement, ce que je souhaite, c'est que dans la feuille pour l'exportation sur intranet figure la copie des cellules de la semaine en cours, et il faut donc que la zone "copié" varie automatiquement chaque semaine (même si pour lancer la macro il faut passer par un bouton, il faut que la macro adapte automatiquement les cellules à copier...), tu vois ce que je veux dire ?
J'ai essayé ça :
Public Sub copier_feuille1()
Dim tableau(1 To 24, 1 To 10)
Dim x As Variant, y As Variant
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 4
'Pour sélectionner la première cellule de la semaine en cours
For x = 1 To 24
For y = 1 To 10
tableau(x, y) = Worksheets("Planning").Cells(CellDef + x, y + 2).Value
Worksheets("test").Cells(3 + x, 2 + y).Value = tableau(x, y)
'J'ai créé une feuille "test" vierge pour bien voir le résultat de la macro
Next y

Next x
End Sub
Ça mouline bien, et ça a l'air de bien marcher. Qu'est-ce que t'en penses ?
A suivre...
Merci beaucoup Jean-Claude !
Yohan
 
Y

yeahou

Guest
Bonjour Yohan, Bernard, Jean Claude, le forum

Yohan, à mon avis, ton premier programme devrait fonctionner en modifiant légérement le paste.

Cordialement, A+

.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
 
Y

yohan

Guest
Merci à tous pour vos messages et vos conseils, top !
Pour Yeahou, voici ce que j'ai entré :
Sub CellSem2()
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 5
'Afin d'activer la première cellule de la semaine en cours
Sheets("Planning").Select
Range("A1").Select
ActiveCell.Offset(CellDef, 2).Select
ActiveCell.Range("A1:J24").Select
Selection.Copy
Sheets("ExporWeb").Select
Range("C7").Select
ActiveCell.Range("A1:J24").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
Application.CutCopyMode = False
End Sub
Et voici ce que me dit Excel : "La méthode PAsteSpecial de la classe Range a échoué", kézako ?
Pour Jean-Claude, j'ai adapté ta macro, puisque il faut en fait que je copie quatre plages de cellules en même temps, voici le code que j'ai entré :
Public Sub copier_feuille1()
Dim tableau(1 To 24, 1 To 10)
Dim tableau2(1 To 24, 1 To 10)
Dim x As Variant, y As Variant
Dim CellSemaine As Byte
Dim CellDef As Integer
Dim CellDef2 As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 4
'Pour sélectionner la première cellule de la semaine en cours
CellDef2 = CellSemaine * 28 + 4
For x = 1 To 24
For y = 1 To 10
tableau(x, y) = Worksheets("Planning").Cells(CellDef + x, y + 2).Value
Worksheets("test").Cells(4 + x, 2 + y).Value = tableau(x, y)
tableau2(x, y) = Worksheets("Planning").Cells(CellDef2 + x, y + 2).Value
Worksheets("test").Cells(4 + 28 + x, 2 + y).Value = tableau2(x, y)
'28, c'est le nombre de lignes qui sépare deux semaines dans le planning
Next y

Next x
End Sub
C'est pour seulement deux plages de cellules (c'est-à-dire deux semaines sur mon planning). Ça marche, mais, déjà, c'est lent, il lui faut une minute pour réaliser l'opération, qu'est-ce que ça va être quand il y aura quatre plages de cellules !
Connaîtrais-tu un moyen de simplifier le code, dans le cas justement où les plages à "copier" son plusieurs ?
Je cherche de mon côté, mais j'ai peur de n'en avoir pas les moyens intellectuels ;-)
Bref, si un des spécialistes du forum avait une piste, je serais preneur...
Encore merci pour votre aide ;-)
Yohan, qui ne décolle pas d'Escel (sur Mac)
 
Y

yeahou

Guest
Re bonjour

c'est normal que cela échoue de la façon dont tu l'utilise. Quand tu transposes, il ne faut pas sélectionner la même plage de destination que la plage de copie car elle ne peuvent correspondre sauf dans le cas ou il y a même nombre de colonnes que de lignes. Si c'est une copie exacte de la zone de départ que tu vaux, il faut
SkipBlanks:=False
Transpose:=False

remplaces

Range("C7").Select
ActiveCell.Range("A1:J24").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True

par

Range("C7").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True

ou sur une vieille version

Range("C7").Select
ActiveSheet.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True

et laisses faire excel pour la définition de la plage de sortie.

A+
 
Y

yohan

Guest
Yeahou,
Excuse-moi de revenir à la charge ;-)
D'une part, merci pour ta proposition.
Mais je n'ai pas réussi à la faire marcher :-(
Tu as le droit de me dire de retourner dans me bouquins 8P, je ne le prendrai pas mal...
Voici ce que ça donne :
Sub CellSem2()
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 5
'Afin d'activer la première cellule de la semaine en cours
Sheets("Planning").Select
Range("A1").Select
ActiveCell.Offset(CellDef, 2).Select
ActiveCell.Range("A1:J24").Select
Selection.Copy
Sheets("ExporWeb").Select
Range("C7").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
Application.CutCopyMode = False
End Sub

Mais Excel me met maintenant ce message d'erreur : "La méthode PAsteSpecial de l'objet Range a échoué", de classe c'est passé à objet...
Je ne sais pas l'interpréter...
Je m'en remets donc à ta science...
Merci pour ton aide
Yohan (qui part au bureau, si, si, à cette heure-ci, un dimanche...)
 
Y

yeahou

Guest
Re bonjour Yohan

quelle est ta version d'excel ? (numéro)

tu as essayé le deuxième code pour les anciennes versions ?
Range("C7").Select
ActiveSheet.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True

A+

Ps: ton code selon cette version ( un peu simplifié quand même)

Sub CellSem2()
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 5
'Afin d'activer la première cellule de la semaine en cours
Sheets("Planning").Range("A1").Offset(CellDef, 2).Range("A1:J24").Copy
Sheets("ExporWeb").Select
Range("C7").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
Application.CutCopyMode = False
End Sub
 
Y

yeahou

Guest
re tout le monde

je dis un activesheet.pastespecial et je fais un selection.pastespecial !
Attention, utilise précisément cette syntaxe
Sheets("ExporWeb").Select
Range("C7").Select
ActiveSheet.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
Si cela ne fonctionne pas, essaie la même chose avec skipblanks:=false juste pour voir...
voici le code correct.

Sub CellSem2()
Dim CellSemaine As Byte
Dim CellDef As Integer
CellSemaine = Worksheets("ExporWeb").Range("H1")
'Dans H1, s'insrit automatiquement le numéro de la semaine en cours
CellDef = (CellSemaine - 1) * 28 + 5
'Afin d'activer la première cellule de la semaine en cours
Sheets("Planning").Range("A1").Offset(CellDef, 2).Range("A1:J24").Copy
Sheets("ExporWeb").Select
Range("C7").Select
ActiveSheet.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=True, Transpose:=True
Application.CutCopyMode = False
End Sub
 
Y

yohan

Guest
Bonsoir Yeahou,
Merci vivement pour tes messages ;-)
Tu me demandes ma version d'Excel : je ne suis pas bien sûr d'avoir précisé que je suis sur Mac, avec une version Excel X, la dernière je crois.
J'avais bien essayé les deux codes que tu me proposais.
Avec celui de ton dernier message, Excel me répond :
"Erreur définie par l'application ou par l'objet".
Encore une fois, je ne sais pas en tirer les enseignements qui s'imposent sûrement. Est-ce lié au fait que je suis sur Mac ? Maybe.
J'ai pu faire l'opération souhaité avec la macro de Jean-Claude, mais, ainsi que signalé dans un précédent message, la manœuvre prend énormément de temps (environ une minute !).
Aussi je vais continuer un peu à chercher. Notamment en me renseignant auprès des Macusers, peut-être...
En tout cas merci Yeahou, et merci aux autres,
'night
Yohan
 
@

@+Thierry

Guest
Bonjour Yohan, Yeahou, Jean Claude, Bernard, le Forum

Juste en survolant, je voyais que Jean Claude construisait son tableau par indexation, ce qui ne semble pas justifié dans ce cas de figure, mais j'ai vraiment survolé.

Enfin juste pour une autre approche un exemple :
Sub Tab_Copy_Sheets()
Dim Tableau As Variant
Dim WSSource As Worksheet
Dim WSCible As Worksheet

With ThisWorkbook
Set WSSource = .Sheets("Feuil1")
Set WSCible = .Sheets("Feuil2")
End With

Tableau = Application.Union(WSSource.Range("A1:J30"), WSSource.Range("A35:J40"))
Application.Union(WSCible.Range("A1:J30"), WSCible.Range("A35:J40")).Value = Tableau

End Sub

Si çà peut servir...

Bonne Journée
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87