Erreur 9 après ouverture de 2 classeurs en simultané

Ynwa_57

XLDnaute Nouveau
Bonjour le forum !

J'ai créé une application de gestion de base de données et j'ai terminé à part une chose qui me tracasse.

Sur un UF, un bouton me permet d'ouvrir une feuille excel d'un autre document.

Pour ceci, pas de soucis avec le code suivant :

Code:
Private Sub FormsB_Click()

Application.Visible = True

Application.ScreenUpdating = True

Workbooks.Open Filename:="C:\Documents and Settings\User\Mes documents\Partie Qualité\TAR.xlsx"
Sheets("feuil1").Select
ActiveWindow.DisplayWorkbookTabs = False 

Me.Hide

End Sub


Pas de soucis si j'utilise cette fonction dès le départ.

En revanche, si j'utilise d'autres fonctions telles que la saisie ou la recherche, j'utilise un premier classeur, directement lié à ma programmation VBA.

De ce fait, ce classeur est donc activé.

Lorsque je veux ensuite ouvrir le 2ème classeur où se trouve mon document ("TAR"), j'ai le message d'erreur suivant :

"Erreur d'éxecution n°9.
L'indice n'appartient pas à la selection"

Lorsque je lance le débogueur, il me surligne la ligne :

Code:
Sheets("RequestInfo").Select

J'ai compris que cela venait du fait que j'ai 2 classeurs ouverts en même temps, mais je ne peux pas fermer le premier classeur car l'application en est dépendante, et que même si je voulais fermer/sauvegarder le premier classeur avec l'appli et revenir dessus, la sauvegarde prend du temps et puis c'est pas pratique.
De plus, la ligne surlignée provient d'un code où il y a un "If", dans un bouton d'un autre UF, et où d'autres "Sheets("...").Select" sont présents avant mais ne sont pas surlignés ...

Je ne peux pas mettre mon 2ème classeur dans le premier car il s'agit d'un formulaire à remplir, qui s'ouvre en lecture seule et que les utilisateurs devront sauvegarder à part.



Enfin, dernier réglage à effectuer, mon application fonctionne avec excel caché, lorsque je veux ouvrir le formulaire, je suis obligée d'afficher excel, mais je voudrais que mon premier classeur ne s'affiche pas pour éviter les utilisateurs d'avoir accès à la base de données.

Est-ce possible ?

Merci par avance pour votre aide :)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Ynwa, bonjour le forum,

Comme dans ce cas le classeur actif n'est pas le classeur contenant l'onglet, cela génère une erreur. Pour éviter ça, tu dois spécifier le classeur puis l'onglet. Essaie comme ça :
Code:
WorkBooks("nom_de_ton_classeur").Activate
Sheets("RequestInfo").select
 

Ynwa_57

XLDnaute Nouveau
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Robert :)

Merci pour ta proposition mais le problème persiste ...

Je l'ai mit après l'ouverture du document (ce qui me semble logique...).



Code:
Private Sub FormsB_Click()

Application.Visible = True

Application.ScreenUpdating = True

Workbooks.Open Filename:="C:\Documents and Settings\User\Mes documents\Partie Qualité\TAR.xlsx"
Workbooks("TAR.xlsx").Activate
Sheets("Feuil1").Select
ActiveWindow.DisplayWorkbookTabs = False 

Me.Hide

End Sub

Toujours la même ligne surlignée ...


Pour "Workbooks("TAR.xlsx").Activate" devrais-je mettre tout le chemin ou seul le nom suffit ?
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Ynwa, bonjour le forum,

Non ça devrait fonctionner comme ça, pas besoin du chemin puisque le classeur est déjà ouvert...
Je ne comprends pas dans ton premier post tu parles de l'onglet RequestInfo et maintenant il est devenu Feuil1 ? Tu dois toujours activer d'abord le classeur puis l'onglet dans tous les cas...
Vérifie aussi l'orthographe des onglets qui doit être absolumentidentiqueau nom mentionné dans le code...
 

Ynwa_57

XLDnaute Nouveau
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Re,

En fait, j'ai un classeur qui s'ouvre avec l'application (que j'appellerai "Classeur1" car il porte le nom de mon entreprise).
Dans ce classeur, il y a l'onglet "RequestInfo" qui est surligné.


Mon problème survient lorsque je cherche à ouvrir le 2ème classeur, nommé "TAR" et pour lequel je souhaiterai ouvrir l'onglet "Feuil1".
Ce classeur n'est à la base pas ouvert.


Lorsque je souhaite l'ouvrir par la macro, tout se passe bien si c'est la première manipulation de l'application.
Si j'utilise d'autres fonctionnalités, qui elles-mêmes utilisent les feuilles du "Classeur 1", et qui rendent donc le "Classeur 1" actif, la macro qui me sert à ouvrir le classeur "TAR" génère le message d'erreur 9.


Désolée pour les explications qui n'étaient pas claires et merci pour ton temps, c'est mieux ainsi ?



YNWA
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Ynwa, bonjour le forum,

Peut-être alors avec une gestion d'erreur du type :
Code:
Private Sub FormsB_Click()

Application.Visible = True

Application.ScreenUpdating = True

On Error Resume Next
Workbooks.Open Filename:="C:\Documents and Settings\User\Mes documents\Partie Qualité\TAR.xlsx"
If Err<>0 Then Err = 0
Workbooks("TAR.xlsx").Activate
Sheets("Feuil1").Select
ActiveWindow.DisplayWorkbookTabs = False 

Me.Hide

End Sub
 

Ynwa_57

XLDnaute Nouveau
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Re Robert, Re le forum

Merci pour cette nouvelle proposition

Ca ne fonctionne toujours pas mais les sources de l'erreur sont clairement identifiées maintenant.
Je ne sais pas si c'était le cas avant ton 2e code, mais j'ai remarqué que le message d'erreur ne se générait que lorsque j'effectuais un certains type de manipulation et une recherche plus particulièrement par numéro d'identification.

Mais bizarrement, lors du débogage, les lignes surlignées ne correspondent pas au code de la recherche par ID mais plutôt à la recherche à effectuer si je n'entre pas l'ID (une recherche de tous les éléments compris entre 2 dates) illustrée par ce code :

Code:
'Plus haut, code de recherche par ID

If Me.IdResearch2.Value = "" And Me.OpeS.Value = "" Then
    Sheets("RequestInfo").Select
    'suppression des filtre s'il existent sur requestInfo
    If Worksheets("Requestinfo").AutoFilterMode Then    ' filtre existant
        If Worksheets("Requestinfo").FilterMode = True Then    ' filtre avec selection
            ' suppression des selections
            Sheets("RequestInfo").ShowAllData
        End If
    Else  ' création du filte
        Range("A1").AutoFilter
    End If
    ' filtrer sur les dates toujours présentes
    Selection.AutoFilter Field:=3, Criteria1:=">=" & Format(CDate(Date1.Value), "mm/dd/yyyy"), _
                         Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Date2.Value), "mm/dd/yyyy")
'....
'Autres critères de recherche 
'....
End If

Dans le même bouton, il y a la recherche par numéro d'ID, sans numéro d'ID et par d'autres critères.

Lors du débogage pas à pas, la ligne surlignée est toujours la même : " Sheets("RequestInfo").Select "
Si je désactive cette ligne, une 2ème est surlignée " If Worksheets("Requestinfo").AutoFilterMode Then "
Et ainsi de suite pour toutes les lignes concernant la feuille "Requestinfo" et je sais que l'orthographe est correct puisque lorsque j'effectue ma recherche, tout fonctionne ...

Aussi, une autre feuille pose ce problème, une feuille qui me sert à recupérer les lignes visibles de ma recherche après avoir appliqué le filtre.

N'y a-t-il pas une formule magique pour désactiver le classeur complet ?
Je ne comprends pas pourquoi VBA a ce problème malgré l'activation du 2ème classeur par :
Code:
Workbooks("TAR.xlsx").Activate
Sheets("Feuil1").Select


Merci par avance pour tes lumières
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Ynwa, bonjour le forum,

Je ne peux que te conseiller de déclarer deux variables pour tes classeurs, de les définir et, partout où tu nommes un onglet dans ton code, tu le fais précéder par la variable du classeur.
Exemple :
Code:
Dim Cl1 As WorkBook
Dim Cl2 As WorkBook

Set Cl1 = Workbooks("Nom_du_classeur_1.extension")
Set Cl2 = Workbooks("Nom_du_classeur_2.extension")
If Cl1.Sheets("RequestInfo)").AutoFiltermode Then...

Tu peux ainsi agir n'importe où dans l'un où l'autre des classeurs et de ces onglets. Mais à partir du moment où tu sélectionnes il te faut toujours spécifier Classeur/Onglet/Plage.
On peut écrire par exemple, en reprenant les variables au dessus :
Code:
Cl1.Sheets("Feuil1").Range("A1").Copy Cl2.Sheets("Feuil2").Range("B1")
qui copie A1 de l'onglet Feuil1 du classeur Cl1 et le colle dans B1 de l'onglet Feuil2 du classeur Cl2. Quel que soit l'onglet et le classeur actif, ce code va fonctionner. Mais si on sélectionne il faudra écrire :
Code:
Cl1.Activate
Sheets("Feuil1").Activate
Range("A1").Copy
Cl2.Activate
Sheets("Feuil2").Activate
Range("B1").Paste
Sinon tu risques d'avoir un plantage si le nom de l'onglet n'existe pas dans le classeur actif. En résumé tu dois revoir tout ton code, essayer de supprimer tous les Select dans la mesure du possible car il ralentissent considérablement l'exécution du code ou alors spécifier à chaque fois Classeur/Onglet/plage... L'utilisation du With... End With est souvent bien pratique...
 

Ynwa_57

XLDnaute Nouveau
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Robert, Bonjour le forum,

Ca en fait des modifications ... Surtout quand l'appli est finie :(

Mais je vais faire ça et je reviendrais donner des nouvelles quand ça sera fait.

Pour With et End With, j'ai un peu de mal avec cette fonction ...

Merci Robert pour tes solutions et tes conseils

A bientôt !
 

Ynwa_57

XLDnaute Nouveau
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Bonjour Robert, bonjour le forum,

C'était long, c'était embêtant, mais ça en valait la peine !

Déclarer les classeurs à chaque fois fait tout fonctionner, sans aucun problème ni conflit !

Merci beaucoup Robert ;)
 

Jam

XLDnaute Accro
Re : Erreur 9 après ouverture de 2 classeurs en simultané

Salut Ynwa, Robert ;), Le Forum,

Ca m'étonne très fortement de Robert, mais il a zappé une solution beaucoup plus simple et rapide.
Bon, pour la déclaration de variable, il a mille fois raison. C'est un principe qu'il faut se forcer à respecter.
Par contre tu peux transférer des cellules ou des lignes directement d'un classeur à un autre SANS les activer ou les sélectionner. Et ça va incomparablement plus vite.
Attention, la précision qu'il faut apporter, c'est qu'on parle ici de "copier/coller" de valeur uniquement.
Ca s'écrit comme ça (attention il y a une subtilité que j'explique dans le code):
VB:
Sub Test()
Dim wkbSource As Workbook   '# Variable pour le classeur Source
Dim wksDest As Worksheet     '# Variable pour la feuille Destination

'# Déclaration du classeur Source
Set wkbSource = Workbooks("monClasseurSource.xlsx")
'# Declaration de la feuille Destination
Set wksDest = ThisWorkbook.Worksheets("maFeuilleDestination")


'# Pour une cellule (Attention il faut utiliser Cells impérativement et pas Range sauf dans la source où c'est possible)
wksDest.Cells(1, 1).Value = wkbSource.Worksheets("maFeuilleSource").Range("B2").Value

'# Pour une ligne entière (on "colle" la ligne 3 du classeur source dans la ligne 2 du classeur destination)
Feuil1.Rows(2).Value = wkbSource.Worksheets("maFeuilleSource").Rows(3).Value

'# On décharge les variables de la mémoire
Set wksDest = Nothing
Set wkbSource = Nothing

End Sub

Bon courage
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 319
Membres
103 177
dernier inscrit
grizly