Ouvrir un classeur depuis un autre classeur et l'activer

Y compris Power BI, Power Query et toute autre question en lien avec Excel
j
jpclutier
Jeune membre
Jeune membre
Messages : 23
Inscrit le : 25 avril 2019
Version d'Excel : 2010

Message par jpclutier » 16 septembre 2019, 16:55

Bonjour à tous,

J'ai un classeur Excel 2010 depuis lequel je souhaite ouvrir un autre classeur et activer ce dernier.
Bien entendu cela ne fonctionne pas.
Voici un extrait de mon code :
...
'choix du fichier, ajout et sélection de la feuille
chaine1 = "Tableaux"
resultat1 = Ouvre()
Workbooks(resultat1).Activate
...

Function Ouvre()
Dim wbMyWb As Workbook
Dim Nom_Fichier As Variant
 
Nom_Fichier = Application.GetOpenFilename("Fichiers Excel , *.xls; *.xlsx")
If Nom_Fichier <> False Then
 Set wbMyWb = Workbooks.Open(Nom_Fichier)
 ' wbMyWb.Activate
 Ouvre = Nom_Fichier
End If
 
End Function

L'erreur est erreur 9 indice n'appartient pas à la sélection
Merci de votre aide
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'481
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 16 septembre 2019, 18:06

Bonjour,

Essayer ce code :
    'choix du fichier, ajout et sélection de la feuille
    chaine1 = "Tableaux"
    resultat1 = Ouvre()
    If resultat1 <> Empty Then Workbooks(resultat1).Activate
    '...

Function Ouvre()
    Dim wbMyWb As Workbook
    Dim Nom_Fichier As Variant
     
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel , *.xls; *.xlsx")
    Ouvre = Empty
    If Nom_Fichier <> False Then
        Set wbMyWb = Workbooks.Open(Nom_Fichier)
        Ouvre = wbMyWb.Name
    End If
End Function
j
jpclutier
Jeune membre
Jeune membre
Messages : 23
Inscrit le : 25 avril 2019
Version d'Excel : 2010

Message par jpclutier » 17 septembre 2019, 08:41

Merci pour ce bout de code. Il n'y a plus l'erreur. Par contre la feuille (chaine1) s'ajoute dans le fichier dans lequel il y a le code mais pas dans le fichier que je viens d'ouvrir et, à priori, d'activer.
...
chaine1 = "Tableaux"
resultat1 = Ouvre()
If resultat1 <> Empty Then Workbooks(resultat1).Activate

resultat2 = ajout_feuille(chaine1)
With Worksheets(chaine1)
.Activate
End With
...
Function ajout_feuille(Nom)
Dim i As Byte, Verif As Boolean
 
Verif = False
If Nom = "" Then Exit Function
 
For i = 1 To Sheets.Count
 If Sheets(i).Name = Nom Then Verif = True
Next
Select Case Verif
 Case Is = True
  MsgBox "la feuille " & Nom & " existe déjà, veuillez choisir un autre nom"
 Case Else
  Sheets.Add(after:=Sheets(Sheets.Count)).Name = Nom
End Select
End Function
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'481
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 17 septembre 2019, 10:44

Bonjour,

Alors, essayer plutôt ce code
    Dim resultat1 As Workbook, nom As String
    
    'choix du fichier, ajout et sélection de la feuille
    chaine1 = "Tableaux"
    Call Ouvre(resultat1)
    If Not resultat1 Is Nothing Then
        resultat1.Activate
        nom = chaine1: Call ajout_feuille(ActiveWorkbook, nom)
        If nom <> Empty Then ActiveWorkbook.Sheets(nom).Activate
    End If
    '...



Sub Ouvre(wbMyWb As Workbook)
    Dim Nom_Fichier As Variant
     
    Nom_Fichier = Application.GetOpenFilename("Fichiers Excel , *.xls; *.xlsx")
    If Nom_Fichier <> False Then Set wbMyWb = Workbooks.Open(Nom_Fichier)
End Sub

Sub ajout_feuille(classeur As Workbook, nom As String)
    Dim i As Byte, Verif As Boolean
     
    If nom = Empty Then Exit Sub
     
    Verif = False
    For i = 1 To classeur.Sheets.Count
        If Sheets(i).Name = nom Then Verif = True
    Next
    Select Case Verif
        Case True
            MsgBox "la feuille " & nom & " existe d?j?, veuillez choisir un autre nom"
            nom = Empty
        Case False
            classeur.Sheets.Add(after:=Sheets(Sheets.Count)).Name = nom
    End Select

End Sub

j
jpclutier
Jeune membre
Jeune membre
Messages : 23
Inscrit le : 25 avril 2019
Version d'Excel : 2010

Message par jpclutier » 17 septembre 2019, 11:40

Merci Thev.
Il exécute bien le call ouvre(resultat1) sauf qu'un espion sur resultat1 renvoi du vide à priori et sur le Workbooks(resultat1).Activate il y a l'erreur 13 incompatibilité de type...
Je deviens fou avec ce truc qui semble simple pourtant...
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'481
Appréciations reçues : 209
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 17 septembre 2019, 12:12

jpclutier a écrit :
17 septembre 2019, 11:40
Il exécute bien le call ouvre(resultat1) sauf qu'un espion sur resultat1 renvoi du vide à priori et sur le Workbooks(resultat1).Activate il y a l'erreur 13 incompatibilité de type...
Dans la nouvelle version du code que je t'ai transmise, resultat1 n'est plus une variable chaîne mais une variable objet de type WorkBook. Donc : "resultat1.Activate" et non "Workbooks(resultat1).Activate"
j
jpclutier
Jeune membre
Jeune membre
Messages : 23
Inscrit le : 25 avril 2019
Version d'Excel : 2010

Message par jpclutier » 17 septembre 2019, 12:15

Oups...oui en effet mille excuse...je suis allé un peu vite dans la recopie du code donné.
Merci cela fonctionne.
j
jpclutier
Jeune membre
Jeune membre
Messages : 23
Inscrit le : 25 avril 2019
Version d'Excel : 2010

Message par jpclutier » 18 septembre 2019, 10:03

En fait cela fonctionnait car les deux classeurs avaient le même nombre de feuille.
J'ai modifié la ligne
If Sheets(i).Name = nom Then Verif = True
par
If classeur.Sheets(i).Name = nom Then Verif = True
et cela fonctionne.
Merci encore.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message