Conflit entre deux Userform

Bonjour,

voici l'erreur : La méthode select de la worksheets a échoué

Pris séparément mes deux Userform fonctionnent bien.

Userform1 qui sert à la saisie de données et Userform2 qui permet l'identification au lancement de l'application après la saisie d'un mot de passe (Workbook_Open).

Vu que c'est la première fois que j'utilise les userform, il est clair que je n'ai pas tout compris. d'autant que j'ai encore trois userform à réaliser pour terminer l'application permettant une petit gestion d'association.

Dans l'attente merci pour votre aide.

Au lancement de l'application

Option Explicit  'Activation de la déclaration explicite des variables
Dim Ws As Worksheet  'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de cet UserForm

Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    Sheets("Tables").Visible = False
    Sheets("Historiquegestion").Visible = False
    Sheets("Cadencier boissons chiffré").Visible = False
    Sheets("Inventaire Stock Fin année").Visible = False
    Sheets("Tableau Remb.Frais").Visible = False
    Sheets("fiche situation membres").Visible = False
    Sheets("Grd.Livre").Visible = False
    Sheets("Compte résultat").Visible = False
    Sheets("Relevé Bancaire").Visible = False
    Sheets("Recettes").Visible = False
    Sheets("Charges").Visible = False
    Sheets("Caisse Manifestations").Visible = False
    Sheets("Caisse Journalière").Visible = False
    Sheets("Journal suivi Chéquiers ").Visible = False
    Sheets("Explication Bilan").Visible = False
    Sheets("Menu").Visible = True
    Sheets("Menu").Select

    Load UserForm2
    UserForm2.Show

End Sub

Après l'affichage de l'Userform2, sélection de l'opérateur à partir d'une Combobox, saisie MP et validation et accès à certaines feuilles suivant autorisation.

Private Sub CommandButton1_Click()
    Dim mpass As Variant
    Dim Identifiant As String
    Dim xligne, ok As Integer
    Dim ok As Integer

    mpass = UserForm2.TextBox1.Value

    Identifiant = UserForm2.ComboBox1.Value
    xligne = 2
    ' les indentifiants
    ' *****************
    ' Président
    ' Trésorier
    ' Directeur Sportif
    ' Secrétaire
    ' membre comité
    ' membre autorisé
    '
    ' MP = ex : 769115, 250001, 895623,265123,123456,100001

    ' ***********************************
    ' Liste des feuilles de la gestion
    ' ***********************************
    ' Caisse Journalière
    ' Caisse Manifestations
    ' Charges
    ' Recettes
    ' Relevé Bancaire
    ' Compte résultat
    ' Grd.Livre
    ' fiche situation membres
    ' Fiches permanences
    ' Journal suivi Chéquiers
    ' Tableau Remb.Frais
    ' Inventaire Stock Fin année
    ' Cadencier boissons chiffré
    ' Feuille relevé stock boissons
    ' Tables
    ' Historiquegestion
    ' Explication Bilan
    Sheets("Tables").Select
    ok = 0
    ' accès président
    If Range("E8").Value = Val(mpass) And Worksheets("Tables").Range("D8") = Identifiant Then
            Sheets("Historiquegestion").Visible = True
            Sheets("Cadencier boissons chiffré").Visible = True
            Sheets("Inventaire Stock Fin année").Visible = True
            Sheets("Tableau Remb.Frais").Visible = True
            Sheets("fiche situation membres").Visible = True
            Sheets("Grd.Livre").Visible = True
            Sheets("Feuille relevé stock boissons").Visible = True
            Sheets("Compte résultat").Visible = True
            Sheets("Relevé Bancaire").Visible = True
            Sheets("Recettes").Visible = True
            Sheets("Charges").Visible = True
            Sheets("Caisse Manifestations").Visible = True
            Sheets("Caisse Journalière").Visible = True
            Sheets("Explication Bilan").Visible = True
            Sheets("Journal suivi Chéquiers ").Visible = True
            ok = 1
    End If
    ' accès trésorier
    If Range("E9").Value = Val(mpass) And Worksheets("Tables").Range("D9") = Identifiant Then
            ' Sheets("Historiquegestion").Visible = True
            Sheets("Cadencier boissons chiffré").Visible = True
            Sheets("Inventaire Stock Fin année").Visible = True
            Sheets("Feuille relevé stock boissons").Visible = True
            Sheets("Tableau Remb.Frais").Visible = True
            Sheets("fiche situation membres").Visible = True
            Sheets("Grd.Livre").Visible = True
            Sheets("Compte résultat").Visible = True
            Sheets("Relevé Bancaire").Visible = True
            Sheets("Recettes").Visible = True
            Sheets("Charges").Visible = True
            Sheets("Caisse Manifestations").Visible = True
            Sheets("Caisse Journalière").Visible = True
            Sheets("Explication Bilan").Visible = True
            Sheets("Journal suivi Chéquiers ").Visible = True
            ok = 1
    End If
    ' accès directeur sportif
    If Range("E10").Value = Val(mpass) And Worksheets("Tables").Range("D10") = Identifiant Then
            Sheets("Inventaire Stock Fin année").Visible = True
            Sheets("Tableau Remb.Frais").Visible = True
            Sheets("fiche situation membres").Visible = True
            Sheets("Feuille relevé stock boissons").Visible = True
            ok = 1
    End If
    ' accès secrétaire
    If Range("E11").Value = Val(mpass) And Worksheets("Tables").Range("D11") = Identifiant Then
            Sheets("Inventaire Stock Fin année").Visible = True
            Sheets("Tableau Remb.Frais").Visible = True
            Sheets("fiche situation membres").Visible = True
            Sheets("Feuille relevé stock boissons").Visible = True
            Sheets("Explication Bilan").Visible = True
            Sheets("Grd.Livre").Visible = True
            Sheets("Compte résultat").Visible = True
            ok = 1
    End If
    ' accès membre comité
    If Range("E12").Value = Val(mpass) And Worksheets("Tables").Range("D12") = Identifiant Then
            Sheets("Inventaire Stock Fin année").Visible = True
            Sheets("Tableau Remb.Frais").Visible = True
            Sheets("fiche situation membres").Visible = True
            Sheets("Feuille relevé stock boissons").Visible = True

            ok = 1
    End If
    ' accès membre autorisé
    If Range("E13").Value = Val(mpass) And Worksheets("Tables").Range("D13") = Identifiant Then
            ok = 1
    End If
    If ok = 1 Then
        ' enregistrement de l'accès dans historique
        Sheets("Historiquegestion").Visible = True
        Sheets("Historiquegestion").Select
        yligne = Range("B9500").End(xlUp).Row + 1
        Cells(yligne, 2) = Identifiant
        Cells(yligne, 3) = Date
        Cells(yligne, 4) = "Accès"
        Cells(yligne, 6) = "Heure : " & Time
        Sheets("Tables").Select
        If Identifiant <> "Président" Then
            Sheets("Historiquegestion").Visible = False
        End If
    Else
        ' enregistrement de l'accès dans historique
        Sheets("Historiquegestion").Visible = True
        Sheets("Historiquegestion").Select
        yligne = Range("B9500").End(xlUp).Row + 1
        Cells(yligne, 2) = Identifiant
        Cells(yligne, 3) = Date
        Cells(yligne, 4) = "Echec Accès"
        Cells(yligne, 5) = "MP " & mpass
        Cells(yligne, 6) = "Heure : " & Time
        Sheets("Tables").Select
        Sheets("Historiquegestion").Visible = False
    End If
    Sheets("Tables").Visible = False
    Sheets("Menu").Select
    Sheets("Menu").Unprotect "769115"
    Cells(4, 2) = "Bonjour " & Identifiant
    Sheets("Menu").Protect "769115"
    Unload UserForm2
End Sub

Private Sub UserForm_Initialize()
' Call UserAcces

Sheets("Tables").Visible = True
Sheets("Tables").Select
Dim c10 As Variant
' Combobox avec liste des noms et prenoms
For Each c10 In Range("D8:D" & [D20].End(xlUp).Row)
  UserForm2.ComboBox1.AddItem c10
Next c10
Sheets("Menu").Select
End Sub

Userform1 permettant la saisie, en cliquant sur un bouton l'appel de la saisie se fait à partir de cette Macro

Sub saisieCJ()
'
' SaisieCJ Macro
' charge userform
Load userform1
userform1.Show
'
End Sub
Option Explicit  'Activation de la déclaration explicite des variables
Dim Ws As Worksheet  'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de cet UserForm

Private Sub CommandButton2_Click()
    'Correspond au programme du bouton QUITTER

    Unload userform1
    'Unload => Permet de fermer l'Userform et de l'effacer de la mémoire, les valeurs de ses contrôles sont à alors perdues.
    ' Me => Référence à l'objet en cours
    Sheets("Menu").Select
End Sub
' annaluation et historisation de la ligne
Private Sub CommandButton3_Click()
  ' Initialise les variables
    Dim Dligne As Integer
    Dim ColorLigne As Integer
    Dim Mbillard As Integer
    Dim MBar As Integer
    Dim MCours As Integer
    Dim MRepas As Integer
    Dim MOffert As Integer
    Dim MVerse As Integer
    Dim RestePayer As Integer
    Dim NPiece As String
    Dim NomPrenom As String
    Dim Observation As String
    Dim DateJ As Date
    Dim NChq As String
    Dim ModeP As String
    Dim rep As String

    ' selectionne la feuille
    Sheets("Caisse Journalière").Select
    ' Derniere ligne saisie du fichier
    Dligne = Range("E9500").End(xlUp).Row
    If Cells(Dligne, 18) = "Annulé" Then
        Exit Sub
    End If

    If Me.TextBox4.Value <> "" Then
        MBar = Cells(Dligne, 12)
        MBar = MBar * -1
    End If
    If Me.TextBox5 <> "" Then
        Mbillard = Cells(Dligne, 11)
        Mbillard = Mbillard * -1
    End If
    If Me.TextBox7 <> "" Then
        MCours = Cells(Dligne, 13)
        MCours = MCours * -1
    End If
    If Me.TextBox6 <> "" Then
        MRepas = Cells(Dligne, 14)
        MRepas = MRepas * -1
    End If
    If Me.TextBox8 <> "" Then
        MOffert = Cells(Dligne, 15)
        MOffert = MOffert * -1
        End If
    If Me.TextBox9 <> "" Then
        MVerse = Cells(Dligne, 17)
        MVerse = MVerse * -1
    End If
    NPiece = Cells(Dligne, 5)
    NomPrenom = Cells(Dligne, 6)
    Observation = Cells(Dligne, 7)
    DateJ = Cells(Dligne, 8)
    NChq = Cells(Dligne, 9)
    ModeP = Cells(Dligne, 10)
    MVerse = Cells(Dligne, 17)
    RestePayer = ((MBar + Mbillard + MCours + MRepas) - MOffert) - MVerse

    rep = MsgBox("Voulez-vous confirmer ?", vbYesNo + vbQuestion, "Annulation de la dernière saisie")
    If rep = vbYes Then
    ' historique
        Sheets("Historiquegestion").Select
            Dligne = Range("E9500").End(xlUp).Row + 1
            Cells(Dligne, 3) = Date
            Cells(Dligne, 4) = "Saisie annulation"
            Cells(Dligne, 5) = NPiece
            Cells(Dligne, 6) = NomPrenom
            Cells(Dligne, 7) = Observation
            Cells(Dligne, 8) = DateJ
            Cells(Dligne, 9) = NChq
            Cells(Dligne, 10) = ModeP
            Cells(Dligne, 11) = Mbillard
            Cells(Dligne, 12) = MBar
            Cells(Dligne, 13) = MCours
            Cells(Dligne, 14) = MRepas
            Cells(Dligne, 15) = MOffert
            Cells(Dligne, 16) = MVerse

            Sheets("Caisse Journalière").Select
            Dligne = Range("E9500").End(xlUp).Row
        ' ...
    ' Color rouge le texte d'annulation de la derniere saisie
        Range("R" & [Dligne]).Select
        With Selection.Font
            .Color = -16776961
            .TintAndShade = 0
        End With
        ' ici le traitement si réponse positive
        Cells(Dligne, 5) = NPiece
        Cells(Dligne, 6) = NomPrenom
        Cells(Dligne, 7) = Observation
        Cells(Dligne, 8) = DateJ
        Cells(Dligne, 9) = NChq
        Cells(Dligne, 10) = ModeP
        Cells(Dligne, 11) = Mbillard
        Cells(Dligne, 12) = MBar
        Cells(Dligne, 13) = MCours
        Cells(Dligne, 14) = MRepas
        Cells(Dligne, 15) = MOffert
        Cells(Dligne, 17) = MVerse
        Cells(Dligne, 18) = "Annulé"

    Else
        ' ici le traitement si réponse négative
        ' ... retour userform
    End If

End Sub

Private Sub UserForm_Initialize()
    Sheets("Tables").Select
    Dim c As Variant
    Dim c2 As Variant
    Dim c3 As Variant

    ' Combobox avec liste des noms et prenoms des joueurs
    For Each c In Range("G4:G" & [G200].End(xlUp).Row)
        Me.ComboBox1.AddItem c
    Next c
    ' combobox avec list mode paiement
    For Each c2 In Range("L34:L" & [L35].End(xlUp).Row + 1)
        Me.ComboBox2.AddItem c2
    Next c2
    ' combobox avec list observation
    For Each c3 In Range("J21:J" & [J25].End(xlUp).Row + 1)
        Me.ComboBox3.AddItem c3
    Next c3
    Sheets("Caisse Journalière").Select
End Sub

Private Sub CommandButton1_Click()

    ' Initialise les variables
    Dim Dligne As Integer
    Dim NPiece As String
    Dim NomPrenom As String
    Dim Observation As String
    Dim DateJ As Date
    Dim NChq As String
    Dim ModeP As String
    Dim Mbillard As Integer
    Dim MBar As Integer
    Dim MCours As Integer
    Dim MRepas As Integer
    Dim MOffert As Integer
    Dim MVerse As Integer
    Dim RestePayer As Integer

    ' valeurs initiales
    DateJ = Date
    NPiece = ""
    NomPrenom = ""
    Observation = ""
    MBar = 0
    NChq = ""
    ModeP = ""
    Mbillard = 0
    MCours = 0
    MRepas = 0
    MOffert = 0
    MVerse = 0
    ' selectionne la feuille
    Sheets("Caisse Journalière").Select

    ' range les valeurs dans cellules
    ' Date de la consommation indiqué sur le cahier journalier

    If Not IsDate(Me.TextBox2) Then
        MsgBox "Format de date saisie incorrect !", vbOKOnly + vbCritical, "Erreur de saisie"
        Exit Sub
    Else
        DateJ = Me.TextBox2.Value
        If DateJ > Date Then
            MsgBox "Date supérieure à date du jour", vbOKOnly + vbCritical, "Erreur de saisie"
            Me.TextBox2 = ""
            Exit Sub
        End If

    End If
    ' Identification cahier saisie comptable par N° Pièce
    If Me.TextBox1 <> "" Then
        NPiece = Me.TextBox1.Value
    Else
        MsgBox "Saisie N° Pièce Obligatoire", vbOKOnly + vbCritical, "Erreur de saisie"
        Exit Sub
    End If
    ' Identification du membre
    If Me.ComboBox1 <> "" Then
        NomPrenom = Me.ComboBox1
    Else
        MsgBox "Nom du membre Obligatoire", vbOKOnly + vbCritical, "Erreur de saisie"
        Exit Sub
    End If
    ' Identification du moment
    If Me.ComboBox3 <> "" Then
        Observation = Me.ComboBox3
    Else
        MsgBox "Observation Obligatoire", vbOKOnly + vbCritical, "Erreur de saisie"
        Exit Sub
    End If

    If Me.TextBox4 <> "" Then
        MBar = Me.TextBox4.Value
    End If

    If Me.TextBox11 <> "" Then
       NChq = Me.TextBox11.Value
    End If
    ModeP = Me.ComboBox2
    If Me.TextBox5 <> "" Then
        Mbillard = Me.TextBox5.Value
    End If
    If Me.TextBox7 <> "" Then
        MCours = Me.TextBox7.Value
    End If
    If Me.TextBox6 <> "" Then
        MRepas = Me.TextBox6.Value
    End If
    If Me.TextBox8 <> "" Then
        MOffert = Me.TextBox8.Value
        End If
    If Me.TextBox9 <> "" Then
        MVerse = Me.TextBox9.Value
    End If
    RestePayer = ((MBar + Mbillard + MCours + MRepas) - MOffert) - MVerse
    Label15 = RestePayer

    If MBar < 0 Or Mbillard < 0 Or MCours < 0 Or MRepas < 0 Then
: Beep        ' MsgBox "Les valeurs négatives sont iterdites", vbOKOnly + vbCritical, "Erreur de saisie"
    End If

    ' Derniere vide du fichier
    Dligne = Range("E9500").End(xlUp).Row + 1

    If (MBar + Mbillard + MCours + MRepas) <> 0 Then
        Cells(Dligne, 5) = NPiece
        Cells(Dligne, 6) = NomPrenom
        Cells(Dligne, 7) = Observation
        Cells(Dligne, 8) = DateJ
        Cells(Dligne, 9) = NChq
        Cells(Dligne, 10) = ModeP
        Cells(Dligne, 11) = Mbillard
        Cells(Dligne, 12) = MBar
        Cells(Dligne, 13) = MCours
        Cells(Dligne, 14) = MRepas
        Cells(Dligne, 15) = MOffert
        Cells(Dligne, 17) = MVerse
        '
        Label15 = RestePayer
        If RestePayer > 0 Then
            MsgBox "La somme restante à payer est de : " & RestePayer & " €", vbOKOnly + vbInformation, "Information"
        End If
        ' saisie historisée si une somme est négative
        ' Historiquegestion
        If Mbillard < 0 Or MBar < 0 Or MCours < 0 Or MRepas < 0 Or MOffert < 0 Or MVerse < 0 Then

            Sheets("Historiquegestion").Select
            Dligne = Range("E9500").End(xlUp).Row + 1
            Cells(Dligne, 3) = Date
            Cells(Dligne, 4) = "Saisie avec valeur négative"
            Cells(Dligne, 5) = NPiece
            Cells(Dligne, 6) = NomPrenom
            Cells(Dligne, 7) = Observation
            Cells(Dligne, 8) = DateJ
            Cells(Dligne, 9) = NChq
            Cells(Dligne, 10) = ModeP
            Cells(Dligne, 11) = Mbillard
            Cells(Dligne, 12) = MBar
            Cells(Dligne, 13) = MCours
            Cells(Dligne, 14) = MRepas
            Cells(Dligne, 15) = MOffert
            Cells(Dligne, 17) = MVerse

            Sheets("Caisse Journalière").Select
        End If

    Else
        MsgBox "Saisie incorrecte", vbOKOnly + vbCritical, "Erreur de saisie"
    End If
End Sub

Bonjour,

Encore une usine à gaz qui gagnerait à être simplifiée... !

Si tu disais simplement sur quelle ligne est l'erreur, on gagnera du temps... !

Bonjour

L'erreur est sur le ligne Load userform1 dans la macro saisieCJ.

Pour une usine à gaz, je ne dis pas non, et j'ai répété certaines lignes de code car je ne connais pas encore le VBA comme savoir si je peux créer une fonction avec des passages de paramètres etc.. ce n'est qu'un début et je souhaite apprendre.

merci pour l'aide

Note que l'utilisation de Load immédiatement suivie de Show est tout à fait superflue, le charagement est opéré automatiquement, Show suffit !

L'erreur aurait simplement alors apparue sur la ligne Show, ce qui indique que le Userform ne peut s'afficher et qu'il faut chercher l'erreur dans Initialize (proc. qui s'exécute avant affichage).

Ça tombe bien, elle est relativement courte (contrairement à d'autres !) ce qui ne l'empêche de charrier des éléments qui mériteraient d'être éliminés :

  • commence évidemment par un Select (quand donc apprendra-t-on dès la première leçon que sélectionner quand ce n'est pas la fin en soi est une action inutile et parasite, qui ne fait qu'occuper du temps pour rien ! )
  • par contre on apprend bien partout que toutes les variables se déclarent toujours en tête de procédure avant tou code exécutable ! Il serait bon que tu l'assimiles une bonne fois, définitivement.
  • tu es aussi très prodigue avec les variables ! 3 quand une suffit ! La même pouvait être utilisée tour à tour... Il faut réfléchir, toujours inutile de charger la mémoire quand il n'en est pas besoin.
Range("L34:L" & [L35].End(xlUp).Row + 1)

Enfin, il me semble que tu devrais te pencher sur cette ligne, la définition me paraît douteuse...

Et au lieu de "sélecter" à tour de bras, tu ferais mieux de qualifier tes expressions, ce serait plus rapide et plus sûr. Et si tu souhaites apprendre c'est entre autres par là qu'il faut commencer : bannir tout Select, Selection, Activate... du code et doter toute expression de qualificateur d'objet (jamais de Range, Cells, etc. sans référence à la feuille à laquelle elles appartiennent)...

Souhaitons que ce soit bien le bon Initialize...

Cordialement.

Bonjour

Effectivement si j'enlève le Load, l'erreur se fait sur la ligne show

Mes variables sont au début de chaque procédure

cette ligne reprendre 2 lignes dans une table, une feuille où toutes les combobox ont leur intitulés, entête etc..

Range("L34:L" & [L35].End(xlUp).Row + 1)

A chaque fois que je me rends dans une feuille, je l'a sélectionne, ce qui me parait logique

et les range, cells sont utilisés sur la bonne feuille.

Je ne comprends pas.

Pour l'initialize, d'après ce que j'ai compris est pour chaque Userform et là c'est le cas.

Par contre, ce qui me surprends et que l'initialize a la même référence Userform et non Userform1 ou 2, d'ailleurs si je mets Private Sub UserForm1_Initialize(), l'userform1 s'affiche mais les combobox restent vide car plus reconnus.

Private Sub UserForm_Initialize()

Avant de réaliser l'userform2, l'userform1 fonctionnait très bien. Donc j'ai réalisé l'userform2, qui fonctionne aussi mais qui génère l'erreur sur l'userform1 que j'ai décris et c'est cela que j'aimerais comprendre.

Ce qui me surprends aussi, c'est la définition automatique des combobox,

Userform1 = combobox1

Userform2 = combobox1

c'est pour cela que j'ai mis

UserForm2.ComboBox1.AddItem c10

L'userform2 me servant simplement à rendre visible ou pas telle ou telle feuille suivant l'accès, je me rends dans la feuil Menu.

merci

Mes variables sont au début de chaque procédure

Ce n'était pas le cas dans celle que j'ai examinée ! Et dans l'autre Initialize non plus d'ailleurs...

cette ligne reprendre 2 lignes dans une table, une feuille où toutes les combobox ont leur intitulés, entête etc..

Ça, moi ça ne m'évoque rien... mais tu ne dis pas la valeur renvoyée par ta ligne... !

A chaque fois que je me rends dans une feuille, je l'a sélectionne, ce qui me parait logique

Rien de plus illogique ! Tu n'as justement à te rendre nulle part !! Tu donnes les instructions et VBA agit !!!

Là tu lui colles simplement un boulet au pied !

et les range, cells sont utilisés sur la bonne feuille.

Jusqu'au jour où ce ne sera plus le cas... En ne qualifiant pas, tu demandes à chaque fois à VBA de chercher quelle est la feuille active du classeur actif, si tu le lui dis il n'a plus à chercher !

ce qui me surprends et que l'initialize a la même référence Userform et non Userform1 ou 2, d'ailleurs si je mets Private Sub UserForm1_Initialize(), l'userform1 s'affiche mais les combobox restent vide car plus reconnus.

Là c'est ta procédure Initialize qui n'est plus reconnue comme telle !

Tu as zappé les cours de bases en la matière !!

Note-toi bien quelque part que si on veut être sûr que tout fonctionne, on ne tape jamais les déclarations de procédures d'évènements, on laisse VBA les inscrire, que ce soit dans les feuilles ou dans les Userforms. On sélectionne l'objet dans la liste déroulante gauche (ce qui produit l'inscription de l'évènement par défaut), puis s'il y a lieu, dans la liste droite on sélectionne un autre évènement...

Dans les modules de Userform, tu peux utiliser Me pour désigner le Userform, sans ambiguïté. Me représente l'objet auquel le module est dédié. C'est la même chose pour les modules de feuilles de calcul.

Et as-tu fait une exécution pas à pas, pour voir où précisément se produisait l'erreur...

bonjour

Pour les variables : Bon, je dois te dire, qu'il y a bien longtemps je développais mais non orienté objet, donc pour moi c'est nouveau.

Je déclare les variables dans les procédures ou j'en ai besoin, donc d'après ce que tu me dit je dois le faire bien avant.

Pour la table, une feuille où je dispose d'un ensemble de données pour lesquelles j'utilise celles ci pour remplir par exemple un tableau, définir des entêtes de colonne, c'est paramétrable.

Comment dire à VBA de prendre des données sans lui dire où aller chercher ? ex:

je sélectionne la feuille

déclare les variables

traite les variables

et donne un résultat

Je n'arrive pas à comprendre comment un langage de programmation peux aller chercher des données sans lui dire où.

Là, je suis larguer, ayant réalisé des programmes en, basic, clipper, python, batch je suis surpris de ce que tu me dis : J'ai besoin d'explications et surtout d'une correction qui va me permettre de résoudre mon problème.

Existe t-il un schéma type d'utilisation de deux userform. et toutes les procédures ont été crées par visual basic lors de la constitution de l'userform.

Si la procédure initailze n'est pas reconnue ,pourquoi ?

Pour le debug visual, y a t-il un mode d'exécution pas à pas auto sous forme de rapport ?

merci

Comment dire à VBA de prendre des données sans lui dire où aller chercher ?

Tout a un nom !

Ce que tu ne comprends pas, c'est que chaque fois que tu tapes Select ou Activate, tu fais réaliser une action, là tu lui indiques bien la feuille, mais une fois ! Quand tu lui dis ensuite : Range... VBA ne sait pas où est ce Range ! Ne lui disant rien il va l'affecter à la feuille active, qu'il va chercher !

Alors que si tu lui dis Worksheets(x).Range... pas d'hésitation, il y va direct

Ou mieux :

With ActiveSheet

.Range...

Là il met la feuille en mémoire, et toute expression précédée d'un point y est rattachée, et il y accède encore plus rapidement...

Avec les Select, non seulement tu fais un action supplémentaire parasite, mais tu n'es jamais assuré que lors de modification ultérieure, la feuille supposée être active sera bien toujours la feuille active ! Tu cherches alors l'erreur, ou pire, pas d'erreur mais travail sur une autre feuille que celle prévue !

Pour le pas à pas, tu ouvres la boîte de dialogue macro, tu sélectionnes ta procédure de lancement (celle où apparaît l'erreur), et tu cliques sur pas à pas détaillé. pour avancer ensuite ligne par ligne, tu actionnes F8.

Bonjour

Bon ok je comprends, je vais réécrire avec la bonne syntaxe et faire le débug.

Je poste les codes et vois ensuite, merci

Ce qui ne s'appréhende pas du premier coup (il m'a fallu un certain temps ! ) c'est que quand tu écris Worksheets, Range, Cells... ce n'est pas l'objet que tu appelles : tu invoques une propriété d'un objet parent ou conteneur, qui renvoie l'objet recherché, tu n'y touches pas directement, si j'ose dire. Tout remonte à l'application, et presque tous les objets ont une propriété Application, qui renvoie l'application Excel en cours d'exécution, si tu écris Application, pareil, tu utilises la propriété Application de l'objet Application.

On peut l'omettre le plus souvent, elle est implicite, et si on ne travaille qu'avec un classeur, l'omission de Workbooks ne pose pas problème, mais aux niveaux suivants on n'a jamais qu'un seul objet de l'espèce...

Bonjour

Je fais actuellement les modifications et j'ai trouvé pourquoi, la feuil tables était non visible donc non accessible.

Sub saisieCJ()
'
' SaisieCJ Macro
'
Sheets("Tables").Visible = True
userform1.Show
'
End Sub

Merci pour le temps passé et tes explications.

Je fais actuellement les modifications et j'ai trouvé pourquoi, la feuil tables était non visible donc non accessible.

Illustration parfaite !

Feuille non visible, c'est avec Select que tu provoques une erreur !

Sans Select pas d'erreur.

On travaille parfaitement avec une feuille masquée, tant que l'on n'accomplit pas d'opération qui exige qu'elle soit visible...

Ce peut même être une sécurité...

Salut

Oui et la programmation devient plus simple et le code à lire.

Rechercher des sujets similaires à "conflit entre deux userform"