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 :

Gérer deux classeurs avec un seul userform


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2020
    Messages : 90
    Par défaut Gérer deux classeurs avec un seul userform
    Bonjour j'ai mon code qui a arrété de fonctionné.
    je gere deux feuilles ouvertes a partir d'un combobox
    ça marchait parfaitement mais ça s'est arreté de fonctionner et on me sort une erreur au niveau du With Workbooks("AVIONS").Sheets("Me.ComboBox2.Value")
    mon classeurs avion est le classeur principale, c'est celui qui a le userform en son sein.

    Merci de bien vouloir m'aider
    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
    Private Sub CommandButton1_Click()
     
    With Workbooks("C-CLIENT").Sheets(Me.ComboBox1.Value)
        rw2 = .Cells(Rows.Count, "A").End(xlUp).Row + 1
     
                .Range("A" & rw2) = ComboBox1.Value
                .Range("B" & rw2) = TextBox5.Value
                .Range("C" & rw2) = TextBox2.Text
                .Range("D" & rw2) = TextBox4.Text
                .Range("E" & rw2) = TextBox6.Text
                .Range("F" & rw2) = TextBox3.Text
                .Range("H" & rw2) = ComboBox2.Text
                .Range("G" & rw2) = TextBox10.Text
     
     
    End With
    With Workbooks("AVIONS").Sheets("Me.ComboBox2.Value")
        rw1 = .Cells(Rows.Count, "A").End(xlUp).Row + 1
                .Range("A" & rw2) = ComboBox1.Value
                .Range("B" & rw2) = TextBox5.Value
                .Range("C" & rw2) = TextBox2.Text
                .Range("D" & rw2) = TextBox4.Text
                .Range("E" & rw2) = TextBox6.Text
                .Range("F" & rw2) = TextBox3.Text
                .Range("H" & rw2) = ComboBox2.Text
                .Range("G" & rw2) = TextBox10.Text
     
     
     
     
    End With
    ComboBox1.Text = ""
    ComboBox2.Text = ""
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox10.Text = ""
    TextBox5.Text = ""
    TextBox6.Text = ""
    TextBox4.Text = ""
     
    MsgBox ("ENREGISTREMENT EFFECTUER")
    End Sub
    je rappel que j'ai mis ce code (suivant) pour selectionner les feuilles dans les differents classeurs afin d'enregistrer les informations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Userform_Initialize()
    Set wk1 = ThisWorkbook  '<--- AVION
    Set wk2 = Workbooks("C-CLIENT.xlsm")
    Dim ws As Worksheet
    Dim WF As Worksheet
     
    For Each ws In wk1.Worksheets
    Me.ComboBox2.AddItem ws.Name
    Next ws
     
    For Each WF In wk2.Sheets
    Me.ComboBox1.AddItem WF.Name
    Next WF
    End Sub
      0  0

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour,


    le souci ne viendrait-il pas de ta ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Workbooks("AVIONS").Sheets("Me.ComboBox2.Value")
    , il faudrait supprimer les guillements, ou ton code cherche la feuille nommée "Me.ComboBox2.Value" et non la valeur de ta cbo.

    Bàt
      0  0

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Dorel.D Voir le message
    ça marchait parfaitement mais ça s'est arreté de fonctionner et on me sort une erreur au niveau du With Workbooks("AVIONS").Sheets("Me.ComboBox2.Value")
    Je ne mets pas ta parole en doute mais il me semble peu probable que ceci ait un jour fonctionné.
    Essaye plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Workbooks("AVIONS").Sheets(Me.ComboBox2.Value)
    Compare ta ligne 17 avec ta ligne 3.
      0  0

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Télescopage.

    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Me.ComboBox2.Value")
    Ouh la!

    Si la valeur de la Combobox désigne la feuille de travail alors il n'est pas souhaitable de placer cette propriété entre 2 double quottes.
    Tel que tu l'écris, le classeur comporte une feuille nommée "Me.ComboBox2.Value"
      0  1

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2020
    Messages : 90
    Par défaut
    Grand merci a vous, ça fonctionne .
    vraiment merci

    j'ai un autre soucis sur le premier bouton qui doit ouvrir une feuille dans le classeur principale qui est AVIONS.
    on me met une erreur au niveau de If Workbooks("AVIONS").Sheets(i).Name = Nom Then Verif = True
    pourtant l'autre fonctionne tres bien quand je met le nom du classeur.
    Voici le code
    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
    Private Sub CommandButton9_Click()
    Dim Nom As String, i As Byte, Verif As Boolean, myMonth As Integer, myYear As Integer, myDate As Date, ee As String, a As Long
     myDate = Date ' enregistre la date d'aujourd'hui dans la variable myDate
     
    myMonth = (Month(myDate))  ' No du mois précédent
    myYear = Year(Date) 'No année
    ee = ""
    recom:
    Verif = False
    Nom = InputBox("Définissez le nom du nouveau client svp", "Ajout nouveau client") & "" & (myMonth) & " - " & myYear
     
    If Nom = "" Then Exit Sub
     
    For i = 1 To Sheets.Count
        If Workbooks("AVIONS").Sheets(i).Name = Nom Then Verif = True
    Next
     
    If Verif = True Then
        MsgBox "la feuille " & Nom & " existe déjà, veuillez choisir un autre nom"
        GoTo recom
    End If
     
    Workbooks("AVIONS").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom
     
            Workbooks("AVIONS").Sheets(1).Activate
            Range("A1:N3").Select
            Selection.Copy
            Workbooks("AVIONS").Sheets(Nom).Activate
            Range("A1").Select
            ActiveSheet.Paste
     
    Unload Me
    UserForm1.Show
     
    End Sub
      0  0

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Tu peux afficher la fenêtre des variables locales au sein de l'éditeur VBE pour vérifier la valeur de la variable "Nom" et constater ainsi l'existence, ou non, de la feuille.

    Quoi qu'il en soit,

    Tel que tu écris ton code, si la feuille n'est pas la dernière alors ta variable reverra toujours False.
    Il faut bien que ta boucle s'arrête, non?


    Quoi qu'il en soit du Quoi qu'il en soit,


    Evitons les sorties de boucle anticipées.

    Privilégier ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function SheetExists(Name As String) As Boolean
      Dim Counter As Long
      Counter = 1
     
      Do While Counter <= Sheets.Count And Not SheetExists
        If StrComp(Name, Sheets(Counter).Name, vbTextCompare) = 0 Then SheetExists = True
        Counter = Counter + 1
      Loop
    End Function
    Une variante (non testée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SheetExists =(StrComp(Name, Sheets(Counter).Name, vbTextCompare) = 0)
      0  0

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2020
    Messages : 90
    Par défaut
    tres bien ecrit en français mais je ne comprends malheureusement rien.
    je dois créer des feuilles avec des nom et date (mois et année) dans chacun de mes deux classeur, j'ai utilisé un bouton pour ouvrir une feuille dans chacun des classeurs.
    mes classeurs sont AVIONS et C-CLIENT.
    l'un des code ne fonctionne pas. actuellement c'est le bouton 8 qui ne fonctionne pas et on me met l'erreur a ce niveau : If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True

    voici les deux codes
    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
    Private Sub CommandButton9_Click()
    Dim Nom As String, i As Byte, Verif As Boolean, myMonth As Integer, myYear As Integer, myDate As Date, ee As String, a As Long
     myDate = Date ' enregistre la date d'aujourd'hui dans la variable myDate
     
    myMonth = (Month(myDate))  ' No du mois précédent
    myYear = Year(Date) 'No année
    ee = ""
    recom:
    Verif = False
    Nom = InputBox("Définissez le nom du nouveau svp", "Ajout nouveau ") & "" & (myMonth) & " - " & myYear
     
    If Nom = "" Then Exit Sub
     
    For i = 1 To Sheets.Count
        If Workbooks("AVIONS").Sheets(i).Name = Nom Then Verif = True
    Next
     
    If Verif = True Then
        MsgBox "la feuille " & Nom & " existe déjà, veuillez choisir un autre nom"
        GoTo recom
    End If
     
    Workbooks("AVIONS").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom
            Application.ScreenUpdating = False
            Workbooks("AVIONS").Sheets(1).Activate
            Range("A1:P3").Select
            Selection.Copy
            Workbooks("AVIONS").Sheets(Nom).Activate
            Range("A1").Select
            ActiveSheet.Paste
            'On copie colle uniquement le format des colonnes
            Workbooks("AVIONS").Sheets(1).Activate
            Columns("A:P").Select
            Selection.Copy
            Workbooks("AVIONS").Sheets(Nom).Activate
            Range("A1").Select
            Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
            Application.ScreenUpdating = True
    Unload Me
    UserForm1.Show
    End Sub
     
    Private Sub CommandButton8_Click()
    Dim Nom As String, i As Byte, Verif As Boolean, myMonth As Integer, myYear As Integer, myDate As Date, ee As String, a As Long
     myDate = Date ' enregistre la date d'aujourd'hui dans la variable myDate
     
    myMonth = (Month(myDate))  ' No du mois précédent
    myYear = Year(Date) 'No année
    ee = ""
    recom:
    Verif = False
    Nom = InputBox("Définissez le nom du nouveau client svp", "Ajout nouveau client") & "" & (myMonth) & " - " & myYear
     
    If Nom = "" Then Exit Sub
     
    For i = 1 To Sheets.Count
        If Workbooks("C-CLIENT").Sheets(i).Name = Nom Then Verif = True
    Next
     
    If Verif = True Then
        MsgBox "la feuille " & Nom & " existe déjà, veuillez choisir un autre nom"
        GoTo recom
    End If
     
    Workbooks("C-CLIENT").Sheets.Add(After:=Sheets(Sheets.Count)).Name = Nom
            Application.ScreenUpdating = False
            Workbooks("C-CLIENT").Sheets(1).Activate
            Range("A1:Q3").Select
            Selection.Copy
            Workbooks("C-CLIENT").Sheets(Nom).Activate
            Range("A1").Select
            ActiveSheet.Paste
            'On copie colle uniquement le format des colonnes
            Workbooks("C-CLIENT").Sheets(1).Activate
            Columns("A:Q").Select
            Selection.Copy
            Workbooks("C-CLIENT").Sheets(Nom).Activate
            Range("A1").Select
            Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
            Application.ScreenUpdating = True
    Unload Me
    UserForm1.Show
    End Sub
      0  0

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Saut,

    Pas de problème, Dorel.

    Si tu codes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To Sheets.Count
        If Workbooks("AVIONS").Sheets(i).Name = Nom Then Verif = True
    Next
    VBA ira balayer toutes les feuilles de ton classeur.
    Quand bien même, une feuille verrait son nom toppé, la feuille suivante ne l'aurait pas.

    Si tu testes "mercatog" et si les feuilles de ton classeur (dans l'ordre d'indice) se nomment "mercatog", "Theze" , alors ta variable booléenne va prendre la valeur Vrai puis Faux.
    Ce qui revient à dire que ta boucle doit s'interrompre dès que la valeur est Vrai.
    Ce qui implique ainsi une sortie anticipée de la boucle (Exit For).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Initialisation
    Verif = False
     
    For i = 1 To Sheets.Count
        If Workbooks("AVIONS").Sheets(i).Name = Nom Then
             Verif = True
              Exit For
        End If
    Next i
    Cela dit, et j'en ai pris conscience récemment, cette méthodologie dénature quelque peu l'objet d'une boucle qui est de balayer toutes les occurrences présentes.

    Mieux vaut alors utiliser une boucle qui va s'exercer tant que la valeur est fausse et que toutes les feuilles n'ont pas été toutes testées au niveau de leur nom.
    C'est le code que je t'ai proposé.

    Pour le contrôle du code, dans le menu VBE (ALT + F11), Choisir Menu "Affichage \ Fenêtre variables locales".

    Placer un point d'arrêt (Clic dans la marge au regard du code) pour placer un point d'arrêt.

    Lancer la procédure (bouton valider au autre)

    Lorsque le débugger s'arrêtera sur la ligne de ce point, dérouler le programme en pas à pas (F8)

    Tu verras alors la valeur de la variable "Nom" dans la fenêtre. C'est cette valeur qu'il t'appartient de contrôler puis, éventuellement, de modifier la déclaration de la variable Nom

    Tu peux dans un premier temps tester ton code avec le seul apport Exit For, puis tester avec le code que je te propose (Do…)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If ExistFeuillle(Nom) = False Then
    Juste un commentaire, pour ce genre de test, il est plus souple d'utiliser une fonction retournant une valeur booléenne.
      0  0

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il ne sert à rien de commencer une deuxième discussion sur le même sujet. Ca laisse sous-entendre aux gens qui ont la patience (et c'est un euphémisme) de t'aider dans celle-ci que leurs efforts ne servent à rien.

    Tu dis être un novice en VBA. Je pense qu'un apprenti maçon ne s'essaie par à la construction d'une cathédrale pour son premier travail. De même, tu t'attaques à un gros morceau (traiter par code des manipulations sur deux classeurs à la fois) alors que tu ne sais pas pas coder ( ce n'est pas une critique, c'est un constat, on est tous passés par la case débutants). De plus, Excel n'est a priori pas l'outil pour gérer ce genre de choses.

    Peut-être devrais-tu commencer par traiter tout dans un même classeur. Je doute que les infos soient si nombreuses qu'il soit nécessaire de splitter sur plusieurs classeurs. Si c'était le cas, cela confirmerait qu'Excel n'est pas le bon outil.

    Si tu veux programmer, tu dois suivre les règles de la programmation, et ce dès le début de ton apprentissage, sinon tu vas droit dans le mur et tu produiras un code qui ne peut qu'être pourri.

    Règles de base:
    1. Ecrire ce que l'on a devant soi, où on veut aller et entre les deux, les étapes pour réaliser l'objectif;
    2. Voir si l'on se sent capable de réaliser chaque étape du travail. Es-tu armé en VBA pour réaliser chaque étape de ton objectif? Et juste avant cette question, une autre tout aussi importante: Es-tu armé en EXCEL pour réaliser ce travail si tu devais le faire à la main?



    Je pense honnêtement que pour la seconde règle, la réponse est non. Ce n'est pas un jugement de valeur... Au passage, programmer, même du VBA pour Excel, c'est normalement un métier auquel on se forme et certains, dont moi, en ont fait leur business. Cela veut dire qu'au delà de quelques lignes de code pour bidouiller, il va falloir apprendre, et je pense que ce que tu souhaites réaliser demande des apprentissages et doit s'appuyer sur des prérequis que tu ne possèdes pas. Il serait à mon avis judicieux de réduire la voilure et de t'attaquer à moins gros morceau

    Néanmoins, si tu souhaites persister dans ce que j'appellerais un mauvais choix, il faut:
    • découper chaque étape en petites procédures et fonctions qui ont une seule responsabilité, facilement testables, utilisables par la suite comme des briques de légo;
    • Eviter de mettre des valeurs en dur dans ton code;
    • Associer les petites procédures/fonctions entre elles comme tu le ferais pour construire en maison en Légos;
    • ...
    • ...
    • ...



    Nous sommes à une quarantaine de messages dans cette discussion qui ne peut clairement mener à rien. Dans cent messages, nous en serons toujours à te demander ce qu'il y a dans telle variable, quel est le classeur actif, etc, etc...

    Je ne vois pas ce qu'on peut faire de plus...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------
      4  0

Discussions similaires

  1. Gerer deux classeurs avec un seul userform
    Par Dorel.D dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/03/2020, 16h50
  2. Impression de deux pages avec un seul lien
    Par gantec dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 28/08/2007, 17h04
  3. utiliser deux formulaire avec une seule action
    Par fouyou dans le forum Struts 1
    Réponses: 4
    Dernier message: 28/05/2007, 20h40
  4. Comment ouvrir deux pages avec un seul lien ?
    Par tiliut dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/05/2007, 17h43
  5. Ouvrir deux pages avec un seul form
    Par coco38 dans le forum Langage
    Réponses: 4
    Dernier message: 30/04/2007, 14h19

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