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 ;-))
 
S

salim

Guest
Bonjour @+Thierry, Yohan, Yeahou, Jean Claude, Bernard, le Forum

@+Thierry ( "ou un autre Intervenant" ) si par hasard tu repasses par ce fil aurais- tu l'extrême gentillesse en quelques mots ou plus explicitement ( si tu en as le temps ) de m'expliquer ce qu'est un tableau par indexation.

Dans l'attente de te lire.

Bonne journée à toutes et tous.

@+ Salim
 
@

@+Thierry

Guest
Bonjour Salim,

Vite Fait car je suis à la bourre, un Tableau Indéxé Séquentiellement (Dynamic Array) est ce qu'a montré Jean Claude (Post du 18-07-04 11:43) dans un exemple basic.

Regarde ce fil récent Lien supprimé

Bonne Journée
@+Thierry
 
S

salim

Guest
Re @+Thierry

Ok merci j'ai compris (Dynamic Array) voilà je commence à mieux comprendre l'Anglais que le Français l'exemple est bien simple est très compréhensible.
J'aurai du m'en souvenir d'autant que j'ai déjà eu droit à cette explication .
<http://www.excel-downloads.com/html/French/forum/messages/1_99573_99573.htm>

Merci

@+ Salim
 
@

@+Thierry

Guest
Re Bonjour Salim, le Fil, le Forum

Ah oui je me souviens maintenant,, ah oui tu es impardonnable avec toutes les explications que je t'ai données dans ce fil 99573 !!!

Bon et bien alors interro sur les Dynamic Array demain !!! lol
@+Thierry
 
S

salim

Guest
Re @+Thierry, le Fil, le Forum

C'est vrai je suis impardonable d'ailleurs je copie 100 fois la page d'explication de ce fameux Fil 99573. et en changeant de couleur à chaque lettre !!. lol

PS: C'est en quelle salle l'interro ?

@+ Salim
 
Y

yohan

Guest
Bonjour à tous,
Bonjour Thierry,
Merci pour ton message.
Comme tu vois, j'ai fini par mettre le nez dans VBA. Mais que le nez 8P !
J'ai essayé ta macro, et elle marche apparemment très bien, voici le code une fois adaptée à ma situation, je crois :
Sub Tab_Copy_Sheets3()
Dim Tableau As Variant
Dim Tableau2 As Variant
Dim WSSource As Worksheet
Dim WSCible As Worksheet
With ThisWorkbook
Set WSSource = .Sheets("Planning")
Set WSCible = .Sheets("ExporWeb")
End With

Tableau = Application.Union(WSSource.Range("C6:L14"), WSSource.Range("C15:L29"))
Application.Union(WSCible.Range("C6:L14"), WSCible.Range("C15:L29")).Value = Tableau
Tableau2 = Application.Union(WSSource.Range("C34:L44"), WSSource.Range("C45:L57"))
Application.Union(WSCible.Range("C34:L44"), WSCible.Range("C45:L57")).Value = Tableau2
End Sub

Comme tu vois, j'ai essayé de copier deux plages de celllules en même temps, et ça a l'air de fonctionner.
Mais j'ai deux question pour toi :
Premièrement, comment se fait-il que Union ait obligatoirement deux arguments, mais que si je mets comme arguments les deux plages qui m'intéressent, eh bien il copie une troisième plage de cellules, qui correspond plus ou moins aux deux indiquées ?
Deuxièmement, je ne sais pas si tu as pu lire mes premiers essais de macro dans ce post, mais il fallait à chaque fois que je pose une variable qui permette que la (ou les) zone(s) copiée(s) soi(en)t fonction de la semaine en cours. Vu que ta méthode semble être la plus efficace de toutes celles abordées dans ce post, je me dis qu'il est intéressant pour moi de l'adapter. Penses-tu qu'il est possible d'inclure une telle variable ?
Je te remercie d'avance de ta réponse, et du temps que tu mets ainsi à la disposition des hésitants exceliens ,-)
Bonne journée à tous
Yohan
 
@

@+Thierry

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

Pour Salim, Interro dans un petit Bar/Restau et tu paies l'apéro ! (JCA06, connait très bien !!)

Pour Yohan, je suis perplexe sur ce que tu veux obtenir et je n'ai pas vraiment le temps de relire et retranscrire toutes les macros proposées dans ce fil de discussion.

Une bonne nouvelle c'est que le Tableau construit directement sur une Range passe sous Mac... A partir de là il va te falloir composer... Le Union que j'ai proposé n'est peut-être pas nécessaire/applicable à ce cas de Figure (deux arguments sont nécessaires au minimum pour avoir deux plages différentes)... Mais bon, c'était pour un exemple dont tu sembles avoirs compris le fonctionnement.

Donc te faire avancer, imaginons une zone variable (un Bloc de Vingt Lignes sur Dix Colonnes de "C" à "L") sur la Feuilles Source à recopier sur une zone fixe de la Feuille Cible je m'y prendrai comme ceci :

Sub Tab_Copy_Sheets3()
Dim Tableau As Variant
Dim WSSource As Worksheet
Dim WSCible As Worksheet
Dim LigneDep As Integer

With ThisWorkbook
Set WSSource = .Sheets("Planning")
Set WSCible = .Sheets("ExporWeb")
End With

LigneDep = InputBox("Taper la ligne de départ")


With WSSource
Tableau = .Range("C" & LigneDep & ":L" & LigneDep + 10)
End With

With WSCible
.Range("C6:L16") = Tableau
End With
End Sub

Voilà, maintenant à toi d'adapter comme tu le souhaites, car j'ai mis une InputBox mais évidemment le résulat de la ligne de départ pourrait provenir d'une Cellule, mais je ne me suis pas avanturé avec le "(CellSemaine - 1) * 28 + 5" (c'est quoi ce sbinzz lol)

Bon Courage
@+Thierry
 
Y

yohan

Guest
Re !
Thierry, c'est GÉNIAL !!
Ça fonctionne du feu de Dieu ;-)
Voici le code entré :
Sub Tab_Copy_Sheets5()
Dim Tableau As Variant
Dim Tableau2 As Variant
Dim WSSource As Worksheet
Dim WSCible As Worksheet
Dim CellDef As Integer
Dim CellDef2 As Integer
Dim CellSemaine As Byte

With ThisWorkbook
Set WSSource = .Sheets("Planning")
Set WSCible = .Sheets("ExporWeb")
CellSemaine = Worksheets("ExporWeb").Range("H1")
CellDef = (CellSemaine - 1) * 28 + 6
CellDef2 = CellDef + 28
End With
MsgBox CellDef

With WSSource
Tableau = .Range("C" & CellDef & ":L" & CellDef + 23)
Tableau2 = .Range("C" & CellDef2 & ":L" & CellDef2 + 23)
End With

With WSCible
.Range("C6:L29") = Tableau
.Range("C34:L57") = Tableau2
End With
End Sub

Avec deux tableaux, il m'en faudra quatre au final, mais là c'est l'heure pour moi d'aller au bureau.
Le coup de (CellSemaine - 1)*28+6, bin c'est pour tomber sur la première cellule de la semaine en cours. Les semaines sont les unes sous les autres, et 28 lignes séparent deux débuts de semaine. Quant à la première semaine du planning (qui est en réalité dernière semaine de l'année avant celle en cours), eh bien elle est à la ligne 6. Bricolage, non ?
Mais ça marche, alors...
Merci bôkou Thierry !!!
Bonne journée à tous
 

Discussions similaires

Statistiques des forums

Discussions
311 732
Messages
2 081 997
Membres
101 861
dernier inscrit
Jerem28630