Affichage SHAPES dans un boucle
Bonjour,
Je sais afficher une shapes selon une condition mais je n'arrive à le répéter dans un boucle, je n'ai beaucoup de connsaissance en VBA.
Je m'explique :
- J'ai un ensemble de noeud (insertion d'un shape ellipse sur un graphique) allant de 0 à n (j'ai nommé tout mes noeud Ni)
- J'ai un ensemble de connecteurs allant de 1 à m (j'ai nommé tout mes connecteurs Ai)
- J'ai une matrice xij binaire de dimension (n,n) qui représente un trajet entre deux noeuds
Si x[1,3] = 1, je veux que le trajet de 1 à 3 soit afficher, le trajet est composé de plusieurs connecteur
(voir fichier exemple)
-J'ai un tableau qui m'indique que tel trajet correspond à tel connecteur
Exemple : Le trajet 13 correspond aux connecteur A8 et A9 (voir fichier exemple)
J'aimerai une réaliser une macro qui :
1) Masque tout mes noeuds et tout mes connecteurs, pour le moment j’utilise :
Sub MasquerObj()
With Sheets("Affichage")
For Each sh In .Shapes
For i = 1 To 18
If sh.Name = "A" & i Then J'aimerai pouvoir mettre les << "N"&i >> aussi
sh.Visible = False
Exit For
End If
Next i
Next sh
End With
End Sub
2) Qui m'affiche les connecteur selon la valeur de xij et la table des connecteurs
J'ai commencé, mais je bloque (je ne vois pas comment appeler la table)
Sub Affichage()
Dim i As Integer
Dim j As Integer
Dim n As Integer
n = 10
For i = 1 To n
For j = 1 To n
If Cells(i + 3, j + 11).Value = 1 Then
'La je bloque ...
End If
Next j
Next i
End Sub
3) Qui m'affiche les noeuds utilisé, un noeud est utilisé si la somme sur un ligne de xij est >0
Merci d'avance pour votre aide
Je ne suis p-e pas très clair...
Bonjour,
Quelques petits aménagements à voir sur ta feuille, et 2 plages nommées à voir dans le Gestionnaire de noms.
Private Sub cbAffich_Click()
Dim sh As Shape, Xij, Trj, i%, j%, k%
Application.ScreenUpdating = False
For Each sh In Me.Shapes
sh.Visible = False
Next sh
cbAffich.Visible = True
Xij = [Tblxij].Value
For i = 0 To 8
For j = i + 1 To 9
If Xij(i + 1, j) = 1 Then
Trj = Trj & ";" & i & j
Me.Shapes(CStr(i)).Visible = msoTrue
Me.Shapes(CStr(j)).Visible = msoTrue
End If
Next j
Next i
With [Lstxij]
Trj = Split(Trj, ";"): j = 1
For i = 1 To UBound(Trj)
Do While j <= .Rows.Count
If .Cells(j, 1) = CStr(Trj(i)) Then
k = 2
Do While .Cells(j, k) <> ""
Me.Shapes("A" & .Cells(j, k)).Visible = msoTrue
k = k + 1
Loop
j = j + 1
Exit Do
End If
j = j + 1
Loop
Next i
End With
End SubCordialement.
Bonjour,
Merci beaucoup MFerrand,
J'ai juste un petit problème, lorsque j'ouvre votre fichier joint je tombe sur un page excel grisé et je ne vois pas rien du tout ?
Est-ce normal ? Je peux lancer la macro mais rien ne s'affiche
Merci pour votre code,
Vous avez créé xij et Trij directement sur la feuille excel c'est ça ?
Merci d'avance
Lalalathuile
Re-bonjour,
Non c'est bon, ça à marché au bout du 4 ème téléchargement ,
ça à l'air de bien fonctionner, merci beaucoup.
Juste pour les x[i,j] et tu as remplis que la partie haute de la matrice ceux je comprend, ce que je comprend.
Mais dans mon cas le solveur me comme résultat des x[i,j] dans l'ensemble de la matrice, tu saurais passé
de la matrice des x[i,j] que j'avais envoyé à celle que tu as créé ?
Merci d'avance,
Lalalathuile
J'ai nommé deux plages :
L4:T12 => Tblxij
K16:K60 => Lstxij
Pour la matrice, j'ai occulté la partie qui ne sert pas. En effet, ce que tu détermines avec des 1, ce sont des combinaisons de 2 éléments parmi 10, ce qui en fait 45 qui sont listées au-dessous.
J'ai effectivement supprimé du tableau matrice la dernière ligne et une colonne à gauche. Tu peux les rétablir, mais la plage nommée doit correspondre à la plage sans ces colonne et ligne. De même, les 1 ne doivent être que dans la zone laissée blanche, si tu veux que la macro fonctionne.
Cordialement.
D'accord,
Je crois que j'ai à peu près compris le code.
Juste il y un différence entre true et msotrue ?
J'ai vu que tu avais retiré un ligne et colonne pour les xij mais lorsque je détermine mes xij à l'aide d'un solveur, le solveur me les renvoie sous la forme que j'ai mise dans le premier fichier, j'aimerai pouvoir passer la matrice de la matrice que le solveur à généré à celle que tu as créé par une macro et je ne sais pas trop comment faire mais je vais bien trouve une solution.
Je vais pouvoir mettre dans résolue, comment ont fait ?
Merci beaucoup, ça m'aide énormément
Lalathuile
msoTrue parce que l'assistant me le met sans que j'ai à le taper !
Pour résolu tu cliques sur la coche que tu es seul à avoir, puisque émetteur du sujet.