[Excel] [VBA] somme de cellules voisines

Fermé
Kostorm - 3 mars 2010 à 09:49
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 3 mars 2010 à 16:01
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
A voir également:

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
2
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
3 mars 2010 à 09:56
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) :
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? --
1
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
3 mars 2010 à 10:02
Essaye :
Dim cellulevoisine As String
cellulevoisine = ActiveCell.Offset(0, 1).Value
MsgBox cellulevoisine
1
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)
0

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?
0
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
0
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!
0
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!
0
Merci pijaku!
(Vachement réactif!)
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
3 mars 2010 à 12:15
Bonjour,

Même si ta syntaxe marche tu devrais utiliser .offset() comme te l'a conseillé pijaku , ce qui est plus lisible.
eric
0
Le soucis c'est que si je met cellulevoisine = ActiveCell.Offset(0, 1).Value, peut importe la cellule, cellulevoisine reste vide!
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
3 mars 2010 à 14:44
Et pourquoi tu mets activecell alors que ta référence c'est cellule ?
cellule.offset(..., ...)
0
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
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
3 mars 2010 à 16:01
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.
0