Choisir feuille via checkbox (variable sheets

Résolu
lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   -  
lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Voilà que j'ai pratiquement terminé mon documents mais je bloque sur la dernière étape.
Voila', je me sers d'un userform pour aller chercher des infos dans d'autres feuilles... ça fonctionne une feuille à la fois mais si je veux choisir la feuille ou aller chercher les infos à afficher dans ma lisbox selon le checkbox choisi..ça fonctionne pas..Si quelqu'un a une idée..
Je sais que mon problème vient surement de ma déclaration de variable...
C'est pour le userform

Voici mon code et je joins mon fichier

Option Explicit

Private Sub checkbox_Change()
Dim sCd As Worksheet ' s pour Sheets et Cd pour crédit
Dim sCd1 As Worksheet
Dim sCd2 As Worksheet
Dim sCd3 As Worksheet
Set sCd = worksheets("RBC") ' détermine que S pour sheet et Cd veut dire Feuille RBC
Set sCd1 = worksheets("OR")
Set sCd2 = worksheets("Affaire")
Set sCd3 = worksheets("Lancy")
If CheckBox_RBC = True Then
worksheets = sCd
If CheckBox_Affaire = True Then
worksheets = sCd1
If CheckBox_or = True Then
worksheets = sCd2
If CheckBox_lancy = True Then
worksheets = sCd3

With ListBox1
.ColumnCount = 7
.ColumnWidths = "45 pt;35 pt;70 pt;60 pt;30 pt;55 pt;35pt"
.Clear
LabelInfo.Caption = " Les dates doivent être comprises entre le ''" _
& worksheets.Range("A2").Value & "'' et le ''" & worksheets.Range("A1000").End(xlUp).Rows & "''."

DTPicker_Du.Value = worksheets.Range("A2")
DTPicker_Au.Value = worksheets.Range("A1000")
End With
End If
End Sub
Private Sub DTPicker_Du_Change()

DTPicker_Du.MinDate = worksheets.Range("A2")
DTPicker_Du.MaxDate = worksheets.Range("A1000").End(xlUp).Rows

End Sub
Private Sub DTPicker_Au_Change()

Dim x As Range

ListBox1.Value = Format(ListBox1, "yyyy-mm-jj")
ListBox1.Clear

With ListBox1
For Each x In worksheets.Range("A2:A" & Range("A1000").End(xlUp).Row)
If x.Value >= DTPicker_Du.Value And x.Value <= DTPicker_Au.Value Then
.AddItem x(1, 1)
.List(.ListCount - 1, 1) = x(1, 2)
.List(.ListCount - 1, 2) = x(1, 3)
.List(.ListCount - 1, 3) = x(1, 4)
.List(.ListCount - 1, 4) = x(1, 5)
.List(.ListCount - 1, 5) = x(1, 6)
.List(.ListCount - 1, 6) = x(1, 7)
End If
Next x
End With

End Sub

https://www.cjoint.com/?BDxumLgYMFn

5 réponses

  1. Paf
     
    Re,

    quelques modifications:
    avec les checkbox on peut sélectionner tout ou rien; si rien il faut gérer la sortie; si tout, il faut gérer la récupération dans chaque feuille sélectionnée.
    j'ai donc remplacé par des optionbutton
    dans le change de chaque optionbutton: Call MajForm ce qui évite d'avoir à cliquer quelque part sur la Userform pour déclencher l'action
    MajForm est une sub qui remplace la Sub Userform_click() ( à supprimer)
    Private Sub MajForm()
    Dim x
    
    If OptionButton1.Value = True Then nomfeuille = "RBC"
    If OptionButton2.Value = True Then nomfeuille = "Affaire"
    If OptionButton3.Value = True Then nomfeuille = "OR"
    If OptionButton4.Value = True Then nomfeuille = "Lancy"
    
    LabelInfo.Caption = "Les dates doivent être comprises entre le " _
    & Worksheets(nomfeuille).Range("A2").Value & " et le " & Worksheets(nomfeuille).Range("A1000").End(xlUp).Rows & "."
    
    DTPicker_Du.Value = Worksheets(nomfeuille).Range("A2")
    DTPicker_Au.Value = Worksheets(nomfeuille).Range("A1000").End(xlUp).Rows
    
    With ListBox1
    .Clear
    .Value = Format(ListBox1, "yyyy-mm-jj")
    .Clear
    .ColumnCount = 7
    .ColumnWidths = "45 pt;35 pt;70 pt;60 pt;30 pt;55 pt;35pt"
    .Clear
    
    For Each x In Worksheets(nomfeuille).Range("A2:A" & Range("A1000").End(xlUp).Row)
        If x.Value >= DTPicker_Du.Value And x.Value <= DTPicker_Au.Value Then
            .AddItem x(1, 1)
            .List(.ListCount - 1, 1) = x(1, 2)
            .List(.ListCount - 1, 2) = x(1, 3)
            .List(.ListCount - 1, 3) = x(1, 4)
            .List(.ListCount - 1, 4) = x(1, 5)
            .List(.ListCount - 1, 5) = x(1, 6)
            .List(.ListCount - 1, 6) = x(1, 7)
        End If
    Next x
    
    End With
    
    End Sub

    j'ai supprimé les End If reportés en fin de sub qui étaient mal placés au niveau logique ; s'il n'y a qu'une action sur la même ligne que then on peut s'en affranchir.

    J'ai déclaré la variable nomfeuille en public pour qu'elle soit visible des différentes sub qui en ont besoin (DTPicker_Au_Change(), DTPicker_Du_Change() ).
    Dans ces sub il faut penser à modifier les worksheets.Range .

    Par ailleurs il faut vérifier :
    que dans les feuilles (RBC, Affaires....) les lignes commencent bien en ligne 2
    qu'il n'y ait pas de ligne vide insérée
    que les lignes soient dans l'ordre chronologique :

    Je pense avoir fais le tour ?

    Bonne suite ou à +
    1
  2. Paf
     
    bonsoir,
    sans avoir éplucher le code, je note:

    tu ne dois pas utiliser worksheets comme nom de variable puisque c'est un mot réservé VBA .
    la syntaxe pour utiliser worksheets est worksheets(index de la feuille) ou worksheets("nom de la feuille") ou worksheets(variable contenant le nom de la feuille)

    tu devrais avoir, par exemple,après déclaration de la variable NomFeuille en string:
    ...
    If CheckBox_RBC = True Then
    NomFeuille = "RBC"
    If CheckBox_Affaire = True Then
    NomFeuille = "Affaire"
    If CheckBox_or = True Then
    NomFeuille = "Or"
    If CheckBox_lancy = True Then
    NomFeuille = "Lancy"
    ...
    ...
    DTPicker_Du.Value = worksheets(NomFeuille).Range("A2") 
    ...


    bonne suite
    0
  3. lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   4
     
    Bonjour

    merci pour le tuyau! ça me semble plein de logique.. Je ne comprends pas pourquoi ça ne fonctionne pas?!

    Option Explicit

    Private Sub Userform_click()
    Dim nomfeuille As String

    With ListBox1
    .ColumnCount = 7
    .ColumnWidths = "45 pt;35 pt;70 pt;60 pt;30 pt;55 pt;35pt"
    .Clear
    If CheckBox_RBC.Value = True Then
    nomfeuille = "RBC"
    If CheckBox_Affaire.Value = True Then
    nomfeuille = "Affaire"
    If CheckBox_or.Value = True Then
    nomfeuille = "OR"
    If CheckBox_lancy.Value = True Then
    nomfeuille = "Lancy"

    LabelInfo.Caption = " Les dates doivent être comprises entre le ''" _
    & worksheets(nomfeuille).Range("A2").Value & "'' et le ''" & worksheets(nomfeuille).Range("A1000").End(xlUp).Rows & "''."

    DTPicker_Du.Value = worksheets(nomfeuille).Range("A2")
    DTPicker_Au.Value = worksheets(nomfeuille).Range("A1000")
    End If
    End If
    End If
    End If
    End With
    End Sub
    Private Sub DTPicker_Du_Change()
    Dim nomfeuille As String

    If CheckBox_RBC = True Then
    nomfeuille = "RBC"
    If CheckBox_Affaire = True Then
    nomfeuille = "Affaire"
    If CheckBox_or = True Then
    nomfeuille = "Or"
    If CheckBox_lancy = True Then
    nomfeuille = "Lancy"

    DTPicker_Du.MinDate = worksheets(nomfeuille).Range("A2")
    DTPicker_Du.MaxDate = worksheets(nomfeuille).Range("A1000").End(xlUp).Rows
    End If
    End Sub
    Private Sub DTPicker_Au_Change()

    Dim x As Range
    Dim nomfeuille As String

    If CheckBox_RBC = True Then
    nomfeuille = "RBC"
    If CheckBox_Affaire = True Then
    nomfeuille = "Affaire"
    If CheckBox_or = True Then
    nomfeuille = "Or"
    If CheckBox_lancy = True Then
    nomfeuille = "Lancy"

    ListBox1.Value = Format(ListBox1, "yyyy-mm-jj")
    ListBox1.Clear

    With ListBox1
    For Each x In worksheets(nomfeuille).Range("A2:A" & Range("A1000").End(xlUp).Row)
    If x.Value >= DTPicker_Du.Value And x.Value <= DTPicker_Au.Value Then
    .AddItem x(1, 1)
    .List(.ListCount - 1, 1) = x(1, 2)
    .List(.ListCount - 1, 2) = x(1, 3)
    .List(.ListCount - 1, 3) = x(1, 4)
    .List(.ListCount - 1, 4) = x(1, 5)
    .List(.ListCount - 1, 5) = x(1, 6)
    .List(.ListCount - 1, 6) = x(1, 7)
    End If
    Next x
    End With
    End If
    End If
    End If
    End If
    End Sub
    Private Sub ListBox1_Change()
    Dim i As Byte
    Dim cible As Integer
    Dim Resultat As Double

    cible = ListBox1.ListCount

    For i = 1 To cible
    Resultat = Resultat + ListBox1.List(i - 1, 4)
    Next

    TextBox4.Value = Resultat
    End Sub

    Private Sub CommandButton2_Click()

    End

    End Sub
    0
  4. lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   4
     
    Bonjour

    encore merci! toutefois je ne vois pas :
    dans le change de chaque optionbutton: Call MajForm ce qui évite d'avoir à cliquer quelque part sur la Userform pour déclencher l'action

    le change ?? C'est une propriété.. je vois pas ça?

    merci à l'avance
    Mélanie
    0
    1. Paf
       
      bonsoir,
      je n'ai pas été clair sur ce coup!

      chaque objet dispose d'évènements dont change; tu l'as utilisé à plusieurs reprises : Private Sub ListBox1_Change(), Private Sub DTPicker_Au_Change(), Private Sub DTPicker_Du_Change(), et dans ton premier post : Private Sub checkbox_Change()

      C'est la même chose pour les Optionbutton:
      Private Sub OptionButton4_Change()
          Call MajForm
      End Sub
      
      Private Sub OptionButton3_Change()
          Call MajForm
      End Sub
      
      Private Sub OptionButton2_Change()
          Call MajForm
      End Sub
      
      Private Sub OptionButton1_Change()
          Call MajForm
      End Sub


      A+
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lanetmel Messages postés 200 Date d'inscription   Statut Membre Dernière intervention   4
     
    Bonsoir!

    Un énorme merci! Désolé je suis pas vite vite des fois... je commence alors des fois je cherche trop loin! C'est pas toujours compliqué!

    encore merci ça fonctionne à merveille!

    Mélanie
    0