[VBA]Enregistrer userform dan onglet caché

Résolu
Bonjour,
Je débute le VBA, et j'aimerais savoir s'il était possible d'afficher un formulaire sans que la feuille, sur laquelle sont enregistrées les données du formulaire, ne s'affiche.
Par exemple, j'ai une feuille "accueil" et j'aimerais ouvrir un formulaire qui va enregistrer des données dans la feuille "production". Cependant, à chaque fois que j'ouvre le formulaire, je suis automatiquement redirigé sur la feuille "production", alors que je souhaite remplir le formulaire sur la feuille "accueil".
Cordialement,
Polhackov.

3 réponses

  1. Modérateur
    Bonjour,
    Dans le code de ton userform, tu dois avoir une (ou des) lignes de code ressemblant à : Sheets("production").Select ou Sheets("production").Activate
    Il faut remplacer tout cela par des blocs With End With, tant que tu utilises cette feuille, et ajouter des . devant les objets utilisés dans cette feuille.
    Exemple :
    Sheets("production").Select 
    ActiveSheet.Range("A1") = "coucou"
    Range("A2") = "Merci Pijaku"

    Sera à remplacer par :
    With Sheets("production")
        .Range("A1") = "coucou"
        .Range("A2") = "Merci Pijaku"
    End With 

    L'avantage de cette méthode est justement de pouvoir travailler sur des feuilles masquées...
    Si tu as des difficultés à adapter, mets nous ici tout ton code et on y jettera un oeil...
    1. C'est dans le Userform_Activate qu'il faut le mettre? J'ai essayé de remplacer dans mon code mais je ne vois pas où l'insérer et du coup ça ne fonctionne pas.

      Private Sub Userform_Activate()
      Dim enregistrement As Long
      Range("A2").Select
      T_DATE.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      CB_AGENT.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      CB_ACTIVITE.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      CB_SS_ACT.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      T_QUANTITE.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      CB_TEMPS.Text = ActiveCell()
      ActiveCell.Offset(0, 1).Select
      T_COMMENTAIRES.Text = ActiveCell()

      Range("A65536").Select
      Selection.End(xlUp).Select
      enregistrement = ActiveCell.Row
      ScrollBar1.Max = enregistrement
      ScrollBar1.Min = 2
      End Sub
      1. Modérateur
        Ce code, seul, n'est pas assez explicite.
        Peux tu, stp, soit nous communiquer une copie de ton classeur, sans données confidentielles, soit nous donner TOUT les codes VBA contenus dans ton classeur.
        Merci
      2. ' ******************** BOUTON AJOUTER ************************

        Private Sub B_AJOUTER_Click()
        If B_AJOUTER.Caption = "Ajouter" Then
        B_AJOUTER.Caption = "Valider"
        B_MODIFIER.Enabled = False
        B_SUPPRIMER.Enabled = False
        B_FERMER.Enabled = False
        T_DATE.Locked = False
        CB_AGENT.Locked = False
        CB_ACTIVITE.Locked = False
        CB_SS_ACT.Locked = False
        T_QUANTITE.Locked = False
        CB_TEMPS.Locked = False
        T_COMMENTAIRES.Locked = False
        ScrollBar1.Enabled = False

        B_FIRST.Enabled = False
        B_LAST.Enabled = False
        B_OK.Enabled = False
        B_RECHERCHER.Enabled = False

        T_DATE.Text = Date
        CB_AGENT.Text = ""
        CB_ACTIVITE.Text = ""
        CB_SS_ACT.Text = ""
        T_QUANTITE.Text = ""
        CB_TEMPS.Text = ""
        T_COMMENTAIRES.Text = ""
        Else
        B_AJOUTER.Caption = "Ajouter"
        B_MODIFIER.Enabled = True
        B_SUPPRIMER.Enabled = True
        B_FERMER.Enabled = True
        T_DATE.Locked = True
        CB_AGENT.Locked = True
        CB_ACTIVITE.Locked = True
        CB_SS_ACT.Locked = True
        T_QUANTITE.Locked = True
        CB_TEMPS.Locked = True
        T_COMMENTAIRES.Locked = True
        ScrollBar1.Enabled = True

        B_FIRST.Enabled = True
        B_LAST.Enabled = True
        B_OK.Enabled = True
        B_RECHERCHER.Enabled = True

        ScrollBar1.Max = ScrollBar1.Max + 1
        Range("A" & ScrollBar1.Max).Select
        ActiveCell.Value = DateValue(T_DATE.Text)
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_AGENT.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_ACTIVITE.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_SS_ACT.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = T_QUANTITE.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_TEMPS.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = T_COMMENTAIRES.Text
        ScrollBar1.Value = ScrollBar1.Max
        End If
        End Sub

        ' ******************** BOUTON FERMER ************************

        Private Sub B_FERMER_Click()
        End
        End Sub

        ' **************** BOUTON ALLER AU PREMIER ************************

        Private Sub B_FIRST_Click()
        ScrollBar1.Value = ScrollBar1.Min
        End Sub

        ' ***************** BOUTON ALLER AU DERNIER ************************

        Private Sub B_LAST_Click()
        ScrollBar1.Value = ScrollBar1.Max
        End Sub

        ' ******************** BOUTON MODIFIER ************************

        Private Sub B_MODIFIER_Click()
        If B_MODIFIER.Caption = "Modifier" Then
        B_MODIFIER.Caption = "Valider"
        B_AJOUTER.Enabled = False
        B_SUPPRIMER.Enabled = False
        B_FERMER.Enabled = False
        T_DATE.Locked = False
        CB_AGENT.Locked = False
        CB_ACTIVITE.Locked = False
        CB_SS_ACT.Locked = False
        T_QUANTITE.Locked = False
        CB_TEMPS.Locked = False
        T_COMMENTAIRES.Locked = False
        ScrollBar1.Enabled = False

        B_FIRST.Enabled = False
        B_LAST.Enabled = False
        B_OK.Enabled = False
        B_RECHERCHER.Enabled = False
        Else
        B_MODIFIER.Caption = "Modifier"
        B_AJOUTER.Enabled = True
        B_SUPPRIMER.Enabled = True
        B_FERMER.Enabled = True
        T_DATE.Locked = True
        CB_AGENT.Locked = True
        CB_ACTIVITE.Locked = True
        CB_SS_ACT.Locked = True
        T_QUANTITE.Locked = True
        CB_TEMPS.Locked = True
        T_COMMENTAIRES.Locked = True
        ScrollBar1.Enabled = True

        B_FIRST.Enabled = True
        B_LAST.Enabled = True
        B_OK.Enabled = True
        B_RECHERCHER.Enabled = True

        'enregistrement des modifications
        Range("A" & ScrollBar1.Value).Select
        ActiveCell.Value = DateValue(T_DATE.Text)
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_AGENT.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_ACTIVITE.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_SS_ACT.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = T_QUANTITE.Text
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = CB_TEMPS.Value
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = T_COMMENTAIRES.Text
        End If

        End Sub

        ' ****************** BOUTON VALIDATION ************************

        Private Sub B_OK_Click()
        If T_NUM > 65536 Or T_NUM < 1 Then
        tip = MsgBox("Veuillez saisir un numéro d'enregistrement dans les limites du tableur.", vbCritical + vbOKOnly, "Saisie hors champ")
        Else
        T_DATE.Text = Range("A" & T_NUM.Value).Select
        T_DATE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_AGENT.Text = Range("B" & T_NUM.Value).Select
        CB_AGENT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_ACTIVITE.Text = Range("C" & T_NUM.Value).Select
        CB_ACTIVITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_SS_ACT.Text = Range("D" & T_NUM.Value).Select
        CB_SS_ACT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_QUANTITE.Text = Range("E" & T_NUM.Value).Select
        T_QUANTITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_TEMPS.Text = Range("F" & T_NUM.Value).Select
        CB_TEMPS.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_COMMENTAIRES.Text = Range("G" & T_NUM.Value).Select
        T_COMMENTAIRES.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        End If
        End Sub

        ' ****************** BOUTON RECHERCHER ************************

        Private Sub B_RECHERCHER_Click()
        If B_OK.Visible = True Then
        B_OK.Visible = False
        L_NUM.Visible = False
        T_NUM.Visible = False
        T_NUM.Text = ""
        Else
        B_OK.Visible = True
        L_NUM.Visible = True
        T_NUM.Visible = True
        End If
        End Sub

        ' ******************** BOUTON SUPPRIMER ************************

        Private Sub B_SUPPRIMER_Click()
        bouton = MsgBox("Voulez-vous supprimer cet enregistrement?", vbYesNo + vbQuestion, "Suppression d'un enregistrement")
        If bouton = 6 Then
        Rows(ScrollBar1.Value & ":" & ScrollBar1.Value).Select
        Selection.Delete shift:=xlUp
        ScrollBar1.Max = ScrollBar1.Max - 1
        ScrollBar1.Value = ScrollBar1.Max
        End If
        End Sub

        ' ******************** SCROLLBAR ************************

        Private Sub ScrollBar1_Change()
        Range("A" & ScrollBar1.Value).Select
        T_DATE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_AGENT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_ACTIVITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_SS_ACT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_QUANTITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_TEMPS.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_COMMENTAIRES.Text = ActiveCell()
        End Sub

        ' ***************** FORMALISATION DU TEMPS ************************

        Private Sub CB_TEMPS_Change()
        Me.CB_TEMPS = Format(CB_TEMPS.Text, "hh:mm")
        End Sub

        Private Sub CB_TEMPS_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr("1234567890:", Chr(KeyAscii)) = 0 Then KeyAscii = 0
        End Sub

        ' **************** FORMALISATION DE LA DATE ************************

        Private Sub T_DATE_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr("1234567890/", Chr(KeyAscii)) = 0 Then KeyAscii = 0

        End Sub

        ' ***************** FORMALISATION DES PAGES ************************

        Private Sub T_NUM_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0

        End Sub

        ' **************** ACTIVATION DU FORMULAIRE ************************

        Private Sub Userform_Activate()
        Dim enregistrement As Long
        Range("A2").Select
        T_DATE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_AGENT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_ACTIVITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_SS_ACT.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_QUANTITE.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        CB_TEMPS.Text = ActiveCell()
        ActiveCell.Offset(0, 1).Select
        T_COMMENTAIRES.Text = ActiveCell()

        Range("A65536").Select
        Selection.End(xlUp).Select
        enregistrement = ActiveCell.Row
        ScrollBar1.Max = enregistrement
        ScrollBar1.Min = 2
        End Sub

        ' **************** INITIALISATION DU FORMULAIRE ****************

        Private Sub UserForm_Initialize()

        'Initialisation de la CB_AGENT sans suppression des doublons
        Dim Tablo() As String
        Dim Plage As Range, Cell As Range
        Dim i As Integer

        With Sheets("Accueil")
        Set Plage = .Range("B2:B" & .Range("B65536").End(xlUp).Row)
        End With

        ReDim Tablo(0 To Plage.Rows.Count - 1)
        For Each Cell In Plage
        Tablo(i) = Cell.Text
        i = i + 1
        Next
        Me.CB_AGENT.List = Tablo()

        'Initialisation de la CB_ACTIVITE avec suppression des doublons
        Dim j As Integer

        For j = 2 To Sheets("Accueil").Range("F65536").End(xlUp).Row
        CB_ACTIVITE = Sheets("Accueil").Range("F" & j)
        If CB_ACTIVITE.ListIndex = -1 Then CB_ACTIVITE.AddItem Sheets("Accueil").Range("F" & j)
        Next j

        'Initialisation de la CB_SS_ACT avec suppression des cases vides
        Dim k As Integer

        For k = 3 To Sheets("Accueil").Range("G65536").End(xlUp).Row
        CB_SS_ACT = Sheets("Accueil").Range("G" & k)
        If CB_SS_ACT.ListIndex = -1 Then
        If CB_SS_ACT.Text = "" Then

        Else
        CB_SS_ACT.AddItem Sheets("Accueil").Range("G" & k)
        End If
        End If
        Next k
    2. Modérateur
      Tu va sans doute me trouver lourd, mais je ne vois nulle part le mot production, ni aucunement de propriété visible réglée à true pour des feuilles.
      Je ne comprends donc toujours pas comment tu arrives sur la feuille "production".

      Bref, passons.
      Quel bouton t'envoie les données saisies dans le UserForm, dans ta feuille "production"?
      1. J'ai remplacé "production personnelle" par "production" dans mon explication pour être le plus concis possible.
        C'est le bouton ajouter et le bouton modifier qui peuvent accéder aux données sur ma feuille "production personnelle".
        Merci, de prendre du temps pour me répondre.
      2. Je viens de réussir à faire ce que je voulais. Merci pijaku de m'avoir accordé de ton temps et de m'avoir aiguillé.
        Il était bien question des sheets("production").activate et .visible à mettre en place. C'est quand même étrange parce que j'ai fait la même chose qu'hier, et, aujourd'hui, ça marche. Les mystères de la programmation...
      3. Modérateur
        Tant mieux. Mais je le répète, nulle part dans tes codes n'apparaissent les Sheets("production") etc...
        Donc...
        Tant mieux si cela fonctionne today!
        Bonne route
        A+