Se connecter avec
S'enregistrer | Connectez-vous

Excel VBA décaler tableau

Dernière réponse : dans Programmation

Bonjour,

je débute dans les macro Excel... et j'ai beau chercher sur tous le forums, je ne trouve pas de solutions à mon problème.

Je dispose d'une feuille excel avec 4 tableaux.
Chaque tableau dispose de 4 colonnes (Mois, Mois-1, mois-2, mois-3) et de 3 lignes correspondant à des indicateurs.

J'aimerais créer une macro qui permettrait d'enregister les données de la colonne mois (idéalement indiquer le mois en cours) dans une autre feuille (archive de toutes les données) et qui ensuite décalerait toutes les données vers la droite. Ainsi la colonne mois serait prête pour un nouvel encodage et ainsi de suite chaque fois qu'on appuie sur un bouton auquel on aurait affecté la macro.

Ma macro actuelle n'est pas "belle" et ne fonctionne pas totalement en plus...

Sheets("NE PAS TOUCHER").Select
Columns("B:B").Select
Selection.Insert Shift:=xlToRight
Selection.ColumnWidth = 10
Range("B2") = Range("'feuil2'!C4")
Range("B3") = Range("'feuil2'!C5")
Range("B4") = Range("'feuil2'!C6")
Range("B6") = Range("'feuil2'!C10")
Range("B7") = Range("'feuil2'!C11")
Range("B8") = Range("'feuil2'!C12")
Range("B10") = Range("'feuil2'!K4")
Range("B11") = Range("'feuil2'!K5")
Range("B13") = Range("'feuil2'!K10")
Range("B14") = Range("'feuil2'!K11")
Range("B15") = Range("'feuil2'!K12")
Range("B16") = Range("'feuil2'!K13")
Range("B18") = Range("'feuil2'!C17")
Range("B19") = Range("'feuil2'!D17")
Range("B20") = Range("'feuil2'!E17")
Range("B21") = Range("'feuil2'!F17")
Range("B22") = Range("'feuil2'!C18")
Range("B23") = Range("'feuil2'!D18")
Range("B24") = Range("'feuil2'!E18")
Range("B25") = Range("'feuil2'!F18")
Sheets("feuil2").Select
Range("F4:F6").Select = Range("E4:E6")

Pourriez-vous m'aider.

Merci beaucoup

Manu

Autres pages sur : excel vba decaler tableau

Lassé par la pub ? Créez un compte

désolé de ne pas avoir respécté le forum, d'après ce que je comprend j'aurais du insérer code

Je repose donc ma question correctement et en plus court.

Mon problème est le suivant lorsque j'exécute ce code


  1. Sheets("NE PAS TOUCHER").Select
  2. Columns("B:B").Select
  3. Selection.Insert Shift:=xlToRight
  4. Selection.ColumnWidth = 10
  5. Sheets("feuil2").Activate
  6. Sheets("NE PAS TOUCHER").Activate
  7. Sheets("NE PAS TOUCHER").Range("B2:B4") = Feuil2.Range("C4:C6")
  8. Sheets("NE PAS TOUCHER").Range("B6:B8") = Feuil2.Range("C10:C12")
  9. Sheets("NE PAS TOUCHER").Range("B10:B11") = Feuil2.Range("K4:K5")
  10. Sheets("NE PAS TOUCHER").Range("B13:B16") = Feuil2.Range("K10:K13")
  11. Sheets("NE PAS TOUCHER").Range("B18:B21") = Feuil2.Range("C17:F17")
  12. Sheets("NE PAS TOUCHER").Range("B22:B25") = Feuil2.Range("C18:F18")
  13. Sheets("feuil2").Activate
  14. Feuil2.Range("F4:F6") = Feuil2.Range("E4:E6")
  15. Application.ScreenUpdating = True


il m'ajoute bien une colonne et ne m'inscrit pas les données demandées. Idem pour toutes les commandes de type .range(" : "). Il me renvoie des cases vides.


Expert Programmation

:) 

La prochaine fois, clique sur ou mieux sur et modifie directement ton message. J'aurai eu le plaisir de supprimer le mien.

Bon, c'est pas tout ça, maintenant que le môssieur il a montré de la bonne volonté, il va falloir règler son problème.
Expert Programmation

Mais pourquoi fais-tu des Select et des Activate ???
Et n'essaye pas de me justifier les lignes 5 et 6.

A chaque fois que tu fais
Truc.Select
Selection.Machin
remplace-le par
Truc.Machin


La variable Feuil2 n'existe que dans certains modules. Donc pour éviter les déconvenues lors d'un transfert de code, Par principe, même si ça marche, n'utilise pas ce type de variable. Renomme ta feuille en TOTO (ou autre, c'est toi qui choisis ;)  ) et désigne-la par Sheets("TOTO")

Encore mieux. Tes onglets sont des feuilles de calculs, pas des graphes. Tu peux donc les désigner par Worksheets(..) plutôt que par Sheets(..)

Je réécris ton code :
  1. Worksheets("NE PAS TOUCHER").Columns("B:B").Insert Shift:=xlToRight
  2. Worksheets("NE PAS TOUCHER").Columns("B:B").ColumnWidth = 10
  3. Worksheets("NE PAS TOUCHER").Range("B2:B4") = Worksheets("TOTO").Range("C4:C6")
  4. Worksheets("NE PAS TOUCHER").Range("B6:B8") = Worksheets("TOTO").Range("C10:C12")
  5. Worksheets("NE PAS TOUCHER").Range("B10:B11") = Worksheets("TOTO").Range("K4:K5")
  6. Worksheets("NE PAS TOUCHER").Range("B13:B16") = Worksheets("TOTO").Range("K10:K13")
  7. Worksheets("NE PAS TOUCHER").Range("B18:B21") = Worksheets("TOTO").Range("C17:F17")
  8. Worksheets("NE PAS TOUCHER").Range("B22:B25") = Worksheets("TOTO").Range("C18:F18")
  9. Worksheets("TOTO").Range("F4:F6") =
  10. Worksheets("TOTO").Range("E4:E6")


Bon, ça ne marche toujours pas, je sais.
Pour alléger, j'utilise des variables locales explicites :

  1. Dim f_Source As Worksheet
  2. Dim f_Destin As Worksheet
  3.  
  4. Set f_Destin = Worksheets("NE PAS TOUCHER")
  5. Set f_Source = Worksheets("TOTO")
  6.  
  7. f_Destin.Columns("B:B").Insert Shift:=xlToRight
  8. f_Destin.Columns("B:B").ColumnWidth = 10
  9. f_Destin.Range("B2:B4") = f_Source.Range("C4:C6")
  10. f_Destin.Range("B6:B8") = f_Source.Range("C10:C12")
  11. f_Destin.Range("B10:B11") = f_Source.Range("K4:K5")
  12. f_Destin.Range("B13:B16") = f_Source.Range("K10:K13")
  13. f_Destin.Range("B18:B21") = f_Source.Range("C17:F17")
  14. f_Destin.Range("B22:B25") = f_Source.Range("C18:F18")
  15. f_Source.Range("F4:F6") = f_Source.Range("E4:E6")


Ce n'est pas plus efficace, c'est plus joli.
Bon. Qu'est-ce que tu veux, copier les formules, les valeurs ?

  1. f_Destin.Range("B2:B4").Cells.Forluma = f_Source.Range("C4:C6").Cells.Forluma
  2. f_Destin.Range("B6:B8").Cells.Value = f_Source.Range("C10:C12").Cells.Value


Tu veux tout copier !!!
Utilise la méthode Copy alors.

Syntaxe :
Source.Copy Destination


Ton code revu :
  1. Dim f_Source As Worksheet
  2. Dim f_Destin As Worksheet
  3.  
  4. Set f_Destin = Worksheets("NE PAS TOUCHER")
  5. Set f_Source = Worksheets("TOTO")
  6.  
  7. f_Destin.Columns("B:B").Insert Shift:=xlToRight
  8. f_Destin.Columns("B:B").ColumnWidth = 10
  9.  
  10. f_Source.Range("C4:C6") .Copy f_Destin.Range("B2:B4")
  11. f_Source.Range("C10:C12").Copy f_Destin.Range("B6:B8")
  12. f_Source.Range("K4:K5") .Copy f_Destin.Range("B10:B11")
  13. f_Source.Range("K10:K13").Copy f_Destin.Range("B13:B16")
  14. f_Source.Range("C17:F17").Copy f_Destin.Range("B18:B21")
  15. f_Source.Range("C18:F18").Copy f_Destin.Range("B22:B25")
  16. f_Source.Range("E4:E6") .Copy f_Source.Range("F4:F6")
Lassé par la pub ? Créez un compte