Médiaforma

All posts in VBAExcel

Une seule ligne de code suffit pour copier-coller des cellules, plages, lignes ou colonnes. Voici quelques exemples :

Copie de la cellule G5 en G30 :

Range("G5").Copy Range("G30")

Copie de la colonne A dans la colonne G :

Range("A:A").Copy Range("G:G")

Copie de la ligne 13 dans la ligne 25 :

Range("13:13").Copy Range("25:25")

Copie de la plage A2:C3 de la feuille courante à partir de la cellule A1 du classeur Feuil2 :

Range("A2:C3").Copy Worksheets("Feuil2").Range("A1")

Remarque

Ces instructions n’utilisent pas le presse-papiers multiple d’Office.

Dans tous ces exemples, le contenu des cellules et leur mise en forme sont copies-collés. Si vous voulez limiter le copier-coller aux valeurs ou à la mise en forme, vous devrez utiliser un collage spécial. Ici par exemple, les valeurs de la plage A2:B8 sont copiées en C12, sans tenir compte de la mise en forme :

Set range1 = Range("A2:B8")

range1.Copy

Range("C12").Select

ActiveCell.PasteSpecial Paste:=xlPasteValues

Vous voulez copier-coller la mise en forme mais pas la valeur des cellules ? Remplacez la constante xlPasteValues par la constante xlPasteFormats. Le code devient :

Set range1 = Range("A2:B8")

range1.Copy

Range("C12").Select

ActiveCell.PasteSpecial Paste:=xlPasteFormats

Couleur du texte

Dans les exemples de cette section, le texte devient rouge. Bien entendu, vous pouvez utiliser une autre couleur via la fonction RGB() ou en utilisant une couleur prédéfinie via Font.ColorIndex. Pour en savoir plus sur les couleurs utilisables en VBA, lisez l’article « Travailler avec des couleurs ».

Modifier la couleur du texte de la cellule active :

ActiveCell.Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de la sélection :

Selection.Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte d’une plage de cellules sans la sélectionner (ici, la plage A3:C5) :

Range("A2:C5").Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de plusieurs lignes contigües (ici , les lignes 6 à 9) :

Rows("6:9").Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de plusieurs lignes disjointes (ici , les lignes 2, 5 et 9) :

Range("2:2, 5:5, 9:9").Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de plusieurs colonnes contigües (ici, les colonnes B à D) :

Columns("B:D").Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de plusieurs colonnes disjointes (ici , les colonnes A et C) :

Range("A:A, C:C").Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte de toute la feuille courante :

Cells.Font.Color = RGB(255, 0, 0)

Modifier la couleur du texte d’une autre feuille de calcul (ici la feuille Feuil2) :

Feuil2.Cells.Font.Color = RGB(255, 0, 0)

Couleur d’arrière-plan

Tout ce qui a été dit dans la section précédente reste vrai ici, mais au lieu d’utiliser Font.Color, vous utiliserez Interior.Color ou Interior.ColorIndex.

Modifier la couleur de l’arrière-plan de la cellule active :

ActiveCell.Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de la sélection :

Selection.Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan d’une plage de cellules sans la sélectionner (ici, la plage A3:C5) :

Range("A2:C5").Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de plusieurs lignes contigües (ici , les lignes 6 à 9) :

Rows("6:9").Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de plusieurs lignes disjointes (ici , les lignes 2, 5 et 9) :

Range("2:2, 5:5, 9:9").Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de plusieurs colonnes contigües (ici, les colonnes B à D) :

Columns("B:D").Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de plusieurs colonnes disjointes (ici , les colonnes A et C) :

Range("A:A, C:C").Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan de toute la feuille courante :

Cells.Interior.Color = RGB(255, 0, 0)

Modifier la couleur de l’arrière-plan d’une autre feuille de calcul (ici la feuille Feuil2) :

Feuil2.Cells.Interior.Color = RGB(255, 0, 0)

Police et attributs

Vous pouvez utiliser les propriétés Name, Size, Bold, Italic, Underline et FontStyle de l’objet Font pour modifier (respectivement) la police, la taille des caractères et les attributs gras, italique et souligné des cellules.

Par exemple, pour affecter la police Courier 16 points gras italique souligné à la plage A5:C3, vous pouvez écrire :

Range("A2:C5").Font.Name = "Courier"

Range("A2:C5").Font.Size = 16

Range("A2:C5").Font.Bold = True

Range("A2:C5").Font.Italic = True

Range("A2:C5").Font.Underline = True

Les attributs gras et italique peuvent être définis dans la propriété FontStyle. Cette propriété admet les valeurs suivantes :

  • Regular
  • Italic
  • Bold
  • Bold Italic

Le code devient :

Range("A2:C5").Font.Name = "Courier"

Range("A2:C5").Font.Size = 16

Range("A2:C5").Font.Underline = True

Range("A2:C5").Font.FontStyle = "Bold Italic"

Il est encore possible d’améliorer le code. En factorisant Range(« A2:C5 »).Font, le code devient :

Sub test()

  With Range("A2:C5").Font

  .Name = "Courier"

  .Size = 16

  .Underline = True

  .FontStyle = "Bold Italic"

End With

Format des cellules

Vous pouvez utiliser des instructions VBA pour définir le format des cellules : nombre, monétaire, date, etc. Pour cela, vous utiliserez la propriété NumberFormat d’un objet Range, Rows, Columns, Cells ou ActiveCell.

Format de date et d’heure

Pour définir un format date ou heure, vous utiliserez les codes de format suivants :

Codes de format Signification
yyyy Année sur 4 chiffres
yy Année sur 2 chiffres
mmmm Mois en texte
mmm Mois en texte abrégé
mm Mois entre 01 et 12
m Mois entre 1 et 12
dddd Jour en texte
ddd Jour en texte abrégé
dd Jour entre 01 et 31
d Jour entre 1 et 31
hh Heures avec zéro entre 00 et 23
h Heures sans zéro entre 0 et 23
nn Minutes avec zéro entre 00 et 59
n Minutes sans zéro entre 0 et 59
ss Secondes avec zéro entre 00 et 59
s Secondes sans zéro entre 0 et 59

Par exemple, pour que la cellule courante affiche une date au format samedi 12/08/2018, vous utiliserez cette instruction :

ActiveCell.NumberFormat = "dddd dd/mm/yyyy"

Voici un exemple de rendu :

Ou encore, pour que la cellule courante affiche une information horaire avec un séparateur « : » et comprenant les heures sur 2 chiffres, les minutes sur 2 chiffres et les secondes sur 2 chiffres, vous utiliserez cette instruction :

ActiveCell.NumberFormat = "hh:mm:ss"

Voici un exemple de rendu :

Format numérique

Pour faciliter la saisie du format des cellules numérique, je vous conseille d’afficher la boîte de dialogue Format de cellule et de sélectionner la catégorie Personnalisée sous l’onglet Nombre :

Pour afficher cette boîte de dialogue, cliquez sur l’icône Format de nombre, dans le groupe Nombre, sous l’onglet Accueil du ruban :

Les chaînes de formatage de la boîte de dialogue Format de cellule seront appliqués aux cellules avec la propriété NumberFormatLocal. Par exemple, pour appliquer à la cellule active un format monétaire avec un affichage en rouge pour les valeurs négatives, vous utiliserez cette instruction :

ActiveCell.NumberFormatLocal = "# ##0,00 €;[Rouge]-# ##0,00 €"

Voici un exemple de rendu :

Copier-coller en VBA

Une seule ligne de code suffit pour copier-coller des cellules, plages, lignes ou colonnes. Voici quelques exemples :

Copie de la cellule G5 en G30 :

Range("G5").Copy Range("G30")

Copie de la colonne A dans la colonne G :

Range("A:A").Copy Range("G:G")

Copie de la ligne 13 dans la ligne 25 :

Range("13:13").Copy Range("25:25")

Copie de la plage A2:C3 de la feuille courante à partir de la cellule A1 du classeur Feuil2 :

Range("A2:C3").Copy Worksheets("Feuil2").Range("A1")

Remarque

Ces instructions n’utilisent pas le presse-papiers multiple d’Office.

Dans tous ces exemples, le contenu des cellules et leur mise en forme sont copies-collés. Si vous voulez limiter le copier-coller aux valeurs ou à la mise en forme, vous devrez utiliser un collage spécial. Ici par exemple, les valeurs de la plage A2:B8 sont copiées en C12, sans tenir compte de la mise en forme :

Set range1 = Range("A2:B8")

range1.Copy

Range("C12").Select

ActiveCell.PasteSpecial Paste:=xlPasteValues

Vous voulez copier-coller la mise en forme mais pas la valeur des cellules ? Remplacez la constante xlPasteValues par la constante xlPasteFormats. Le code devient :

Set range1 = Range("A2:B8")

range1.Copy

Range("C12").Select

ActiveCell.PasteSpecial Paste:=xlPasteFormats

Il peut parfois être utile d’exécuter une macro à la fermeture d’un classeur. Pour cela, vous devez créer la procédure Workbook_BeforeClose().

Ouvrez la fenêtre Microsoft Visual Basic pour Applications du classeur concerné. Double-cliquez sur ThisWorkbook dans la fenêtre Projet (1) et sélectionnez BeforeClose dans la liste déroulante Procédure (2). La procédure Workbook_BeforeClose() est automatiquement créée. Il ne vous reste plus qu’à la compléter (3) :


Il peut parfois être utile d’exécuter une macro à l’ouverture d’un classeur. Pour cela, vous devez créer la procédure Workbook_Open().

Ouvrez la fenêtre Microsoft Visual Basic pour Applications du classeur concerné. Double-cliquez sur ThisWorkbook dans la fenêtre Projet (1) et sélectionnez Workbook dans la liste déroulante Objet (2). La procédure Workbook_Open() est automatiquement créée. Il ne vous reste plus qu’à la compléter (3) :

Lorsque vous ouvrirez le classeur, le code placé dans la procédure Workbook_Open() sera automatiquement exécuté :


Le langage VBA permet d’ouvrir, de modifier et de sauvegarder des classeurs. Cet article va vous montrer comment.

Ouvrir un classeur vierge

Il est très simple d’ouvrir un nouveau classeur vierge avec VBA. Pour cela, vous utiliserez la méthode Workbooks.Add. Sans argument, cette méthode ouvre un nouveau classeur nommé Classeur1 (si c’est le premier), classeur2.xlsx (si c’est le deuxième), etc. :

Si nécessaire, vous pouvez donner un nom à ce nouveau classeur et le sauvegarder dans un dossier quelconque :

Set nouveau = Workbooks.Add

nouveau.SaveAs Filename:="c:\data\classeurs\nouveau.xlsx"

Remarquez l’utilisation du mot clé Set (et non Dim) pour définir la variable objet nouveau dans laquelle est stocké le nouveau classeur.

La propriété SaveAs définit le dossier et le nom du classeur et le sauvegarde.

Ouvrir un classeur

Dans un précédent article, vous avez vu qu’il était possible de s’adresser à un classeur nommé classeur1.xlsm avec l’instruction :

Workbooks("classeur1.xlsm")

Ou encore à la cellule C8 de la feuille Feuil1 du classeur Classeur1.xlsm avec cette instruction :

Workbooks("classeur1.xlsm").Worksheets("Feuil1").Range("C8")

Vous allez maintenant apprendre à ouvrir un classeur avec l’instruction Workbooks.Open dont voici la syntaxe :

Workbooks.Open "classeur"

classeur représente le chemin complet du classeur que vous voulez ouvrir.

Après l’exécution de cette instruction, le classeur ouvert devient le classeur actif.

Ouverture d’un classeur avec un chemin explicite

Par exemple, pour ouvrir le classeur société.xlsm qui se trouve dans le dossier data\classeurs du disque c:, vous utiliserez cette instruction :

Workbooks.Open "c:\data\classeurs\société.xlsm"

Ouverture d’un classeur avec un chemin relatif

Dans l’instruction précédente, le chemin du classeur est indiqué de façon explicite. Si le classeur à ouvrir se trouve dans le même dossier que le classeur où le code VBA est exécuté, vous pouvez y faire référence de façon relative, c’est-à-dire sans préciser explicitement le chemin du dossier. Pour cela, vous utiliserez la propriété Path de l’objet ActiveWorkbook :

Dim chemin As String

chemin = ActiveWorkbook.Path

Workbooks.Open chemin & "\société.xlsm"

Fermer un classeur

Pour fermer un classeur, vous utiliserez l’instruction Workbooks().Close dont voici la syntaxe :

Workbooks("classeur").Close

classeur représente le nom du classeur que vous voulez fermer.

Par exemple, pour fermer le classeur société.xlsm, vous utiliserez cette instruction :

Workbooks("société.xlsm").Close

Si le classeur à fermer a été modifié depuis son ouverture, une boîte de dialogue vous demandera si vous voulez sauvegarder les modifications :

Pour éviter d’avoir à cliquer sur Enregistrer ou sur Ne pas enregistrer, vous pouvez choisir si le classeur doit ou ne doit pas être enregistré en ajoutant un paramètre à la commande de fermeture.

Pour sauvegarder par défaut le classeur avant de le fermer, ajoutez SaveChanges:=True à la suite de la commande de fermeture. Par exemple, pour sauvegarder puis fermer le classeur société.xlsm, vous utiliserez cette commande :

Workbooks("société.xlsm").Close SaveChanges:=True

Inversement, pour fermer un classeur sans sauvegarder les modifications, vous ajouterez SaveChanges:=False à la suite de la commande de fermeture. Par exemple, pour fermer le classeur société.xlsm sans sauvegarder les modifications, vous utiliserez cette commande :

Workbooks("société.xlsm").Close SaveChanges:=False

Pour terminer cette section sur la fermeture de classeurs, signalons qu’un message d’erreur s’affichera si vous tentez de fermer un classeur qui n’est pas ouvert :

Remarque

Vous voulez supprimer cette erreur ? Ajoutez cette instruction dans la procédure qui ferme le classeur :

On Error Resume Next

Pour aller plus loin sur la gestion des erreurs, consultez l’article intitulé  » Gestion d’erreurs en VBA ».

Sauvegarder un classeur

En complément des commandes d’ouverture et de fermeture, sachez que vous pouvez également sauvegarder un classeur avec utiliserez l’instruction Workbooks().Save dont voici la syntaxe :

Workbooks("classeur").Save

classeur représente le nom du classeur que vous voulez sauvegarder.

Notez qu’il est également possible de sauvegarder le classeur actif (celui qui a le focus) avec cette instruction :

ActiveWorkbook.Save

Si le classeur doit être sauvegardé dans un autre fichier, vous utiliserez l’instruction Workbooks().SaveAs :

Workbooks("classeur").SaveAs

classeur représente le nom du classeur que vous voulez sauvegarder.