Manipuler les cellules en VBA avec l’objet Range [#21 FORMATION EXCEL VBA COMPLETE]
Dans ce nouveau chapitre de la formation sur l’apprentissage de VBA, nous allons découvrir comment manipuler l’un des objets les plus essentiels des macros en VBA, il s’agit de l’objet Range qui permet de manipuler des cellules ou des plages de plusieurs cellules.
Téléchargement
Vous pouvez obtenir le fichier d'exemple de cet article et découvrir la méthode d'apprentissage de VBA pas-à-pas en cliquant sur le lien suivant :
Tutoriel Vidéo
Partie 1 : 4 METHODES POUR INSERER LA DATE DU JOUR RAPIDEMENT DANS UNE CELLULE SUR EXCEL (avec et sans VBA) (voir le tutoriel)
Partie 2 : ENREGISTRER LES HEURES DE REALISATION DES EVENEMENTS SUR LES FEUILLES EXCEL (voir le tutoriel)
Partie 3 : DECOUVRONS QUELQUES OBJETS RANGE PARTICULIERS DE VBA (voir le tutoriel)
Partie 4 : UTILISER LES COPIER/COLLER EN VBA (voir le tutoriel)
Partie 5 : AUTRES MOYENS DE MANIPULER DES CELLULES EN VBA (voir le tutoriel)
1. Qu’est-ce que l’objet Range
S’il ne doit y avoir qu’un seul sous-objet à connaître en VBA, il s’agit bien évidemment de l’objet Range qui nous intéresse justement dans ce chapitre !
En effet, celui-ci permet de manipuler une cellule ou un groupe de plusieurs cellules contenues dans les feuilles de calcul Excel, afin de réaliser toutes les opérations qui vont nous intéresser dans le cadre du développement de macros en VBA :
- Sélectionner une ou plusieurs cellules,
- Modifier leur valeur,
- …
2. Comment utiliser l’objet Range
Pour manipuler une cellule en VBA, nous spécifions les coordonnées en tant qu’argument de la fonction.
Dans les exemples à venir, nous allons utiliser la procédure de l’objet Range : Select. Comme vous pouvez vous en douter, celle-ci permet de sélectionner les cellules spécifiées en argument.
2.1. Sélectionner une cellule
Sheets("21-Range").Range("A8").Select ' Sélectionner la cellule A8
Pour sélectionner une seule cellule, il suffit de saisir ces coordonnées entre guillemets (cette coordonnée est en effet une chaîne de caractères) :
2.2. Sélectionner un groupe de cellules contiguës
Sheets("21-Range").Range("A8:B10").Select ' Sélectionner les cellules A8 a B10
Pour sélectionner plusieurs cellules accolées les unes aux autres, nous saisissons les coordonnées de la première et de la dernière, en les séparant par deux points (comme nous le ferions pour une formule Excel) :
2.3. Sélectionner un groupe de cellules non contiguës
Sheets("21-Range").Range("A8,C5,D14").Select ' Sélectionner les cellules A8, C5 et D14
Lorsque les cellules non sont pas collées les unes aux autres, nous séparons les coordonnées de chacune d’entre elles par une virgule (la virgule remplace le point-virgule que nous utilisons dans les formules Excel) :
2.4. Sélectionner des colonnes entières
Sheets("21-Range").Range("B:D").Select ' Sélectionner les colonnes B à D
Pour sélectionner des colonnes entières, nous saisissons les lettres correspondantes
2.5. Sélectionner des lignes entières
Sheets("21-Range").Range("8:10").Select ' Sélectionner les lignes 8 à 10
Pour sélectionner des colonnes entières, nous saisissons les chiffres correspondants
3. La propriété Value
La propriété par défaut de l’objet range est la propriété Value, celle-ci permet de lire ou de modifier la valeur de la cellule (ou des cellules).
Nous pouvons ainsi facilement afficher dans une MsgBox la valeur d’une cellule :
MsgBox Sheets("21-Range").Range("A3").Value ' Afficher le contenu de la cellule A3
Attention, nous ne pouvons lire le contenu que d’une unique cellule ! Dans le cas contraire, cela provoquera évidemment une erreur d’exécution :
La propriété Value permet également de modifier le contenu d’une cellule en utilisant simplement le signe égal :
Sheets("21-Range").Range("A8").Value = "Hello" ' Modifier la valeur de la cellule A8
En tant que propriété par défaut, celle-ci est d’ailleurs facultative, nous pouvons tout aussi bien saisir :
Sheets("21-Range").Range("A8") = "Hello" ' Modifier la valeur de la cellule A8
Enfin, s’il est impossible de lire simultanément le contenu de plusieurs cellules, il est tout à fait possible de modifier les valeurs affectées à plusieurs cellules :
Sheets("21-Range").Range("A8:C10") = "Hello" ' Modifier la valeur de la cellule A8
4. La propriété Formula
La propriété Value que nous venons de découvrir permet de saisir (ou de lire) une valeur à une cellule, nous pouvons également utiliser celle-ci pour saisir une formule :
Sheets("21-Range").Range("A8").Value = "=NOW()" ' Afficher la date et l'heure
Comme vous pouvez le voir dans cet exemple, lorsque nous tapons la formule dans VBA, nous devons saisir celle-ci dans le langage natif d’Excel qui est le langage anglo-saxon. La formule MAINTENANT() est donc remplacée par son équivalent correspondant : la formule NOW().
Pour autant, lorsque nous nous rendons sur la feuille de calcul, celle-ci est bien saisie dans le langage du système, ici en français !
Maintenant, même si nous venons de voir dans cet exemple, qu’il est tout à fait possible d’utiliser kla propriét Value pour saisir une formule dans une cellule, il est préférable d’utiliser la propriété qui est spécialement dédiée : il s’agit de Formula :
Sheets("21-Range").Range("A8").Formula = "=NOW()" ' Afficher la date et l'heure
Ici, l’effet sera exactement le même, c’est-à-dire que la formule MAINTENANT() va être correctement insérée dans la cellule A8.
En revanche, la différence va intervenir lorsque nous allons souhaiter récupérer le contenu de la cellule :
Debug.Print Sheets("21-Range").Range("A8").Value ' Résultat : 19/02/2020 18:34:23
Debug.Print Sheets("21-Range").Range("A8").Formula ' Résultat : =NOW()
Nous pouvons ainsi constater que lorsque nous utilisons la propriété Value, nous récupérons la valeur de la cellule, tandis que la propriété Formula permet évidemment de récupérer la formule de celle-ci (exprimé dans la langue anglo-saxonne).
En revanche, lorsque la cellule ne contient pas de formule, mais directement une valeur saisie en dure, alors les deux solutions permettrons de récupérer le contenue de celle-ci d’une manière analogue :
Debug.Print Sheets("21-Range").Range("A3").Value ' Résultat : L'objet Range [#21 FORMATION EXCEL VBA COMPLETE]
Debug.Print Sheets("21-Range").Range("A3").Formula ' Résultat : L'objet Range [#21 FORMATION EXCEL VBA COMPLETE]
5. La propriété NumberFormat
VBA va nous permettre de modifier simplement le format appliqué à une cellule en utilisant la propriété NumberFormat :
Sheets("21-Range").Range("A8").NumberFormat = "hh:mm" ' Afficher l'heure
Ici encore, nous devront être attentif lors de la mise en place de celui-ci qui doit correspondre au format anglo-saxon :
Sheets("21-Range").Range("A8").NumberFormat = "dd/mm/yyyy" ' Afficher la date
Ainsi le format jj/mm/aaaa devient dd/mm/yyyy (« d » pour day et « y » pour year).
Lorsque nous souhaitons utiliser un format complexe et dont nous ne connaissons pas l’équivalent anglo-saxon, nous pouvons utiliser la propriété NumberFormat en procédant de la manière suivante :
- Nous commençons par sélectionner la cellule qui nous intéresse dans la feuille de calcul, puis nous effectuons un clic-droit > Format de cellule :
- Dans la fenêtre de personnalisation du Format de Cellule, nous pouvons choisir un format pré-enregistré, ou bien créer un format de toute pièce depuis le menu Personnalisé :
- Puis nous validons la création du format en appuyant sur le bouton OK
Il ne nous reste alors plus qu’à récupérer celui-ci en affichant le format directement depuis la fenêtre d’exécution pour en effectuer un copier-coller :
Debug.Print Sheets("21-Range").Range("A8").NumberFormat ' Afficher le format de la cellule A8
Et enfin un collage :
6. La propriété Text
La dernière propriété que nous allons découvrir dans cette partie de la formation est la propriété Text.
Celle-ci permet de récupérer la chaîne qui est saisie dans une cellule, comme celle-ci est affiché à l’écran, c’est-à-dire avec le formatage qui lui est affecté :
msgbox Sheets("21-Range").Range("A8").text ' Afficher le contenu de la cellule A8 tel qu'il est affiché
Pour finir, voici une synthèse des propriétés que nous venons de découvrir dans ce chapitre qui permettent de récupérer des informations d’une cellule :
Et voilà c’est tout cette présentation de l’objet Range, qui nous a permis de faire un rapide tours d’horizon des possibilités offertes, afin de pouvoir déjà commencer à manipuler les cellules contenues dans une feuille de calcul.
Mais comme vous pouvez vous en douter, il reste encore de très nombreuses propriétés et méthodes à découvrir dès la semaine prochaine. Nous y verrons notamment comment modifier le format de cellule (couleur, police,…) effectuer des copier / coller, comment supprimer des cellules,…
7. Personnaliser la mise en forme d’une cellule
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
______________________________________________
Au cours du début de ce chapitre, nous avons découvert comment manipuler simplement des cellules en utilisant VBA, et plus particulièrement l’objet Range.
Maintenant que nous savons comment modifier le contenu d’une ou plusieurs cellules (lire ou modifier la valeur de la cellule, une formule, le formatage des valeurs numériques, …), voyons comment modifier l’apparence d’une cellule (taille de texte, police de caractères, gras, souligné, couleur, bordures, …).
7.1. Modifier la mise en forme du texte d’une cellule : police de caractères, taille,…
La modification de la mise en forme des textes de cellules passe par la propriété Font de l’objet Range.
Il suffit de commencer à saisir celle-ci pour en découvrir l’ensemble des sous-propriété mise à disposition pour pouvoir personnaliser profondément l’apparence donnée aux textes saisis dans la cellule :
Comme vous pouvez le constater, cette propriété permet de modifier énormément de paramètres. Dans cette partie, nous allons analyser les principaux éléments à maîtriser.
Pour modifier plusieurs éléments en série, nous allons utiliser l’élément With que nous découvrirons dans un prochain chapitre de la formation.
Sachez juste que celui-ci permet d’exécuter une série d’instructions qui font référence à un objet déterminé. Il ne sera ainsi plus nécessaire de ressaisir cet objet par la suite.
Ainsi, lorsque nous saisissons :
With Sheets("21-Range").Range("a8").Font
End With
Il suffira de saisir une sous-propriété de Font en commençant un point, pour qu’Excel comprenne que nous souhaitons intervenir sur cette propriété en particulier.
Cette méthode de développement permet de gagner du temps lors de la saisie du code, et permet également de rendre ce dernier plus clair et plus agréable à lire.
Modifier la police de caractères de la cellule A8 :
Ainsi pour affecter une police Arial à la cellule A8, nous utiliserons la propriété Name :
With Sheets("21-Range").Range("a8").Font
.Name = "Arial"
End With
Pour affecter une valeur cette propriété, nous utilisons simplement le symbole égal, suivi du nom de la police de caractère entre guillemets.
Modifier la taille du texte de la cellule A8 :
Ensuite, pour modifier la taille du texte, nous utiliserons la propriété Size :
With Sheets("21-Range").Range("a8").Font
.Name = "Arial"
.Size = 10
End With
Afficher le texte en gras :
Pour afficher le texte de la cellule en gras, nous allons intervenir sur la propriété Bold (« bold » signifiant « gras »).
Par défaut, cette propriété a pour valeur False (« faux »), nous affectons alors la valeur True (« vrai ») à cette propriété :
With Sheets("21-Range").Range("a8").Font
.Name = "Arial"
.Size = 10
.Bold = True
End With
Afficher le texte en italique :
Pour afficher le texte de la cellule en italique, nous procédons de la même manière avec la propriété Italic (inutile de traduire celle-ci !).
With Sheets("21-Range").Range("a8").Font
.Name = "Arial"
.Size = 10
.Bold = True
.Italic = True
End With
Souligner le texte :
En revanche, le soulignement du texte de la cellule suit une méthode légèrement différente, afin de pouvoir préciser quel type de soulignement nous souhaitons mettre en place :
Pour un soulignement simple, la propriété Underline prend pour valeur xlUnderlineStyleSingle :
With Sheets("21-Range").Range("a8").Font
.Name = "Arial"
.Size = 10
.Bold = True
.Italic = True
.Underline = xlUnderlineStyleSingle
End With
La valeur xlUnderlineStyleDouble permet de doubler le soulignement :
Il est également possible de souligner, non pas simplement les textes saisis dans la cellule, mais l’ensemble de l’espace disponible dans la cellule (blancs compris), en utilisant les valeurs xlUnderlineStyleSingleAccounting (trait simple) et xlUnderlineStyleDoubleAccounting (trait doublé) :
Enfin, sachez qu’il est également possible d’utiliser la valeur True, et dans ce cas, la propriété Underline prend sa valeur par défaut, c’est-à-dire xlUnderlineStyleSingle (ces deux valeurs sont donc identiques) :
.Underline = True
De la même manière, nous pouvons désactiver le soulignement de deux manières différentes (xlUnderlineStyleNone est équivalent à False) :
.Underline = False
Bien entendu, l’ensemble des propriétés que nous venons de voir ici sont également accessible en lecture :
Cela permet également de dupliquer rapidement la mise en forme d’une cellule sur une autre cellule :
Sheets("21-Range").Range("a9").Font = Sheets("21-Range").Range("a8").Font
7.2. Modifier la couleur du texte
La modification de la couleur du texte de la cellule découle également de la propriété Font de l’objet Range :
Comme le montre cette capture, deux propriétés sont disponibles pour y parvenir :
- La propriété ColorIndex : il s’agit de la propriété la plus simple que nous pouvons utiliser, en effet celle-ci nécessite seulement de saisir un nombre compris entre 1 et 56. Chacun de ces nombres correspondent à un index de couleur pré-enregistré :
- La propriété Color est un peu plus complexe à utiliser, mais permet d’obtenir un résultat beaucoup précis. En effet, celle-ci consiste à donner comme valeur la couleur exacte que nous souhaitons obtenir, et pour cela, nous pouvons par exemple utiliser la fonction VBA RGB() qui retour une valeur de couleur en fonction des couleurs RGB que nous spécifions en paramètres (valeurs comprises entre 1 et 255).
Ainsi les solutions suivantes vont être strictement identiques :
' Afficher le texte en noir :
Range("A8").Font.ColorIndex = 1
Range("A9").Font.Color = RGB(1, 1, 1)
' Afficher le texte en blanc :
Range("A8").Font.ColorIndex = 2
Range("A9").Font.Color = RGB(255, 255, 255)
' Afficher le texte en bleu :
Range("A8").Font.ColorIndex = 23
Range("A9").Font.Color = RGB(0, 102, 204)
Notez que l’utilisation de la fonction RGB est uniquement là pour nous aider à trouver la bonne couleur, nous pourrions directement saisir la couleur correspondante si nous la connaissons :
Range("A9").Font.Color = 16777215
Et bien évidemment, la propriété Color permet d’obtenir des variations de couleurs qui ne figurent pas dans l’index des couleurs d’Excel :
' Afficher le texte en bordeau :
Range("A9").Font.Color = RGB(158, 2, 52) ' Afficher le texte en cyan :
Range("A9").Font.Color = RGB(15, 200, 181)
7.3. Modifier la couleur de fond d’une cellule
Pour modifier la couleur de fond d’une cellule, nous allons utiliser les concepts de gestion des couleurs que nous venons de voir, mais que nous allons appliquer sur la propriété Interior de l’objet Range :
' Modification des couleurs de fond de cellule
Range("A8").Interior.ColorIndex = 12
Range("A9").Interior.Color = RGB(100, 100, 100)
Ensuite pour supprimer la couleur de fond d’une cellule, nous affectons la valeur xlColorIndexNone indifféremment aux propriétés Color ou ColorIndex :
Range("A8").Interior.ColorIndex = xlColorIndexNone
Range("A9").Interior.Color = xlColorIndexNone
7.4. Modifier les bordures d’une cellule
La gestion des bordures de cellules en VBA passe par la propriété Border de l’objet Range, laquelle admet également son lot de sous-propriétés :
Nous pouvons tout d’abord définir le type de bordure à appliquer avec la propriété Value :
' Modificaiton des bordures
Range("a8").Borders.Value = True
Ensuite, nous pouvons personnaliser la bordure :
With Range("a8").Borders
.Value = True
.Weight = 3 ' Modifier l'épaisseur de la bordure
.ColorIndex = 10 ' Modifier la couleur de la bordure
.LineStyle = xlContinuous ' Bordure continue
.LineStyle = xlDash ' Bordure en pointillée
.LineStyle = xlDashDot ' Bordure alternance de pointillés et de points
.LineStyle = xlDouble ' Double bordure
End With
Il est également possible de définir quelle bordure exactement nous souhaitons modifier en argument de l’objet Borders :
Range("a8").Borders(xlEdgeTop).LineStyle = xlContinuous ' Bordure supérieure
Range("a8").Borders(xlEdgeBottom).LineStyle = xlDash ' Bordure inférieure
Range("a8").Borders(xlEdgeLeft).LineStyle = xlDashDot ' Bordure gauche
Range("a8").Borders(xlEdgeRight).LineStyle = xlDouble ' Bordure droite
Il existe également les bordures xlDiagonalDown et xlDiagonalUp qui permettent de personnaliser les traits correspondant aux diagonales ainsi que xlInsideHorizontal et xlInsideVertical qui affectent respectivement les bordures horizontales et verticales de l’ensemble des cellules contenues dans la plage de cellules.
8. Quelques objets Range particuliers
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
______________________________________________
Comme nous l’avons déjà abordé dans les parties précédentes de ce chapitre dédié à la découverte de la gestion des cellules Excel dans VBA, celles-ci sont gérées par l’utilisation de l’objet Range, lequel désigne une cellule ou une plage de cellules.
Il est ainsi possible de créer un nouvelle objet Range auquel nous allons assigner une correspondance de cellules ce qui nous permettra d’intervenir facilement sur celles-ci : lecture ou modification de valeur, personnalisation de la mise en forme,…
Mais VBA dispose également de son lot d’objets préconfigurés qui correspondent à des cellules bien particulières que nous allons justement analyser dans cette partie.
8.1. Manipuler la plage des cellules sélectionnées : Selection
Le premier objet Range que nous aborderons ici est l’objet Selection.
Comme son nom l’indique, celui-ci permet d’agit sur la plage des cellules qui sélectionnées par l’utilisateur.
Par exemple, imaginons que celui-ci sélectionne les cellule C7 à D9 de la feuille de calcul active :
Nous pourrons très simplement agir sur celles-ci en utilisant les différentes propriétés et méthode de l’objet Selection :
Selection = "Coucou !"
Selection.Interior.ColorIndex = 12
Comme vous pouvez le constater, l’utilisation de Selection est strictement identique à celle des objets Range que nous avons déjà découvert dans les parties précédentes, à la seule différence qu’il n’est pas nécessaire de devoir instancier cette dernière.
Evidemment, lorsque la sélection est composée de plusieurs cellules, nous pouvons passer celles-ci en revue pour effectuer un traitement de masse :
Sub sommerLaSelection()
Dim c As Range, total As Integer
For Each c In Selection
total = total + c
Next
MsgBox "Le total de la sélection est de " & total
End Sub
Nous utilisons pour cela une boucle For Each, comme nous l’avons découvert dans un précédent chapitre.
Et pour passer chaque cellule de la sélection en revue l’une après l’autre, nous utilisons une nouvelle variable d’un type que n’a plus aucun secret pour nous : il s’agit évidemment d’un objet Range !
Nous pouvons également sélectionner manuellement une ou plusieurs cellules en utilisant la méthode Select
Sub sommerDeCellules()
Range("c7:c9").Select
sommerLaSelection
End Sub
8.2. Obtenir la cellule active : Activecell
Ensuite, nous pouvons intervenir sur la cellule active avec l’objet Activecell.
La cellule active correspond à la cellule sur laquelle l’utilisateur effectue le clic de la souris.
Lorsqu’une seule cellule est sélectionnée, les objets Selection et Activecell sont évidemment identiques.
En revanche lorsque plusieurs cellules sont sélectionnées, seule la première cellule à avoir été sélectionnée sera identifié par l’objet Activecell.
Nous pourrons alors remarquer que la cellule active est représentée différemment des autres cellules sélectionnées :
Sub identifierCelluleActive()
MsgBox "La cellule active est : " & ActiveCell.Address
End Sub
En effet nous remarquons ici que seule la première cellule est la cellule active.
Nous pouvons modifier celle-ci en appuyant sur la touche tabulation (ou Entrée) :
Ici la cellule active a bien été modifiée (passage de C7 à C8), alors que la sélection reste identique.
8.3. Cellule liée à un évènement : Target
Lorsque nous analysons un évènement intervenu sur une feuille de calcul, nous allons cette-ci pouvoir compter sur l’objet Range de VBA qui porte le nom de Target.
Ainsi par exemple pour récupérer les coordonnées des cellules sélectionnées, nous pourrons utiliser la macro évènementielle suivante :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
End Sub
Cet objet fonctionne ici comme l’objet Selection, nous pouvons ainsi sélectionner plusieurs cellules adjacentes :
Ou encore non adjacentes (en maintenant la touche Ctrl du clavier enfoncée) :
9. Copier et coller des cellules en VBA avec le presse-papier
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
______________________________________________
Dans cette nouvelle partie de ce chapitre de découverte de la gestion des cellules en VBA, nous allons découvrir comment réaliser automatiquement des copiers-collers en utilisant des macros commandes VBA.
Il s’agit en effet d’une des possibilités offertes par VBA qui permet de réaliser des actions extrêmement puissantes de manière totalement automatisée et qui amène par conséquent des gains de temps très importants dans le cadre de réalisations des tâches quotidiennes.
9.1. Copier ou couper les cellules
Pour copier une cellule, ou une plage composée de plusieurs cellules dans le presse-papier, nous utilisons simplement la méthode Copy de l’objet Range.
L’exemple suivant montre comment copier les cellules sélectionnées :
Sub copyCellulesSelectionnees()
Selection.Copy
End Sub
Par défaut, le contenu copier par la méthode Copy que nous venons d’utiliser va être inséré dans le presse-papier.
Mais il est également possible de l’insérer directement à un endroit au sein d’une feuille de calcul que nous précisons en utilisant l’argument « destination » de la méthode Copy.
Cet exemple montre comment dupliquer le contenu des cellules sélectionnées directement au niveau de la cellule A33 :
Sub copyCellulesSelectionnees()
Selection.Copy Destination:=[A33]
End Sub
Nous pouvons ainsi nous amuser à sélectionner différentes cellules puis à la dupliquer dans cette même cellule.
Lorsque nous requérons l’argument destination comme nous venons de le faire à l’instant, le contenu est alors dupliqué, sans utiliser le presse-papier.
Les cellules sélectionnées ne sont en effet pas identifiées par l’encadrement pointillé caractéristique des cellules copiées.
Pour couper une cellule, nous utilisons simplement la méthode Cut :
Sub couper()
Selection.Cut
[a33].Activate
ActiveSheet.Paste
End Sub
9.2. Coller des cellules
La méthode que nous venons de voir avec l’utilisation de l’argument « destination » permet de réaliser l’équivalent de deux opérations de manière simultanée : copier la ou les cellules sélectionnées, puis les coller à l’endroit spécifié.
Mais nous pouvons également décomposer cette tâche en deux opérations distinctes l’une de l’autre :
Sub copyCellulesSelectionnees()
Selection.Copy
ActiveSheet.Paste Destination:=[a33]
End Sub
Sachez également qu’étant donné que l’argument destination est le premier argument attendu par la méthode Paste, il n’est pas nécessaire de préciser à chaque fois le nom de celui-ci.
Nous pouvons ainsi raccourcir la macro de la manière suivante :
Sub copyCellulesSelectionnees()
Selection.Copy
ActiveSheet.Paste [a33]
End Sub
En réalité, l’argument destination de la méthode Paste n’est pas le seul argument qu’il est possible d’utiliser.
Il est en effet possible de mettre en place un lien entre la cellule source (à partir de laquelle le copiage est effectué) et la cellule active en utilisant l’argument link :
Sub copyCellulesSelectionnees()
Selection.Copy
[a33].Activate
ActiveSheet.Paste link:=True
End Sub
Dans cet exemple, nous insérons les valeurs des cellules sélectionnées au niveau de la cellule [a33], en insérant directement une référence comme formule de destination !
Ainsi le contenu de la cellule a33 est égal à la formule suivante :
=E28
Vous noterez au passage que nous ne pouvons pas utiliser les arguments destination et Link en même temps, il est donc nécessaire d’activer au préalable la cellule de destination avant d’effectuer le collage lié.
Ce cette manière, si nous modifions le contenu de la cellule d’origine (ici la cellule E28), la valeur affichée dans la cellule de destination (cellule active) sera également modifiée.
9.3. Collages partiels (uniquement la valeur, le format,…)
Parfois, nous souhaiterons effectuer uniquement un collage partiel des cellules sources.
Dans ce cas, nous utiliserons un collage spécial en utilisant la méthode PasteSpecial.
Cette méthode attend quatre arguments facultatifs qui détermineront le type de collage à réaliser :
- Paste : il s’agit de l’argument le plus important, qui permet de spécifier le type de collage à mettre en place. Cet argument peut prendre les valeurs suivantes (la liste n’est pas exhaustive, il s’agit des valeurs les plus utiles) :
o xlPasteAll : Coller tout le contenu copié. Revient à utiliser la méthode Paste.
o xlPasteValues : Coller uniquement les valeurs des cellules sources.
o xlPasteValuesAndNumberFormats : Coller les valeurs des cellules sources, ainsi que le format numérique mis en place sur ces cellules
o xlPasteFormulas : Coller uniquement les formules des cellules sources.
o xlPasteFormulasAndNumberFormats : Coller les formules des cellules sources, ainsi que le format numérique mis en place sur ces cellules
o xlPasteFormats : Coller uniquement le format des cellules sources, sans modifier le contenu de la cellule
o xlPasteValidation : Coller uniquement les validations de cellules
- Opération : permet d’effectuer des opérations lors de l’opération de collage en fonction du contenu des cellules copiées. Nous pouvons ainsi addictionner les valeurs des cellules (xlPasteSpecialOperationAdd), les multiplier (xlPasteSpecialOperationMultiply), les diviser (xlPasteSpecialOperationDivide), ou encore les soustraires (xlPasteSpecialOperationSubtract). Voir l’exemple en dessous pour modifier le signe d’un nombre.
- SkipBlanks : Permet de ne pas considérer les cellules vide de la plage copiée lors du collage
- Transpose : Permet d’intervertir les lignes et les colonnes lors du collage
Voici comment transformer les formules de cellules sélectionnées en valeurs numériques :
Sub transformerEnValeur()
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
End Sub
Dans cet exemple, nous modifions le sens des cellules sélectionnées en multipliant le contenu de celles-ci par -1 :
Sub changerSigne()
[f7].Copy
Selection.PasteSpecial operation:=xlPasteSpecialOperationMultiply
End Sub
Attention, ici nous allons automatiquement appliquer le format de la cellule copiée sur la cellule collée.
Pour éviter de perdre le format, il serait nécessaire d’utiliser les deux arguments Paste et Operaton
Dans ce dernier exemple, nous intervertissons les lignes et les colonnes :
Sub intervertirLignesColonnes()
Selection.Copy
[a33].PasteSpecial Transpose:=True
End Sub
9.4. Libérer la mémoire !
Enfin pour finir sachez qu’utiliser le presse-papier nécessite de conserver des informations en mémoire ce qui va donc occuper une place non négligeable de la mémoire.
Il convient de libérer cet espace mémoire en vidant le presse papier en définissant la propriété Application.CutCopyMode à false :
Sub viderPressePapier()
Application.CutCopyMode = False
End Sub
10. Autres moyens d’utiliser les cellules
Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !
______________________________________________
Dans les différentes parties précédentes de ce chapitre, nous avons découvert comment manipuler des cellules en VBA grâce à l’objet Range.
Nous allons maintenant découvrir une nouvelle possibilité qui permet de réaliser des opérations identiques, au travers de la propriété Cells, mais également avec l’appel raccourci de l’objet Range.
Vous verrez que lorsque vous aurez pris connaissance de l’existence de cette dernière possibilité d’appeler les cellules en VBA, vous ne pourrez plus utiliser l’objet Range tel que nous l’avons vu dans ce chapitre, tant le gain de temps va être important !
10.1. La propriété Cells()
En effet, la langage VBA offre deux possibilités pour intervenir sur une cellule située dans une feuille de calculs :
- Soit utiliser Range, ce qui maintenant ne devrait plus poser le moindre problème pour vous, si vous avez suivi les précédentes parties de ce chapitre, qui lui est spécialement dédié,
- Soit utiliser la propriété Cells, et c’est justement ce que nous allons découvrir dès maintenant
Les principales différences entre ces deux appels viennent du fait que Range peut permettre d’appeler une simple cellule, mais également une plage constituée de plusieurs cellules.
En revanche la propriété Cells ne permet d’appeler qu’une seule cellule, mais cet appel se fait de manière simplifiée.
En effet la propriété Cells attend deux arguments qui correspondent aux numéros de ligne et de colonne de la cellule concernée.
Ainsi ces différentes méthodes permettent de réaliser les mêmes opérations :
Sub utiliserCells() Range("a1").Select
Cells(1, 1).Select
End Sub
Nous pouvons même utiliser une lettre pour nommer une colonne dans la propriété Cells, comme nous le faisons habituellement avec l’objet Range :
Cells(2, "b").Select
Evidemment, cette lettre est alors à insérer en tant que second argument et saisie comme une chaîne de caractères, c’est-à-dire entre guillemets.
En réalité, et contrairement à ce que je vous annoncé juste avant, il existe une manière détournée d’utiliser la propriété Cells qui puisse appeler une plage de cellules.
Pour cela, nous allons alors utiliser la propriété Cells en tant qu’arguments de l’objet Range :
Range("a3:c3").Select
Range(Cells(3, 1), Cells(3, 3)).Select
Chaque propriété Cells correspond alors respectivement à la première et à la dernière cellule de la plage.
L’avantage de la propriété Cells que nous découvrons ici par rapport à l’objet Range c’est que nous allons pouvoir facilement passer en revue les différentes cellules de l’objet parent à partir duquel la propriété est appelée.
Dans cet exemple, nous souhaitons afficher dans le débuggeur les valeurs des différentes cellules de la première colonne :
Dim ligne As Integer
For ligne = 1 To 20
Debug.Print "Ligne " & ligne, Cells(ligne, 1)
Next
Comme nous l’avons vu en préambule, Cells est en réalité une propriété de l’objet Worksheet, là ou Range en est un sous-objet.
Cette propriété a pour but de retourner un objet Range. C’est pourquoi Range et Cells peuvent être utilisés de la même manière (avec les mêmes propriétés et méthode que celles de Range).
Mais nous pouvons tout aussi bien utiliser Cells en tant que propriété de l’objet Range.
Ainsi dans cet exemple nous allons afficher en notification la valeur de la cellule située sur la deuxième cellule sélectionnée par l’utilisateur :
Debug.Print Selection.Cells(1, 2)
Enfin, lorsque nous utilisons la propriété Cells(), sans argument, alors nous sélectionnons l’ensemble des cellules contenues dans l’objet parent.
De cette manière l’exemple suivant permet de sélectionner toutes les cellules contenues dans la feuille de calculs active :
ActiveSheet.Cells().Select
Notez dans ce cas que les parenthèses sont facultatives, nous pouvons également utiliser :
ActiveSheet.Cells.Select
De même inutile de spécifier la feuille active, car celle-ci est la feuille de travail utilisée par défaut par VBA :
Cells.Select
10.2. L’objet Range : le raccourcis
Vous avez surement pu vous apercevoir au cours des mes différents cours et tutoriels qu’il pouvait m’arriver d’utiliser une forme raccourcie pour appeler une cellule ou une plage de plusieurs cellules, sans même avoir besoin d’utiliser le terme Range !
Cette forme raccourcie consiste à utiliser les symboles d’encadrement dans lesquels nous insérons les coordonnées de la cellule ou des cellules correspondantes :
Msgbox Range("a1").value
Msgbox [a1].value
Ici, les coordonnées des cellules sont saisies directement comme des noms de variables, et non pas comme des chaînes de caractères.
C’est pour cela que nous saisissons directement celles-ci en tant que paramètre, sans utiliser d’apostrophes !
Cette forme permet également d’appeler plusieurs cellules :
[a1:c6].Select
Un autre intérêt de cette méthode de manipulation des cellules est que nous pouvons également utiliser des cellules nommées directement en saisissant leur nom :
Range("maPlageNommee").Select
[maPlageNommee].Select