1ers essais de code d'un débutant VBA- demande correction et indications

cristobal61

XLDnaute Nouveau
Bonjour,

Totalement novice en VBA, je cherche pour l'instant à réaliser des opérations très simples en VBA, en m'inspirant de l'enregistreur de macro ou l'aide en ligne : ceci dans le simple but de me familiariser avec les notions et structures de code les plus basiques.

Dans le cas présent, l'objectif est le suivant :
Pour chaque cellule d'une plage donnée (d'une même colonne):
- inscription du mot "Présent" dans la cellule voisine (à droite)
- coloration des 2 cellules en jaune (celle de la plage initiale + celle qui contient le mot "Présent")
- Positionnement de la cellule active sur la 1ère ligne sous la plage de cellules sélectionnée à l'origine.

Après quelques bidouillages et tâtonnements de débutant, voici le code qui me permet de réaliser à peu près l'objectif (à la condition cellule active près) : je me doute bien qu'il est très loin d'être fonctionnel et est très perfectible...
J'aimerais voir ce qu'il devient lorsqu'il passe entre les mains d'un chevronné du VBA.

Merci à qui prendra le temps de m'en donner une version un peu moins brouillonne.

Code:
Sub Jaune_Présent()
    Selection.Select
    With Selection.Interior
        .ColorIndex = 36
        .Pattern = xlSolid
    End With
    
    Selection.Offset(0, 1).Select
    Selection.FormulaR1C1 = "Présent"
    With Selection.Interior
        .ColorIndex = 36
        .Pattern = xlSolid
    End With
    
    ActiveCell.Offset(1, -1).Select

End Sub
 

Dranreb

XLDnaute Barbatruc
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Bonjour,
Vous avez une bonne démarche.
L'enregistreur est très efficace pour trouver les méthodes qui permettent les mêmes manipulations d'objet que sous Excel, l'aide vous permet d'en trouver d'autres et aussi des manoeuvres purement VBA.
Par ailleurs la manipulation par excel passe inévitablement par des sélections, lesquelles sont rarement nécessaires. Surtout la première ! je me demande même par quelle manoeuvre vous l'avez obtenue ?
Code:
    Selection.Offset(0, 1).Select
    Selection.FormulaR1C1 = "Présent"
    With Selection.Interior
        .ColorIndex = 36
        .Pattern = xlSolid
    End With    
    ActiveCell.Offset(1, -1).Select
pourrait se contracter en:
Code:
    With Selection.Offset(0, 1)
        .FormulaR1C1 = "Présent"
        .Interior.ColorIndex = 36
        .Interior.Pattern = xlSolid
    End With    
    ActiveCell.Offset(1, 0).Select
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Bonjour le fil :),
Ma proposition d'optimisation en tenant compte des postulats de départ :p
VB:
Sub Jaune_Présent()
'Pour chaque cellule d'une plage donnée
Dim Cellule As Range
'(d'une même colonne):
If Selection.Columns.Count > 1 Then Exit Sub
For Each Cellule In Selection
'- inscription du mot "Présent" dans la cellule voisine (à droite)
Cellule.Offset(0, 1) = "Présent"
'- coloration des 2 cellules en jaune (celle de la plage initiale + celle qui contient le mot "Présent")
Range(Cellule, Cellule.Offset(0, 1)).Interior.ColorIndex = 36
Next
'- Positionnement de la cellule active sur la 1ère ligne sous la plage de cellules sélectionnée à l'origine.
Cells(Selection.Row + Selection.Count, Selection.Column).Select
End Sub
Bonne journée :cool:
 

ROGER2327

XLDnaute Barbatruc
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Bonjour à tous
Ainsi, peut-être ?
VB:
Sub Jaune_Présent()
    With Selection(1)
      With .Resize(, 2).Interior
        .ColorIndex = 36
        .Pattern = xlSolid
      End With
      .Offset(0, 1).Value = "Présent"
      .Offset(1, 0).Select
    End With
End Sub
ROGER2327
#4967


Vendredi 27 Gueules 138 (Saint Tabagie, cosmogène, SQ)
3 Ventôse An CCXIX
2011-W08-1T14:56:49Z
 

cristobal61

XLDnaute Nouveau
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Merci pour vos réponses, qui sont toutes trois fort instructives pour moi.
Je ne raisonnais auparavant que sur la sélection entière, mais l'idée de travailler cellule par cellule comme proposé par JNP me paraît effectivement plus judicieuse.

La proposition de ROGER2327 demande une adaptation pour répondre à mon souhait initial : en l'état, seule la 1ère ligne de la plage sélectionnée est traitée. J'y réfléchis... Néanmoins, elle me fait découvrir la propriété resize, qui me semble assez pratique.

J'y retourne... Merci de m'avoir aidé, je reviendrai peut-être (probablement) vous voir d'ici peu au fil de mes expérimentations.
 

cristobal61

XLDnaute Nouveau
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Re,
Je souhaite à présent mettre en place une petite macro permettant de retirer le formatage sur une plage de cellules donnée, selon les instructions suivantes :
- retirer formatage (colorindex uniquement) de toutes les cellules de la sélection,
- effacer uniquement les valeurs des cellules de la sélection appartenant à la colonne D, à l'exclusion de toute autre. Si la sélection ne couvre pas la colonne D, cette 2nde condition devient sans objet.

Comment puis-je formuler cette 2ème condition ?

Code:
Sub Efface_CouleurDeFond()
    Selection.Interior.ColorIndex = xlNone
' [cellules de la sélection contenues dans la colonne D].select    
    Selection.ClearContents
End Sub

Peut-être avec la propriété resize ?
Merci à qui saura m'éclairer.
 

cristobal61

XLDnaute Nouveau
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Merci JNP,

Une fois qu'on nous souffle la solution, ça paraît si évident...
Je ne connaissais pas la méthode Intersect, mais c'est exactement ce que je cherchais vainement depuis mon dernier post.

Merci beaucoup, bonne soirée aussi.
 

cristobal61

XLDnaute Nouveau
Re : 1ers essais de code d'un débutant VBA- demande correction et indications

Si JNP est toujours dans les parages...
Ta suggestion marche bien quand la sélection inclut des cellules de la colonne D.
En revanche, j'obtiens un message d'erreur dans le cas contraire...
Y a t-il quelque chose à indiquer pour préciser que cette instruction doit être ignorée quand la plage sélectionnée n'inclut pas de cellules de la colonne D ?

Merci d'avance.
 

Statistiques des forums

Discussions
312 163
Messages
2 085 860
Membres
103 006
dernier inscrit
blkevin