IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Userform qui ne s'ouvre plus après avoir été déchargée ( "l'indice n'appartient plus à la sélection")


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Userform qui ne s'ouvre plus après avoir été déchargée ( "l'indice n'appartient plus à la sélection")
    Bonjour à tous,

    Mon problème est le suivant : (utilisation excel 2013)
    J'appelle un userform2 depuis un userform1. Dans le userform2 j'ai un bouton qui me décharge (unload) le userform2 et me réaffiche le userform1. => jusqu'à là pas de souci
    Par contre lorsque je vaux afficher le userform2 (une deuxième fois donc) depuis le userform1, j'ai le message connu "erreur 9 -l'indice n'appartient pas à la sélection".

    J'avoue être à cours d'investigation car le userform2 s'ouvre bien le premier coup mais une fois déchargé (unload), impossible de le réouvrir une deuxième fois !!

    Code dans le userform1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
    Me.Hide
    Load UserForm2
    UserForm2.Show
    End Sub

    Code dans le userform2:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandButton1_Click()
    Unload Me
    UserForm1.Show
    End Sub
    Voici le userform_initialize de mon userform2 (j'ai l'impression que ça vient de là) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Private Sub UserForm_Initialize()
    Dim R As Range
    Dim SP As Object
    Dim SHSP As Object
    Dim RSP As Object
    Dim Ctrl As Control
    Dim i As Integer
     
    i = 1
    For Each Ctrl In Controls
    If i <= 34 Then
    Me.MultiPage1.Pages(i - 1).Caption = ActiveWorkbook.Sheets(i + 1).Cells(2, 2).Value
    If TypeName(Ctrl) = "Spreadsheet" Then
    Set R = ActiveWorkbook.Sheets(i + 1).Range("a1:z100")
    R.Copy
    Set SP = Ctrl.Object
    Set SHSP = SP.Worksheets(1)
    Set RSP = SHSP.[a1]
    RSP.Select
    SHSP.Paste
    RSP.Select
    Application.CutCopyMode = False
    SP.DisplayTitleBar = False
    SP.DisplayToolbar = False
     
    Ctrl.Object.Worksheets("Feuil1").Columns(3).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(8).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(13).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(18).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(23).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(2).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(7).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(12).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(17).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(22).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(4).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(9).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(14).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(19).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(24).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(1).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(6).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(11).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(16).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(21).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(26).ColumnWidth = 4
     
    Ctrl.Object.Worksheets("Feuil1").Columns(5).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(10).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(15).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(20).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(25).ColumnWidth = 5
     
     
     
    Dim j As Integer
    For j = 1 To 110
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 6).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 4).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 6).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 4).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 11).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 9).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 11).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 9).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 16).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 14).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 16).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 14).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 21).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 19).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 21).Text = "1,00" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 19).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 26).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 24).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 26).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 24).Font.ColorIndex = 3
    End If
    Next
    i = i + 1
    End If
    End If
    Next
    End Sub

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Intéresse-toi aux effets de la propriété ShowModal d'un userform.

    PS : juste deux petites choses

    1) lorsque l'on présente un code, il convient de le mettre entre balises code
    2) lorsque l'on a un message d'erreur, on l'indique ici
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci unparia pour ta réponse rapide
    Tout d’abord désolé pour la présentation, première fois sur le forum pour moi.

    Pour ce qui est de la propriété showModal j’y ai effectivement pensé (je suis actuellement en non modal (false) sur deux userform). Le fait de passer là propriétés en True ne règle pas le souci.

    J’avoue être sec sur mon problème

  4. #4
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Ce code :

    Code dans le userform1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
    Me.Hide
    Load UserForm2
    UserForm2.Show, 0 '-->> pour forcer la propriété ShowModal à false
    End Sub
    Code dans le userform2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub CommandButton1_Click()
    Unload Me
    UserForm1.Show, 0 '-->> pour forcer la propriété ShowModal à false
    End Sub

    ne peut, en soi, que fonctionner

    Si tu reçois malgré cela un message d'erreur selon lequel l'indice n'appartient plus à la sélection, il concerne autre chose que tes userforms (c'est dans leur contenu, que tu te réfères alors probablement à un élément absent)
    Lorsque je dis "absent", je devrais plutôt dire "encore absent".
    Il se trouve, par exemple, que tu utilises l'évènement initialize dans ton userform2. Ce n'est pas vraiment adroit, car cet évènement intervient avant que la totalité des contrôles du userform soit forcément déjà chargée (et donc "présente).
    L'utilisation de l'évènement activate est conseillée pour éviter cette éventuelle mésaventure
    Si cela non plus ne règle pas ton problème, il va te falloir chercher pas à pas dans le code de tes userforms ce qui y est invoqué alors que non présent.
    Tu es bien alors le seul à pouvoir le faire.

    Autre chose (pas vraiment important ... juste au passage)
    Le seul fait d'utiliser la méthode Show provoque le chargement. Il n'est donc pas nécessaire d'utiliser le Load.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'essaierai ce soir de passer par un userform_activate (c'est un code que je ne peux lancer que depuis le travail car les données sont sensibles) et je vous retiens au courant !

    Merci pour tout

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En revanche si tes userform ne sont pas modal ça fout la grouille!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Code dans le userform1:
     
    Private Sub CommandButton1_Click()
    Me.Hide
    UserForm2.Show
    Me.Show
    End Sub
     
    'Code dans le userform2:
     
    Private Sub CommandButton1_Click()
    Unload Me
    End Sub

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui j'effectuerai plusieurs essais dans la soirée.

    Ce que je trouve surprenant (et c'est là la clé pour comprendre le problème je pense), c'est que le premier chargement de userform2 se passe très bien (donc mon userform_initialize joue bien son rôle sans erreur) mais qu'une fois décharger (par unload) il n'y a plus moyen de le recharger (là apparait le message d'erreur comme quoi l'indice n'appartient pas à la sélection).

    Merci à tous

  8. #8
    Invité
    Invité(e)
    Par défaut
    Vue que ça (Load UserForm2
    UserForm2.Show) c'est une aberration dis nous ce que tu veux faire?

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je sais bien que ça semble être une aberration, d'où ma peine ^^

    Récapitulons. J'ai un userform1 (accueil pour l'utilisateur) qui me permets à l'aide de bouton d'accéder à d'autre userform (par exemple userform2).

    1) Lorsque je charge le userform2 tout fonctionne bien (le userform1 se cache et le userform2 affiche ce qu'il doit afficher => les données d'un classeur excel via une spreadsheet).
    2) Je décharge le userform2 à l'aide d'un bouton et fait apparaître de nouveau le userform1 (interface d'acceuil).
    3) Si je souhaite de nouveau faire apparaître le userform2 c'est là que ça plante avec le message d'erreur.

    Remarque : c'est le cas pour tous mes userform(2,3,4,5) => le premier chargement nickel mais une fois déchargé il n'y a plus moyen de les faire apparaître de nouveau.

    Je vous joins les codes de uerform1 et userform2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Private Declare Function GetSystemMenu _
        Lib "user32" ( _
        ByVal hWnd As Long, _
        ByVal bRevert As Long) _
    As Long
     
    Private Declare Function RemoveMenu _
        Lib "user32" ( _
        ByVal hMenu As Long, _
        ByVal nPosition As Long, _
        ByVal wFlags As Long) _
    As Long
     
    Private Declare Function FindWindowA _
        Lib "user32" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) _
    As Long
     
    Private Const MF_BYPOSITION As Long = &H400
    Private Sub UserForm_Initialize()
    Dim lFrmHdl As Long, iCount As Integer
    '// Ivan F Moala
    lFrmHdl = FindWindowA(vbNullString, Me.Caption)
     
    If lFrmHdl <> 0 Then
        '// MF_BYCOMMAND
        '//Indicates that uPosition gives the identifier of the menu item.
     
        '//If neither the MF_BYCOMMAND nor MF_BYPOSITION flag is specified,
        '//the MF_BYCOMMAND flag is the default flag.
     
        '// MF_BYPOSITION
        '//Indicates that uPosition gives the zero-based relative position of the menu item.
        '// ie 0,1,2,3 etc
        'Exit Sub
        '//Typical Windows has 6 menus
        '//Restore, Move, Size, Minimise, Maximize, Close
        '//Even though a Userform displays 2 = Move & Close
        '//By default Move is the Next item
        '//so just loop twice
        For iCount = 0 To 1
            RemoveMenu GetSystemMenu(lFrmHdl, False), 0, MF_BYPOSITION
        Next iCount
    End If
     
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
    MsgBox "Vous ne pouvez pas utiliser ce bouton de fermeture." & Chr(10) _
    & "Pour quitter le logiciel, veuillez utiliser le bouton prévu à cet effet"
    Cancel = True
    End If
    End Sub
     
     
    Private Sub ComboBox1_Change()
    Dim WB As Workbook
     
    For Each WB In Workbooks
    If (WB.Name <> "LAST_SOFT.xls") = True Then
    WB.Close SaveChanges:=False
    End If
    Next
     
     
        If ComboBox1.Value = "TRANCHE 4" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR4.xls")
            WB.Activate
     
        ElseIf ComboBox1.Value = "TRANCHE 2" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR2.xls")
            WB.Activate
     
        ElseIf ComboBox1.Value = "TRANCHE 1" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR1.xls")
            WB.Activate
     
        ElseIf ComboBox1.Value = "TRANCHE 3" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR3.xls")
            WB.Activate
     
        End If
     
     
        UserForm6.Show
     
    End Sub
     
    Private Sub CommandButton1_Click()
    Me.Hide
    UserForm2.Show
    End Sub
     
    Private Sub CommandButton2_Click()
    Me.Hide
    UserForm4.Show
    End Sub
     
    Private Sub CommandButton3_Click()
    Me.Hide
    UserForm5.Show
    End Sub
     
    Private Sub CommandButton4_Click()
    ActiveWorkbook.Close SaveChanges:=False
    ThisWorkbook.Close SaveChanges:=False
    Application.Quit
    Application.DisplayAlerts = True
    End Sub
     
    Private Sub CommandButton5_Click()
    UserForm3.Show
    End Sub
    Private Sub CommandButton6_Click()
    UserForm7.Show
    End Sub
    Code userform2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    Private Sub CommandButton1_Click()
    Unload UserForm2
    UserForm1.Show
    End Sub
     
     
     
    Private Sub CommandButton172_Click()
     
    Unload UserForm2
     
    Dim WB As Workbook
     
    For Each WB In Workbooks
    If (WB.Name <> "LAST_SOFT.xls") = True Then
    WB.Close SaveChanges:=False
    End If
    Next
     
        If UserForm1.ComboBox1.Value = "TRANCHE 4" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR4.xls")
            WB.Activate
     
        ElseIf UserForm1.ComboBox1.Value = "TRANCHE 2" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR2.xls")
            WB.Activate
     
        ElseIf UserForm1.ComboBox1.Value = "TRANCHE 1" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR1.xls")
            WB.Activate
     
        ElseIf UserForm1.ComboBox1.Value = "TRANCHE 3" Then
            Set WB = Workbooks.Open("\\Atlas.edf.fr\co\45dam-dpn\services.006\sco.001\Exp34\0 Equipe F\Maxime\LAST\LAST_TR3.xls")
            WB.Activate
     
        End If
     
     
        UserForm6.Show
        UserForm2.Show
     
    End Sub
     
    Private Sub CommandButton2_Click()
    Unload UserForm2
    UserForm3.Show
    End Sub
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
    MsgBox "Vous ne pouvez pas utiliser ce bouton de fermeture." & Chr(10) _
    & "Pour revenir au menu principal, veuillez utiliser le bouton prévu à cet effet"
    Cancel = True
    End If
    End Sub
    Private Sub UserForm_Initialize()
    Dim R As Range
    Dim SP As Object
    Dim SHSP As Object
    Dim RSP As Object
    Dim Ctrl As Control
    Dim i As Integer
     
    i = 1
    For Each Ctrl In Controls
    If i <= 34 Then
    Me.MultiPage1.Pages(i - 1).Caption = ActiveWorkbook.Sheets(i + 1).Cells(2, 2).Value
    If TypeName(Ctrl) = "Spreadsheet" Then
    Set R = ActiveWorkbook.Sheets(i + 1).Range("a1:z100")
    R.Copy
    Set SP = Ctrl.Object
    Set SHSP = SP.Worksheets(1)
    Set RSP = SHSP.[a1]
    RSP.Select
    SHSP.Paste
    RSP.Select
    Application.CutCopyMode = False
    SP.DisplayTitleBar = False
    SP.DisplayToolbar = False
     
    Ctrl.Object.Worksheets("Feuil1").Columns(3).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(8).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(13).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(18).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(23).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(2).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(7).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(12).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(17).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(22).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(4).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(9).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(14).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(19).AutoFit
    Ctrl.Object.Worksheets("Feuil1").Columns(24).AutoFit
     
    Ctrl.Object.Worksheets("Feuil1").Columns(1).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(6).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(11).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(16).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(21).ColumnWidth = 4
    Ctrl.Object.Worksheets("Feuil1").Columns(26).ColumnWidth = 4
     
    Ctrl.Object.Worksheets("Feuil1").Columns(5).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(10).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(15).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(20).ColumnWidth = 5
    Ctrl.Object.Worksheets("Feuil1").Columns(25).ColumnWidth = 5
     
     
     
    Dim j As Integer
    For j = 1 To 110
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 6).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 4).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 6).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 4).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 11).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 9).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 11).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 9).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 16).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 14).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 16).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 14).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 21).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 19).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 21).Text = "1,00" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 19).Font.ColorIndex = 3
    End If
    If Ctrl.Object.Worksheets("Feuil1").Cells(j, 26).Text = "0" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 24).Font.ColorIndex = 10
    ElseIf Ctrl.Object.Worksheets("Feuil1").Cells(j, 26).Text = "1" Then
    Ctrl.Object.Worksheets("Feuil1").Cells(j, 24).Font.ColorIndex = 3
    End If
    Next
    i = i + 1
    End If
    End If
    Next
    End Sub
    Encore merci !!!

  10. #10
    Invité
    Invité(e)
    Par défaut
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
    Unload UserForm2
    UserForm1.Show
    End Sub
    *
    Quand tu fais ça la UseuForm2 ce décharge que quand le userform1 repasse a Hide!
    Ma proposition est bien la bonne!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'Code dans le userform1:
    *
    Private Sub CommandButton1_Click()
    Me.Hide
    UserForm2.Show
    Me.Show
    End Sub
    *
    'Code dans le userform2:
    *
    Private Sub CommandButton1_Click()
    Unload Me
    End Sub
    Dernière modification par LittleWhite ; 28/01/2018 à 16h27. Motif: Balise code

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Ah oui je vois

    Dès que je suis au boulot ce soir j'essaie ça et je te redis (je peux pas le tester depuis chez moi car je fais appel à des fichiers sur le serveur entreprise).

    Merci

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Si tu reçois malgré cela un message d'erreur selon lequel l'indice n'appartient plus à la sélection, il concerne autre chose que tes userforms (c'est dans leur contenu, que tu te réfères alors probablement à un élément absent)
    Lorsque je dis "absent", je devrais plutôt dire "encore absent".
    Il se trouve, par exemple, que tu utilises l'évènement initialize dans ton userform2. Ce n'est pas vraiment adroit, car cet évènement intervient avant que la totalité des contrôles du userform soit forcément déjà chargée (et donc "présente).
    L'utilisation de l'évènement activate est conseillée pour éviter cette éventuelle mésaventure
    Si cela non plus ne règle pas ton problème, il va te falloir chercher pas à pas dans le code de tes userforms ce qui y est invoqué alors que non présent.
    Tu es bien alors le seul à pouvoir le faire.

    Autre chose (pas vraiment important ... juste au passage)
    Le seul fait d'utiliser la méthode Show provoque le chargement. Il n'est donc pas nécessaire d'utiliser le Load.
    Bonjour à tous,

    Après plusieurs essais hier soir, il semble que la raison soit effectivement mon Userform_initialize. Le fait de passer par un Userform_Activate a résolu le problème.
    Pour ma culture et pour mieux comprendre, on a donc toujours intéret à passer par un userform_activate ?

    Autre point, dans le code de mon userform2 l commande 172 a pour but (pour faire simple) de faire une MAJ des données de mon fichier excel et il faut que je mette à jour mon userform2 par la suite.
    Comment faire cela ? car la fonction hide bien évidemment ne le permet pas mais si j'unload le userform2, le code s'arrete et je ne peux pas le recharger.

    Je connais mal la fonction .Repaint également ..

    Encore merci pour tout !

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 729
    Points : 28 555
    Points
    28 555
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Rien de tel que la lecture d'un tutoriel sur le sujet Utiliser les UserForm en VBA Excel pour obtenir la réponse à toutes tes interrogations.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Le fait de passer par un Userform_Activate a résolu le problème.
    Pour ma culture et pour mieux comprendre, on a donc toujours intéret à passer par un userform_activate ?
    Je t'en ai donné plus haut la raison fondamentale.
    Pour ce qui est de ta seconde phrase : tout dépend du contexte, de la finalité, etc ...
    A chaque évènement SA vocation et le code sera bien gardé

    Pour être complet : tant sous VBA que sous VB6, un développeur peut, selon les besoins, utiliser à la fois l'évènement initialize et l'évènement activate, chacun de ces deux évènements avec une mission particulière spécifique et parfaitement définie). D'autres évènements peuvent également être utilisés (également à des fins spécifiques et définies).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  15. #15
    Candidat au Club
    Homme Profil pro
    Ingénieur exploitaiton
    Inscrit en
    Janvier 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur exploitaiton
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui, désolé je suis amateur
    Encore merci pour tout !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Helios ne démarre plus, après avoir mal fermé l'application
    Par Iori Yagami dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 29/11/2012, 23h09
  2. Réponses: 12
    Dernier message: 18/07/2012, 13h00
  3. [JpGraph] Graphique qui ne s'affiche plus après avoir modifié l'exemple
    Par kanabzh29 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 18/08/2008, 13h00
  4. Réponses: 6
    Dernier message: 02/06/2008, 11h17
  5. Requête ne fonctionne plus après avoir 'vider' les champs ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 9
    Dernier message: 14/10/2007, 12h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo