Problem avec select case

ThomasR

XLDnaute Occasionnel
Bonjour le forum,

en voulant repondre a un poste j'ai fait une macro qui au depart me semblé tres simple avec l'utilisation de case mais qui au final est devenu un bidule :p .

en effet avec le select case j'ai une erreur

(rien de telle qu'une PJ).

je debut en select case donc pas trop de rire :whistle:

D'avance merci [file name=4colonnes_case.zip size=10513]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/4colonnes_case.zip[/file]
 

Pièces jointes

  • 4colonnes_case.zip
    10.3 KB · Affichages: 21

2passage

XLDnaute Impliqué
Bonjour,

Je crois que le problème c'est plutot... les next des for qui sont un peu parti en vacances, non ?

J'explique un peu : tu ne peux pas choisir ton lancement de boucle directement dans les 'case'. VBA comprend ca comme des Case et des Foor.. Next qui se croisent... Passe par une structure genre :

Code:
Select case
Case 1
 debut_boucle = xxx
 fin_boucle = yyy
Case 2
debut_boucle = xx
 fin_boucle = yy
end select

For y = debut_boucle to fin_boucle
...
next y

A+

Message édité par: 2passage, à: 13/07/2005 11:01
 

ThomasR

XLDnaute Occasionnel
re bonjour 2passage,

merci pour ton aide
effectivement il y a un next y en voyage (lol) mais ca marche tjours pas meme apres.

tu as réussi ?

j'ai ajouté le next y à ma PJ

mais j'ai toujours le même message case sans select case :pinch:

[file name=4colonnes_case_20050713110540.zip size=10072]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/4colonnes_case_20050713110540.zip[/file]
 

Pièces jointes

  • 4colonnes_case_20050713110540.zip
    9.8 KB · Affichages: 17

Hervé

XLDnaute Barbatruc
BOnjour thomas, 2passage

:)

pour les select case, essaye de basculer les thomasX dans un autre tableau et ensuite travaille sur ce nouveau tableau

Select Case toto
Case 1: tablo = thomas1
Case 3: tablo = thomas3
Case 5: tablo = thomas5
Case 7: tablo = thomas7
End Select

travaille en option base 1 car :

For y = LBound(thomas1) To UBound(thomas1)
....

For o = 3 To Cells(6000, y).End(xlUp).Row

va buguer, y=0 et cells(6000,0) n'existent pas

sinon, elle sert à quoi ta macro ?

salut
 

ThomasR

XLDnaute Occasionnel
bonjour Hervé,
rebonjour 2passage, le forum

Merci pour vos réponses, j'ai vu les mêmes problème au même moment

j'ai réctifier l'inversion j'ai voulu faire comme ca mais j'ai biensur une erreur y = 0

Code:
Sub thomas()
Dim toto As Byte
Dim y As Byte
Dim o As Integer
Dim compteur As Byte
Dim ligne2 As Byte
Dim i As Integer

Dim thomas As Variant

Dim thomas1 As Variant
Dim thomas2 As Variant
Dim thomas3 As Variant
Dim thomas4 As Variant
thomas1 = Array(3, 5, 7)
thomas2 = Array(1, 5, 7)
thomas3 = Array(1, 3, 7)
thomas4 = Array(1, 3, 5)


For toto = 1 To 7 Step 2
For i = 3 To Cells(6000, toto).End(xlUp).Row
Select Case toto
   Case 1
thomas = thomas1
  Case 3
 thomas = thomas2
   Case 5
thomas = thomas3
   Case 7
thomas = thomas4
 
  End Select
 For y = LBound(thomas) To UBound(thomas)

 For o = 3 To Cells(6000, y).End(xlUp).Row
 
  If Cells(i, toto).Value = Cells(o, y).Value Then compteur = 1
  Next o
  If compteur = 1 Then
  compteur = 0
  Else
  compteur = 0
  ligne2 = Sheets(1).Cells(6000, y).End(xlUp).Row + 1
  
  Sheets(1).Cells(ligne2, y).Value = Cells(i, toto).Value
  Sheets(1).Cells(ligne2, y).Select
  Selection.Font.ColorIndex = 3
  End If
 
  Next y
  Next i
  Next toto
  
  
  
    
    
End Sub
 

Hervé

XLDnaute Barbatruc
re

:)

comme je te le disais utilise option base 1

Un tableau commence son indexation à 0 en mettant en tete de module : option base 1, tu forces le tableau à s'indexer à 1.

ce type de macro ne se place pas dans un module thisworkbook, mais dans un module standard.


option base 1
Sub thomas()

Dim toto As Byte

Dim y As Byte

Dim o As Integer

Dim compteur As Byte

Dim ligne2 As Byte

Dim i As Integer

salut
 

ThomasR

XLDnaute Occasionnel
re bonjour,

le tableau avec la fonction LBound devrait commencer au debut de
thomas1 = Array(3, 5, 7)
thomas2 = Array(1, 5, 7)
thomas3 = Array(1, 3, 7)
thomas4 = Array(1, 3, 5)

donc 1 ou 3 pourquoi quand je fais thomas = thomas1 puis
LBound(thomas) j'ai 0 :pinch:

pour ta question a quoi sert cette maco

Lien supprimé

j'ai réussi à faire autrement mais le select case devait rendre mon code plus petit.

en tout cas merci pour tes info hervé.
mais quand je fait option base 1 plus d'erreur mais la macro je fais pas le tes voulu
 

Hervé

XLDnaute Barbatruc
re thomas

Je vais essayer d'etre pédagogue, :)

les lbound ou ubound permettent de trouver les limites inférieur et supérieur des tableaux, la limite inférieur est égale à 0.

pour mieux comprendre utilise l'exemple ci-joint :

Sub Bouton3_QuandClic()
Dim thomas As Variant
thomas = Array(3, 5, 7)
MsgBox 'La limite inférieur de thomas, est : ' & LBound(thomas) & vbNewLine & _
        'La limite supérieur de thomas, est : ' & UBound(thomas) & vbNewLine & _
        'La première valeur de thomas, est : ' & thomas(LBound(thomas)) & vbNewLine & _
        'La dernière valeur de thomas, est : ' & thomas(UBound(thomas))
'ou thomas(2)


End Sub


Si tu veux utiliser ces limites dans une boucle for to pour renvoyer les valeurs dans des cellules, tu va te faire coincer par le 0 de limite inférieur :

ce code ne fonctionne pas
Public Sub vev()
Dim thomas As Variant
thomas = Array(3, 5, 7)

For i = LBound(thomas) To UBound(thomas)
    Cells(i , 1) = thomas(i)
Next i
End Sub

Pour contrer ce problème, 2 méthodes soit on incrémente i de +1 :

Cells(i+1 , 1) = thomas(i)

Soit on utilise option base 1, ce qui va avoir pour effet de forcer l'indexation des valeurs du tableau en partant de 1 :

ce code fonctionne :
Option Base 1
Public Sub vev2()
Dim thomas As Variant
thomas = Array(3, 5, 7)

For i = LBound(thomas) To UBound(thomas)
    Cells(i, 1) = thomas(i)
Next i
MsgBox 'La limite inférieur de thomas, est : ' & LBound(thomas)
End Sub


OUF, j'espère que tout ceci te sera utile.

Salut
 

ThomasR

XLDnaute Occasionnel
re,

Merci Hervé, tu es un tres bon pédagogue, j'ai tout pigé :woohoo:

dans mon cas le probléme est résolu par

Code:
Option Base 1

Sub thomas()
Dim toto As Byte
Dim y As Byte
Dim o As Integer
Dim compteur As Byte
Dim ligne2 As Byte
Dim i As Integer

Dim thomas As Variant

Dim thomas1 As Variant
Dim thomas2 As Variant
Dim thomas3 As Variant
Dim thomas4 As Variant
thomas1 = Array(3, 5, 7)
thomas2 = Array(1, 5, 7)
thomas3 = Array(1, 3, 7)
thomas4 = Array(1, 3, 5)


For toto = 1 To 7 Step 2
For i = 3 To Cells(6000, toto).End(xlUp).Row
Select Case toto
   Case 1
thomas = thomas1
  Case 3
 thomas = thomas2
   Case 5
thomas = thomas3
   Case 7
thomas = thomas4
 
  End Select
 For y = LBound(thomas) To UBound(thomas)

 For o = 3 To Cells(6000, thomas(y)).End(xlUp).Row
 
  If Cells(i, toto).Value = Cells(o, thomas(y)).Value Then compteur = 1
  Next o
  If compteur = 1 Then
  compteur = 0
  Else
  compteur = 0
  ligne2 = Sheets(1).Cells(6000, thomas(y)).End(xlUp).Row + 1
  
  Sheets(1).Cells(ligne2, thomas(y)).Value = Cells(i, toto).Value
  Sheets(1).Cells(ligne2, thomas(y)).Select
  Selection.Font.ColorIndex = 3
  End If
 
  Next y
  Next i
  Next toto
  
  
  
    
    
End Sub
en fait je pensais que y etait = a Array(.,.,.,.) mais non y est = à l'index soit 0....donc 1 vu option 1.

mais pour utiliser les valeur il faut thomas(y) qui lui est egal a ce que je veux.

un grand merci car tu ma apris un truck hyper utile.
 

Statistiques des forums

Discussions
312 338
Messages
2 087 396
Membres
103 537
dernier inscrit
alisafred974