[Excel] [VBA] somme de cellules voisines
Kostorm
-
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 25847 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je pense que ce que je veux est assez simple, mais cela fait plus d'une heure que je tourne en rond dans mon code et j'aurais besoin d'un coup de pouce!
En fait j'ai une feuille excel avec 2 colonnes.
Dans la premiere du texte, dans la seconde des chiffres associés.
J'aimerais faire comme une mise en forme conditionnelle, mais qui se base non pas sur une valeur, mais sur un format, c'est à dire que si on met par exemple A1 C1 et E1 en Bleu, alors qu'il fasse la somme des cellules d'à côté dans une autre case.
Le problème est que je ne sais pas comment lui dire "la cellule d'à côté"
Enfin je pensais avoir trouver en changeant le numéro de colonne +1, mais le resultat qu'il m'affiche est très troublant :
Sub test2()
Dim Cellule As Range
Dim total As Variant
For Each Cellule In Range("A1:A100") ' La colonne Texte
'---------------------------------------------------------TEST------------------------------------------------
LigneDeLaCellule = Cellule.Row 'Pour être bien sûr de la ligne de la cellule en cours
ColonneDeLaCellule = Cellule.Column 'Pour être bien sûr de la colonne de la cellule en cours
ColonneDeLaCelluleVoisine = Cellule.Column + 1
CelluleDetaille = Cellule(LigneDeLaCellule, ColonneDeLaCellule)'Les coordonnées de la cellule en cours
CelluleVoisine = Cellule(LigneDeLaCellule, ColonneDeLaCelluleVoisine)'Les coordonnées de la cellule voisine
InverseCelluleDetaille = Cellule(ColonneDeLaCellule, LigneDeLaCellule)
InverseCellulevoisine = Cellule(ColonneDeLaCelluleVoisine, LigneDeLaCellule)
CelluleVoisineA2Theorique = Cellule(2, 2) 'Au moment ou il est sur A2, coordonnées de ce qu'il devrait m'afficher (B2)
CelluleVoisineA2Pratique = Cellule(1, 2) 'Voilà ce qu'il faut marquer pour avoir B2!
'---------------------------------------------------------TEST-------------------------------------------------
If Cellule.Interior.ColorIndex = 3 Then '3 est le code couleur du rouge
If IsNumeric(Cellule(ColonneDeLaCelluleVoisine, LigneDeLaCellule)) Then total = total + cellulevoisine
'Si le font du texte est rouge et que la cellule d'à côté est numérique alors on en fait la somme
'dans la variable Total
End If
Next
Range("G4") = total
End Sub
Et donc voilà les cellules voisines qu'il me trouve:
A2 il me trouve B3
A3 il me trouve B5
A4 il me trouve B7
??? Je ne comprend pas
Merci d'avance de votre aide
Je pense que ce que je veux est assez simple, mais cela fait plus d'une heure que je tourne en rond dans mon code et j'aurais besoin d'un coup de pouce!
En fait j'ai une feuille excel avec 2 colonnes.
Dans la premiere du texte, dans la seconde des chiffres associés.
J'aimerais faire comme une mise en forme conditionnelle, mais qui se base non pas sur une valeur, mais sur un format, c'est à dire que si on met par exemple A1 C1 et E1 en Bleu, alors qu'il fasse la somme des cellules d'à côté dans une autre case.
Le problème est que je ne sais pas comment lui dire "la cellule d'à côté"
Enfin je pensais avoir trouver en changeant le numéro de colonne +1, mais le resultat qu'il m'affiche est très troublant :
Sub test2()
Dim Cellule As Range
Dim total As Variant
For Each Cellule In Range("A1:A100") ' La colonne Texte
'---------------------------------------------------------TEST------------------------------------------------
LigneDeLaCellule = Cellule.Row 'Pour être bien sûr de la ligne de la cellule en cours
ColonneDeLaCellule = Cellule.Column 'Pour être bien sûr de la colonne de la cellule en cours
ColonneDeLaCelluleVoisine = Cellule.Column + 1
CelluleDetaille = Cellule(LigneDeLaCellule, ColonneDeLaCellule)'Les coordonnées de la cellule en cours
CelluleVoisine = Cellule(LigneDeLaCellule, ColonneDeLaCelluleVoisine)'Les coordonnées de la cellule voisine
InverseCelluleDetaille = Cellule(ColonneDeLaCellule, LigneDeLaCellule)
InverseCellulevoisine = Cellule(ColonneDeLaCelluleVoisine, LigneDeLaCellule)
CelluleVoisineA2Theorique = Cellule(2, 2) 'Au moment ou il est sur A2, coordonnées de ce qu'il devrait m'afficher (B2)
CelluleVoisineA2Pratique = Cellule(1, 2) 'Voilà ce qu'il faut marquer pour avoir B2!
'---------------------------------------------------------TEST-------------------------------------------------
If Cellule.Interior.ColorIndex = 3 Then '3 est le code couleur du rouge
If IsNumeric(Cellule(ColonneDeLaCelluleVoisine, LigneDeLaCellule)) Then total = total + cellulevoisine
'Si le font du texte est rouge et que la cellule d'à côté est numérique alors on en fait la somme
'dans la variable Total
End If
Next
Range("G4") = total
End Sub
Et donc voilà les cellules voisines qu'il me trouve:
A2 il me trouve B3
A3 il me trouve B5
A4 il me trouve B7
??? Je ne comprend pas
Merci d'avance de votre aide
A voir également:
- [Excel] [VBA] somme de cellules voisines
- Somme de plusieurs cellules excel - Guide
- Liste déroulante excel - Guide
- Somme si couleur excel - Guide
- Verrouiller cellules excel - Guide
- Word et excel gratuit - Guide
14 réponses
Du coup voilà mon code final pour ceux que ça interesse:
Sub SommeCouleurBleuclair()
Dim Cellule As Range
Dim total As Variant
For Each Cellule In Range("A1:A100") 'Plage de données à regarder
cellulevoisine = Cellule(1, 2)
If Cellule.Interior.ColorIndex = 41 Then '41 est le code couleur du bleu clair
If IsNumeric(cellulevoisine) Then total = total + cellulevoisine 'on additionne toutes les cellules voisine des cellules bleu clair
End If
Next
Range("G3") = total ' on affiche le resultat où on veut
End Sub
Sub SommeCouleurBleuclair()
Dim Cellule As Range
Dim total As Variant
For Each Cellule In Range("A1:A100") 'Plage de données à regarder
cellulevoisine = Cellule(1, 2)
If Cellule.Interior.ColorIndex = 41 Then '41 est le code couleur du bleu clair
If IsNumeric(cellulevoisine) Then total = total + cellulevoisine 'on additionne toutes les cellules voisine des cellules bleu clair
End If
Next
Range("G3") = total ' on affiche le resultat où on veut
End Sub
Salut,
Je ne vais pas retaper tout ton code, mais juste t'indiquer ce que tu as besoin.
Pour "voisiner" autour d'une cellule excel par VBA, il existe : Offset(ligne, colonne)
Sa syntaxe est facile :
A partir de la cellule active (celle que tu as sélectionné au préalable) :
Tu peux même combiner les 2 déplacements ex :
Cordialement,
-- Tout problème à sa solution. S'il n'y a pas de solution, ou est le problème? --
Je ne vais pas retaper tout ton code, mais juste t'indiquer ce que tu as besoin.
Pour "voisiner" autour d'une cellule excel par VBA, il existe : Offset(ligne, colonne)
Sa syntaxe est facile :
A partir de la cellule active (celle que tu as sélectionné au préalable) :
ActiveCell.Offset(1, 0): te renvoie la cellule située 1 ligne au dessous de celle qui est active
ActiveCell.Offset(-1, 0): te renvoie la cellule située 1 ligne au dessus de celle qui est active
ActiveCell.Offset(0, 1): te renvoie la cellule située 1 colonne à droite de celle qui est active
ActiveCell.Offset(-1, 0): te renvoie la cellule située 1 colonne à gauche de celle qui est active
Tu peux même combiner les 2 déplacements ex :
ActiveCell.Offset(-13, 120)--
Cordialement,
-- Tout problème à sa solution. S'il n'y a pas de solution, ou est le problème? --
Essaye :
Dim cellulevoisine As String
cellulevoisine = ActiveCell.Offset(0, 1).Value
MsgBox cellulevoisine
Dim cellulevoisine As String
cellulevoisine = ActiveCell.Offset(0, 1).Value
MsgBox cellulevoisine
Petite erreur à la ligne If isnumeric, en fait ma ligne est
If IsNumeric(Cellule(LigneDeLaCellule, ColonneDeLaCelluleVoisine)) Then total = total + cellulevoisine
Mais le resultat est le même (je fais en mode pas à pas et vérifie les valeurs de chaque variable à chaque fois)
If IsNumeric(Cellule(LigneDeLaCellule, ColonneDeLaCelluleVoisine)) Then total = total + cellulevoisine
Mais le resultat est le même (je fais en mode pas à pas et vérifie les valeurs de chaque variable à chaque fois)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je viens d'essayer cela:
TestCelluleVoisine = ActiveCell.Offset(0, 1)
Mais il ne me met aucune valeur, est ce normal?
TestCelluleVoisine = ActiveCell.Offset(0, 1)
Mais il ne me met aucune valeur, est ce normal?
Je viens d'essayer, le Msgbox est vide.
Il faut une librairie particulière?
Voilà ce que j'ai d'activé:
Microsoft excel 11.0 object library
Microsoft office 11.0 object library
Microsoft forms 2.0 object library
OLE automation
Visual Basic for applications
Il faut une librairie particulière?
Voilà ce que j'ai d'activé:
Microsoft excel 11.0 object library
Microsoft office 11.0 object library
Microsoft forms 2.0 object library
OLE automation
Visual Basic for applications
J'ai testé ActiveCell.Value , il me met vide egalement.
Je ne sais pas si il active la cellule ...
Et comment expliquer que cellule(lignedelacellule,colonnedelacellule) = PAS la cellule!
Je ne sais pas si il active la cellule ...
Et comment expliquer que cellule(lignedelacellule,colonnedelacellule) = PAS la cellule!
Je pense que je viens de trouver!
Le fait que tu m'ai parlé de déplacement m'a mis sur la voix.
Pour A2 il me trouve B3
Pour A3 il me trouve B5
Pour A4 il me trouve B7
En fait le cellule(ligne, colonne) doit ajouter le nombre "ligne" et le nombre "colonne" à cellule comme un offset!
Car en fait ma variable
CelluleVoisineA2Pratique = Cellule(1, 2)
Me donne toujours le bon resultat (B2 pour A2, B3 pour A3 ...)
Bien que je ne comprenne pas pourquoi ça n'est pas cellule(0,1) et que du coup je ne sait pas comment définir une cellule en dur!
Si quelqu'un a la réponse à ces interogations, je suis preneur!
Le fait que tu m'ai parlé de déplacement m'a mis sur la voix.
Pour A2 il me trouve B3
Pour A3 il me trouve B5
Pour A4 il me trouve B7
En fait le cellule(ligne, colonne) doit ajouter le nombre "ligne" et le nombre "colonne" à cellule comme un offset!
Car en fait ma variable
CelluleVoisineA2Pratique = Cellule(1, 2)
Me donne toujours le bon resultat (B2 pour A2, B3 pour A3 ...)
Bien que je ne comprenne pas pourquoi ça n'est pas cellule(0,1) et que du coup je ne sait pas comment définir une cellule en dur!
Si quelqu'un a la réponse à ces interogations, je suis preneur!
Bonjour,
Même si ta syntaxe marche tu devrais utiliser .offset() comme te l'a conseillé pijaku , ce qui est plus lisible.
eric
Même si ta syntaxe marche tu devrais utiliser .offset() comme te l'a conseillé pijaku , ce qui est plus lisible.
eric
Le soucis c'est que si je met cellulevoisine = ActiveCell.Offset(0, 1).Value, peut importe la cellule, cellulevoisine reste vide!
Hé bien c'est ce que m'avait indiqué pijaku.
En effet si je remplace activecell.offset(0,1) par cellule.offset(0,1) ça fonctionne!
Par contre sais tu ce que ça change concrettement cette synthaxe? plus rapide?
En tous cas merci à vous!
Ps: je vous invites desormais à m'aider sur un autre soucis VBa ! excel :
https://forums.commentcamarche.net/forum/affich-16854408-excel-vba
En effet si je remplace activecell.offset(0,1) par cellule.offset(0,1) ça fonctionne!
Par contre sais tu ce que ça change concrettement cette synthaxe? plus rapide?
En tous cas merci à vous!
Ps: je vous invites desormais à m'aider sur un autre soucis VBa ! excel :
https://forums.commentcamarche.net/forum/affich-16854408-excel-vba
Plus rapide je ne pense pas. C'est surtout que ta syntaxe m'était totalement inconnue, tandis qu'avec offset() on sait tout de suite à quoi tu veux faire référence.
pijaku te donnait des exemple de syntaxe, c'était à toi d'adapter. Activecell fait référence à la cellule active, cad celle qui est sélectionnée sur la feuille.
pijaku te donnait des exemple de syntaxe, c'était à toi d'adapter. Activecell fait référence à la cellule active, cad celle qui est sélectionnée sur la feuille.