Easy-Micro

ESPACEMEMBRE VBA
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()

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

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

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

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

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

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

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
Pour réaliser une macro qui dirait :
"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
> voir les Astuces de Michel pour d'autres exemple VBA sur les cellules.
< Page précédente VBA Page suivante >