Objet Cellule
L'objet cellule
Exemples de gestion de cellule à saisir dans la fenêtre exécution (Ctrl + g) :
' Sélectionner une cellule Range("A1").Select ' Sélectionner une cellule Cells(1,1).Select ' Soit numéro de ligne, numéro de colonne ' Sélectionner une cellule de manière relative ActiveCell.Offset (2,1).Select ' Désigne la cellule située 2 lignes plus bas (- pour plus haut) et une colonne à droite de la cellule active. ' Sélectionner une plage de cellule Range("A1:B12").Select ' Sélectionner une plage de cellules définie par un nom Range("maplage").Select ' Effacer le contenu d'une cellule Range("A2").ClearContents ' Sélectionner une feuille entière Cells.Select ' Effacer le contenu de toutes les cellules Cells.ClearContents ' Fusionner des cellule Range("A1:A5").Select Selection.MergeCells = True ' Nommer une plage de cellule Range("A4:B10").Name = "monNom" ' Récupérer le contenu de la cellule d'à côté Range("A1") = Cells(ActiveCell.Row, ActiveCell.Column + 1).Value ' Colorier une cellule (en jaune via une couleur simple ou une couleur de thème) avec le pot de peinture Selection.Interior.Color = 65535 Selection.Interior.ThemeColor = xlThemeColorAccent4 ' Récupérer le nom d'une cellule MaVariable = ActiveCelle.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Différence entre Select et Activate
Soit différence entre un Range("A1").Activate et un Range("A1").Select
Sheets(1).Range("B2").Activate est équivalent à sheets(1).Activate
Range("B2").Select
On ne peux pas "Activer" une plage de cellules. Par contre, on peux la "Sélectionner". Select permet de déclarer ce que l'on sélectionne. Activate permet de déclarer ce que l'on actives comme étant "ActiveCell" s'il s'agit d'une cellule.
Select permet d'afficher une feuille à l'écran et rien de plus, Activate définit la feuille dans laquelle on travailles.
Autrement dit, si une feuille "Feuil1" est affichée avant de lancer une procédure, la procédure 'Select' une nouvelle feuille mais la feuille active est toujours "Feuil1". Donc, si je fais un Range("A1").Select cela concerne Feuil1. Il faut faire un Sheets("nouvelle feuille").Range("A1").Select pour être tranquille.
L'idéal est de toujours définir Sheets("nom de la feuille").Cells() ou Sheets("nom de la feuille").Range()
Soit différence entre un Range("A1").Activate et un Range("A1").Select
Sheets(1).Range("B2").Activate est équivalent à sheets(1).Activate
Range("B2").Select
On ne peux pas "Activer" une plage de cellules. Par contre, on peux la "Sélectionner". Select permet de déclarer ce que l'on sélectionne. Activate permet de déclarer ce que l'on actives comme étant "ActiveCell" s'il s'agit d'une cellule.
Select permet d'afficher une feuille à l'écran et rien de plus, Activate définit la feuille dans laquelle on travailles.
Autrement dit, si une feuille "Feuil1" est affichée avant de lancer une procédure, la procédure 'Select' une nouvelle feuille mais la feuille active est toujours "Feuil1". Donc, si je fais un Range("A1").Select cela concerne Feuil1. Il faut faire un Sheets("nouvelle feuille").Range("A1").Select pour être tranquille.
L'idéal est de toujours définir Sheets("nom de la feuille").Cells() ou Sheets("nom de la feuille").Range()
Sub proc_premiere_lettre_en_majuscule()
'Pour Agnès de l'INRA
Dim lg_nbcar As Long
'mettre la première lettre du texte d'une cellule en majuscule
lg_nbcar = Len(Range("A1").Value)
Range("A1").Value = UCase(Left(Range("A1").Value, 1)) & Right(Range("A1").Value, lg_nbcar - 1)
End Sub
'Pour Agnès de l'INRA
Dim lg_nbcar As Long
'mettre la première lettre du texte d'une cellule en majuscule
lg_nbcar = Len(Range("A1").Value)
Range("A1").Value = UCase(Left(Range("A1").Value, 1)) & Right(Range("A1").Value, lg_nbcar - 1)
End Sub
Sub proc_Ecrire_dans_la_première_cellule_vide()
Range("A1").Select
Selection.End(xlDown).Select ' soit Ctrl + Flêche bas
ActiveCell.Offset(1, 0).Select ' déplacement
ActiveCell.Value = "Saisie supplémentaire" End Sub
Range("A1").Select
Selection.End(xlDown).Select ' soit Ctrl + Flêche bas
ActiveCell.Offset(1, 0).Select ' déplacement
ActiveCell.Value = "Saisie supplémentaire" End Sub
Sub proc_Numero_Cellule_Active()
' le numéro de la ligne de la cellule active
Range("A1").Value = ActiveCell.Row
End Sub
-------------------
Sub proc_Trouve_La_Cellule_Active()
' je récupère la valeur de la cellule active
If Cells(ActiveCell.Row, ActiveCell.Column).Value = "bonjour" Then
Cells(ActiveCell.Row, ActiveCell.Column).Interior.ColorIndex = 6
End If
End Sub
---------------------
Sub proc_Trouve_La_Cellule_Qui_Contient_Un_Mot()
' Déclaration de 2 variables objet
Dim UneCellule As Range
Dim MaPlage As Range
'Initialisation
Set MaPlage = Range("A1:E50")
' Pour chaque cellule dans ma plage
For Each UneCellule In MaPlage
' si une cellule contient la chaîne bonjour
If UneCellule = "bonjour" Then
' elle devient jaune
UneCellule.Interior.ColorIndex = 6
End If
Next
End Sub
' le numéro de la ligne de la cellule active
Range("A1").Value = ActiveCell.Row
End Sub
-------------------
Sub proc_Trouve_La_Cellule_Active()
' je récupère la valeur de la cellule active
If Cells(ActiveCell.Row, ActiveCell.Column).Value = "bonjour" Then
Cells(ActiveCell.Row, ActiveCell.Column).Interior.ColorIndex = 6
End If
End Sub
---------------------
Sub proc_Trouve_La_Cellule_Qui_Contient_Un_Mot()
' Déclaration de 2 variables objet
Dim UneCellule As Range
Dim MaPlage As Range
'Initialisation
Set MaPlage = Range("A1:E50")
' Pour chaque cellule dans ma plage
For Each UneCellule In MaPlage
' si une cellule contient la chaîne bonjour
If UneCellule = "bonjour" Then
' elle devient jaune
UneCellule.Interior.ColorIndex = 6
End If
Next
End Sub
Attention, ci-dessus, UneCellule est sensible à la casse
Sub proc_mise_en_forme_conditionelle()
' A appeler dans la feuille de code de Feuil1 avec un Change (procédure evènementielle)
If Cells(1, 1) = LCase("bonjour") Then 'si la cellule 1 contiens la chaîne "bonjour"
Cells(1, 1).Interior.ColorIndex = 10 'on la remplie de jaune
Else
Cells(1, 1).Interior.ColorIndex = 0 'sinon, on vide la couleur de remplissage
End If
' et autant de If Then que l'on veut...
If Cells(1, 1) = LCase("hello") Then
Cells(1, 1).Interior.ColorIndex = 5
Else
Cells(1, 1).Interior.ColorIndex = 0
End If
' Exemple d'appel distant
' Code de Feuil1 avec un Change, soit procédure evènementielle):
Private Sub Worksheet_Change(ByVal Target As Range)
mise_en_forme_conditionelle
End Sub
' A appeler dans la feuille de code de Feuil1 avec un Change (procédure evènementielle)
If Cells(1, 1) = LCase("bonjour") Then 'si la cellule 1 contiens la chaîne "bonjour"
Cells(1, 1).Interior.ColorIndex = 10 'on la remplie de jaune
Else
Cells(1, 1).Interior.ColorIndex = 0 'sinon, on vide la couleur de remplissage
End If
' et autant de If Then que l'on veut...
If Cells(1, 1) = LCase("hello") Then
Cells(1, 1).Interior.ColorIndex = 5
Else
Cells(1, 1).Interior.ColorIndex = 0
End If
' Exemple d'appel distant
' Code de Feuil1 avec un Change, soit procédure evènementielle):
Private Sub Worksheet_Change(ByVal Target As Range)
mise_en_forme_conditionelle
End Sub
Sub proc_Atteindre_La_Premiere_Cellule_Vide()
Dim i As Byte
i = 1
' Tans que les cellules de la colonne sont pleine, on avance
While Cells(i, 1) <> ""
i = i + 1 ' A ne pas oublier sinon boucle infini
Wend
' et on saisie un texte dans la première cellule
' qui ne remplie pas la condition du while
Cells(i, 1) = "Coucou"
'Eventuellement, on sélectionne la ligne correspondante
Rows(i).Select
End Sub
Dim i As Byte
i = 1
' Tans que les cellules de la colonne sont pleine, on avance
While Cells(i, 1) <> ""
i = i + 1 ' A ne pas oublier sinon boucle infini
Wend
' et on saisie un texte dans la première cellule
' qui ne remplie pas la condition du while
Cells(i, 1) = "Coucou"
'Eventuellement, on sélectionne la ligne correspondante
Rows(i).Select
End Sub
Sub proc_Atteindre_La_Premiere_Cellule_Vide2()
Dim mavar As Byte
' Attention, avec xlDown, on doit partir d'une cellule pleine!
mavar = Cells(1, 1).End(xlDown).Row + 1
'On sélectionne la ligne correspondante
Rows(mavar).Select
'Ou bien on sélectionne la cellule correspondante Cells(mavar,1).Select
End Sub
Dim mavar As Byte
' Attention, avec xlDown, on doit partir d'une cellule pleine!
mavar = Cells(1, 1).End(xlDown).Row + 1
'On sélectionne la ligne correspondante
Rows(mavar).Select
'Ou bien on sélectionne la cellule correspondante Cells(mavar,1).Select
End Sub
Sub proc_recup_donnees_par_rapport_a_un_nom() ' Objectif : ' Créer un nouveau tableau à partir de données qui se trouvent dans une matrice. ' Une sorte de rechecheV par le VBA Dim MaCellule As Range ' Cellule qui permet de chercher Dim MaPlage As Range 'Plage de recherche Dim i As Integer 'Compteur ' Définition de la plage de recherche Set MaPlage = Range("A1:A10") i = 2 ' Initialisation du compteur 'Pour chaque cellule de ma plage For Each MaCellule In MaPlage 'Si MaCellule contient le mot Paul If MaCellule = "Paul" Then ' Ce nom devient un titre de colonne Range("D1").Value = UCase(MaCellule.Value) Range("D1").Interior.ColorIndex = 6 Range("D1").Font.Bold = True 'On récupère la valeur de la colonne d'à côté ' et on la met ailleurs (ici dans la colonne D) Range("D" & i).Value = MaCellule(1, MaCellule.Column + 1).Value i = i + 1 End If Next MaCellule End Sub
"Si la cellule d'une feuille est modifiée alors activer une autre macro", on doit utiliser une procédure évènementielle (dans le module d'une feuille) qui test un changement dans la feuille :
' Déclaration d'une variable objet de type plage (à saisir en dehors de la procédure) Public maplage As Range Private Sub Worksheet_Change(ByVal Target As Range) ' Le paramètre Target, qui correspond à la cellule active, ' est une variable objet que l'on doit utiliser. 'Initialisation de notre variable objet Set maplage = Range("A1:A10") 'Si on est en dehors de la plage If Application.Intersect(Target, maplage) Is Nothing Then Exit Sub 'on quitte cette procédure Else ' Sinon, on appel une procédure distante proc_distante End If End Sub
Sub proc_compte_nombre_de_cellule_remplie() Dim int_nbreDeLigne As Integer int_nbreDeLigne = 9 Range("A10").Formula = "=CountA(A1:A" & int_nbreDeLigne & ")" End Sub
Sub proc_evenementielle_cellule_obligatoire()
'Si cellule pas remplie, alors pas possible d'enregistrer
' A réaliser dans la feuille de code ThisWorkBook
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Application.Sheets("S1").Range("B4").Value = "" Then
Cancel = True
MsgBox "Enregistrement annulé"
End If
End Sub