[VB] Boucle

Résolu/Fermé
Lydia - 29 avril 2005 à 10:20
 saad - 26 sept. 2007 à 15:19
Bonjour,

Je débute en VB et j'aimerais savoir s'il est possible de faire une boucle dans une déclaration de variables. En effet, j'ai fait un programme qui va chercher des données dans x feuilles Excel et plutôt que d'effectuer x fois la même opération pour chacune des feuilles Excel (en nommant les feuilles feuil1.cells(ligne, colonne) puis feuil2.cells(ligne, colonne)...), j'aimerais faire une boucle qui fasse l'opération une seule fois sur la feuille Excel d'intérêt que j'aurai trouvé au préalable et à laquelle j'aurai donné un indice k = à une valeur entière (feuilk.cells(ligne,colonne)). Le problème, c'est que mon programme boucle indéfiniment, alors que le k de la feuille Excel d'intérêt a déjà pris la valeur entière correspondant à son numéro de feuille. J'ai donc tenté quelques petites modif du genre Feuilk & "." & Cells(ligne, colonne), mais sans succès. Je fais donc appel à vos compétences pour sortir de ce casse-tête et je vous joins la partie de mon programme qui me pose problème :

'Cherche la feuille Excel k correspondant à la sélection ThèmeAlarme de l'utilisateur'
If ThemeAlarme.Text = "Air" Then
k = 1
End If
If ThemeAlarme.Text = "Apnée" Then
k = 2
End If
'... pour x feuilles Excel'

'Boucle cherche la 1ère case vide de la feuille k d'Excel'
Do
If IsEmpty(Feuilk & "." & Cells(j, 1)) Then
Exit Do
End If
j = j + 1
Loop

j = j - 1 'dernière case Excel non vide"

'Affichages de la rubrique MessageAlarme dépendant de la rubrique ThemeAlarme'
For i = 2 To j
MessageAlarme.AddItem (Feuilk & "." & Cells(i, 1))
Next i

Merci d'avance au petit génie qui m'aidera à résoudre mon problème...

9 réponses

Utilisateur anonyme
2 mai 2005 à 19:26
re:

Avec cette sub, vérifie que les noms de feuilles sont valide!

Cette sub créé une feuille et y place tous les nomd de feuilles!

Sub TestNomFeuille()

Dim CetteFeuille As Worksheet
Dim I As Integer

ActiveWorkbook.Sheets.Add.Name = "NomFeuille"

I = 1
For Each CetteFeuille In Worksheets
Sheets("NomFeuille").Cells(I, 1).Value = CetteFeuille.Name
I = (I + 1)
Next CetteFeuille

End Sub


Lupin
2
si themealarme est listbox
tu récuperes sa proprieté index attention
sans doute départ à 0
0
Excuse moi, mais étant une simple débutante en VB, je n'ai pas compris ta suggestion. Pour répondre à ton interoogation, ThemeAlarme est une combobox et non une listbox.

Peux-tu éclairer la lanterne d'une pauvre petite débutante en VB STP.

Merci d'avance.
0
Tu devrais plutot déclarer une variable
Dim Mafeuille as Worksheet

et pour l'affecter (à mettre après ta recherche de la feuille correspondant au thème de l'utilisateur)
set Mafeuille = ActiveWorkbook.Worksheet("Feuil" & k)

et apres a chaque fois que tu voudras t'en servir tu feras simplement Mafeuille.cells(....)

ca devrait etre bon normalement
0
par contre tet kil y'a un s a worksheet chais plus trop, donc ca donnerait

set Mafeuille = ActiveWorkbook.Worksheets("Feuil" & k)
0
Merci pour ta réponse FMAT !!!

Ca fait plaisir de pouvoir trouver de l'aide en prog en temps réel !!!

Par contre, j'ai suivi tes conseils et la ligne de prog
Set Mafeuille = ActiveWorkbook.Worksheets("Feuil" & k)
provoque un bug dans le programme. J'ai pourtant déclaré Mafeuil : Dim Mafeuille As Worksheets

J'ai essayé avec un s et sans s à worsheet, mais il y a toujours un bug... Je vais continuer à chercher pourquoi mon programme ne tourne toujours pas et en tout cas, je te remercie pour ton aide...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Armojax Messages postés 1860 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 2 octobre 2024 1 528
29 avril 2005 à 18:06
Bonjour Lydia,
Tu peux essayer ça :
Sub Boucle()

  Select Case ThemeAlarm_Text
  Case "Air"
    k = 1
  Case "Apnée"
    k = 2
  End Select
  
  Sheets("Feuil" & k).Select
  
  For i = 2 To Range(Cells(1, 1), Cells(1, 1)).End(xlDown).Row
    MessageAlarme.AddItem Cells(i, 1).Value
  Next i
  
End Sub

Ajx.
0
Salut Ajx,

Merci pour ton aide !!!

J'ai également suivi tes conseils qui m'ont été très utiles, surtout la partie concernant la valeur de mon indice k :
Select Case ThemeAlarme_Text
Case "Air"
k = 1
Case ...
End select

Par contre, la partie du programme qui sélectionne la bonne feuille Excel provoque un bug dans le programme que je ne sais pas résoudre :
Sheets("Feuil" & k).Select

J'ai donc essayé de déclarer une variable Mafeuille : Dim Mafeuille As Worksheets comme proposé par FMAT puis j'ai tenté un mélange de vos deux suggestions :
Set Mafeuille = ActiveWorkbook.Worksheets("Feuil" & k)
Ma feuille("Feuil" & k).Select

Mais là encore le programme ne fonctionne pas... Je vais donc chercher un peu plus en détail dans l'aide de VB pour tenter de trouver l'erreur. En tout cas, merci pour ton aide à bientôt peut-être si tu as une nouvelle suggestion.

Lydia.
0
Utilisateur anonyme
2 mai 2005 à 16:19
Salut,

Fait comme ceci :

Sub TestFeuille()

..Dim K As Integer
..Dim MaFeuille As Worksheet

..For K = 1 To 3
....Set MaFeuille = Worksheets("Feuil" & K)
....MsgBox MaFeuille.Name
..Next K

End Sub

Sous OXP, WXP ça roule très bien chez moi.

Lupin
0
Salut Arsène,

J'ai essayé ta suggestion dans mon programme :
For k = 1 To 24
Set MaFeuille = Worksheets("Feuil" & k)
MsgBox MaFeuille.Name
Next k

Mais il y a toujours un bug... Quand je disais que je débutais en VB...

En fait, les message d'erreurs sont les suivants :
Worksheets("Feuil" & k) = <l'indice n'appartient pas à la sélection>
et MaFeuille = nothing

Donc je ne sais pas si çà éclaire la lanterne d'un gentleman cambrioleur, en tout cas aucune ampoule n'est venue éclairer la mienne... Mais merci quand-même de ton aide...

Lydia.
0
Utilisateur anonyme
2 mai 2005 à 22:31
re:

en fait :
Worksheets("Feuil" & k) = <l'indice n'appartient pas à la sélection>

-->> que vaut [K] ?

Le message t'indique que tu tente de sélectionner une feuille qui n'existe pas !

Lupin
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
3 mai 2005 à 00:53
Salut,

J'ai vu ton souci et j'ai créer ce petit module pour une seule feuille et ça marche.
Il ne reste qu'à l'adapter à ton cas.

J'ai consideré dans mon module une seule feuille (donc k=1)

sub a()
Dim k as long, r as long
Dim i as long
k=1 ' donc la 1ere feuille
r=1 'initialisation de la variable ( on commence de la 1ere ligne)

Do
If IsEmpty(Sheets("feuil" & k).Cells(r,1)) Then
'on cherche dans la 1ere colonne
Exit Do
End If
r=r+1
Loop
MsgBox "numèro de ligne de la 1ere cell vide " & r

'on commence à la 1er ligne jusqu'à la dernière cellule non vide
For i=1 to r-1
'affiche le contenu des cellules non vides
MsgBox "contenu cells = " & Sheets("feuil" & k).Cells(i,1)
Next i
End Sub

Les MsgBox ne sont que pour tester.
Tu adaptes après à ton exercice :

MessageAlarme.AddItem Sheets("feuil" & k).Cells(i,1)

Je vais écrire encore une fois le module sans commentaires

-------------------------------------------------------------------
sub a()
Dim k as long, r as long
Dim i as long
k=1
r=1

Do
If IsEmpty(Sheets("feuil" & k).Cells(r,1)) Then
Exit Do
End If
r=r+1
Loop
MsgBox "numèro de ligne de la 1ere cell vide " & r

For i=1 to r-1
MsgBox "contenu cells = " & Sheets("feuil" & k).Cells(i,1)
Next i
End Sub
------------------------------------------------------------------
A+
0
est ce que cette boucle est juste ?sinon ou est le probléme? et merci
0