Rechercher : dans
Par :

[VB] Boucle

Dernière réponse le 26 sep 2007 à 15:19:12 Lydia, le 29 avr 2005 à 10:20:13 
 Signaler ce message aux modérateurs

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...

Meilleures réponses pour « [VB] Boucle » dans :
Firefox bloque les boucles de redirection VoirProblème Comment faire pour que Firefox tienne compte des boucles de redirection ? Solution La configuration de Firefox limite parfois le nombre de redirection enchainées, ce qui génère cette erreur. Pour ne pas avoir ce problème il faut modifier...
ADSL - Le dégroupage de la boucle locale VoirIntroduction au dégroupage de la boucle locale On appelle "boucle locale" la partie finale de la ligne téléphonique arrivant à l'abonné. Afin de vous faire profiter de l'internet à haut débit (ADSL), les Fournisseurs d'Accès à Internet (FAI)...

1

random, le 29 avr 2005 à 11:55:50

Si themealarme est listbox
tu récuperes sa proprieté index attention
sans doute départ à 0

Répondre à random

2

Lydia, le 29 avr 2005 à 15:37:12

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.

Répondre à Lydia

3

FMAT, le 29 avr 2005 à 17:13:03

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

Répondre à FMAT

4

FMAT, le 29 avr 2005 à 17:16:22

Par contre tet kil y'a un s a worksheet chais plus trop, donc ca donnerait

set Mafeuille = ActiveWorkbook.Worksheets("Feuil" & k)

Répondre à FMAT

6

Lydia, le 2 mai 2005 à 11:23:34

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...

Répondre à Lydia

5

Armojax, le 29 avr 2005 à 18:06:42

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.

Répondre à Armojax

7

Lydia, le 2 mai 2005 à 11:36:52

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.

Répondre à Lydia

8

Lupin.Arsene, le 2 mai 2005 à 16:19:09

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
~L'essentiel est invisible pour les yeux~
~On ne voit bien qu'avec le coeur~

Répondre à Lupin.Arsene

9

Lydia, le 2 mai 2005 à 18:53:37

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.

Répondre à Lydia

10

Lupin.Arsene, le 2 mai 2005 à 19:26:28
  • +1

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
~L'essentiel est invisible pour les yeux~
~On ne voit bien qu'avec le coeur~

Répondre à Lupin.Arsene

11

Lupin.Arsene, le 2 mai 2005 à 22:31:17

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
~L'essentiel est invisible pour les yeux~
~On ne voit bien qu'avec le coeur~

Répondre à Lupin.Arsene

12

lami20j, le 3 mai 2005 à 00:53:46

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+

Répondre à lami20j

13

 saad, le 26 sep 2007 à 15:19:12

Est ce que cette boucle est juste ?sinon ou est le probléme? et merci

Répondre à saad