[VB] Boucle

Résolu
Lydia -  
 saad -
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

  1. Utilisateur anonyme
     
    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
  2. random
     
    si themealarme est listbox
    tu récuperes sa proprieté index attention
    sans doute départ à 0
    0
    1. Lydia
       
      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
  3. FMAT
     
    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
  4. FMAT
     
    par contre tet kil y'a un s a worksheet chais plus trop, donc ca donnerait

    set Mafeuille = ActiveWorkbook.Worksheets("Feuil" & k)
    0
    1. Lydia
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Armojax Messages postés 1863 Date d'inscription   Statut Membre Dernière intervention   1 529
     
    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
    1. Lydia
       
      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
  7. Utilisateur anonyme
     
    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
    1. Lydia
       
      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
  8. Utilisateur anonyme
     
    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
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  10. saad
     
    est ce que cette boucle est juste ?sinon ou est le probléme? et merci
    0