Erreur d'exécution VBA
Bonjour à tous,
Je commence à utiliser VBA en réalisant de simples macro.
Je suis confrontée à une erreur d'exécution que je ne comprends pas.
Je souhaite ouvrir un classeur excel afin de copier une feuille déjà existante et la coller dans mon classeur de travail.
Mon problème est que je rencontre une erreur au niveau de la ligne soulignée ci-dessous et je ne comprends pas pourquoi...
Voici la macro que j'ai faite :
Sub test()
Dim classeurSource As Workbook
Dim classeurActuel As Workbook
Dim FeuilleSource As Worksheet
Dim FeuilleInsere As Worksheet
'Définition du chemin d'accès et le nom du classeur source
Dim cheminSource As String
cheminSource = Sheets("Procédure").Range("CHEMIN_RDD_SAL_COURANT").Value
classeurSource = Sheets("Procédure").Range("NOM_RDD_SAL_COURANT").Value
'Définition du nom de la feuille à insérer
Dim nomFeuille As String
nomFeuille = "RDD_SAL_COURANT"
'Vérifier si le classeur source est ouvert, sinon l'ouvrir
On Error Resume Next
Set classeurSource = Workbooks(nomFeuille)
On Error GoTo 0
If classeurSource Is Nothing Then
Set classeurSource = Worksbooks.Open(cheminSource)
End If
'Vérif si la feuille source existe dans le classeur source
On Error Resume Next
Set classeurSource = classeurSource.Sheets(nomFeuille)
On Error GoTo 0
If FeuilleSource Is Nothing Then
MsgBox "La feuille spécifiée n'existe pas dans le classeur source"
Exit Sub
End If
'Référence au classeur actuel
Set classeurActuek = ThisWorkbook
'Insérer une nouvelle feuille dans le classeur actuel
Set feuilleInseree = classeurActuel.Sheets.Add(After:=classeurActuel.Sheets(classeurActuel.Sheets.Count))
'Copier le contenu de la feuille source dans la feuille insérée
FeuilleSource.Copy Before:=feuilleInseree
'Fermer le classeur sans enregistrer les modifications
classeurSource.Close SaveChanges:=False
End Sub
Edit modo : merci de mettre le code entre balises SVP avec le bouton </>
Merci de votre aide!
Marie
le résultat de la ligne sera normallement un string ou numérique et jamais un workbook.
Ce fichier est-il déjà ouvert ???
set classeurSource = workbooks(Sheets("Procédure").Range("NOM_RDD_SAL_COURANT").Value) ???
le reste de la macro est vague, quel sont les noms de la feuille et du fichier ? Ces plages nommées, elles existent ? Pouvez-vous nous joindre votre fichier ?
Bonjour Bart,
Non le fichier n'est pas ouvert!
Bart,
Cela m'ennuie de joindre le fichier car ce sont des données professionnelles. Néanmoins les plages définies existent bien :
Sheets("Procédure").Range("CHEMIN_RDD_SAL_COURANT") : correspond au chemin du fichier
classeurSource = Sheets("Procédure").Range("NOM_RDD_SAL_COURANT") : correspond au nom du fichier excel que je veux ouvrir
Bonjour à tous,
oui mais tu as définis classeurSource As Workbook, il attend donc un objet classeur (ouvert)
Sers-toi de tes chaine chemins/nom classeur pour l'ouvrir et l'affecter à ta variable classeurSource.
eric
Bonjour Eric,
Merci pour ta réponse. Cependant je suis désolée je ne comprends pas ce que tu veux dire. Je suis débutante en VBA et ça reste encore un peu confus pour moi :(
Marie
Bonjour,
utiliser l'outil <code> quand tu en mets qu'il soit lisible :
![image](https://forum.excel-pratique.com/file/img/1/9744_6471374823765723767629.png)
J'ai mis des '**** sur les lignes ajoutées ou modifiées.
Il reste peut-être des erreurs, on ne sait pas ce que contiennent tes cellules faute de classeur, et je n'ai pas regardé au-delà de ton erreur
Sub test()
Dim classeurSource As Workbook ' ***** c'est un objet classeur
Dim classeurActuel As Workbook
Dim FeuilleSource As Worksheet
Dim FeuilleInsere As Worksheet
'Définition du chemin d'accès et le nom du classeur source
Dim cheminSource As String
Dim nomFichierSource As String '!**** c'est une chaine
cheminSource = Sheets("Procédure").Range("CHEMIN_RDD_SAL_COURANT").Value
nomFichierSource = Sheets("Procédure").Range("NOM_RDD_SAL_COURANT").Value '!****** chaine
'Définition du nom de la feuille à insérer
Dim nomFeuille As String
nomFeuille = "RDD_SAL_COURANT"
'Vérifier si le classeur source est ouvert, sinon l'ouvrir
On Error Resume Next
Set classeurSource = Workbooks(nomFichierSource) '****
On Error GoTo 0
If classeurSource Is Nothing Then
Set classeurSource = Worksbooks.Open(cheminSource & "\" & nomFichierSource) '!****** objet classeur
' ne pas ajouter & "\" s'il est déjà inclus dans cheminSource (?)
End If '
'Vérif si la feuille source existe dans le classeur source
On Error Resume Next
Set classeurSource = classeurSource.Sheets(nomFeuille) ' !*****????? classeurSource pour une feuille ?????
On Error GoTo 0
If FeuilleSource Is Nothing Then
MsgBox "La feuille spécifiée n'existe pas dans le classeur source"
Exit Sub
End If
'Référence au classeur actuel
Set classeurActuek = ThisWorkbook '*******??????
'Insérer une nouvelle feuille dans le classeur actuel
Set feuilleInseree = classeurActuel.Sheets.Add(After:=classeurActuel.Sheets(classeurActuel.Sheets.Count))
'Copier le contenu de la feuille source dans la feuille insérée
FeuilleSource.Copy Before:=feuilleInseree
'Fermer le classeur sans enregistrer les modifications
classeurSource.Close SaveChanges:=False
End Sub
Tu dois copier directement la feuille, pas besoin d'en insérer une qui restera vierge.Sheets("Feuil1").Copy Before:=Workbooks("Classeur2").Sheets(Sheets.Count)
eric
Bonjour Eric,
Merci pour tes explications et les correction!
Je vois déjà une amélioration, la macro va maintenant sans erreur jusqu’à la vérification du nom de la feuille dans mon fichier source.
En revanche j’ai un message disant que la feuille source n’existe pas alors que si… étonnant.
Bonjour,
Iil faut dire quelle ligne en erreur et le message.
Possiblement une faute de frappe, ou une espace dans le nom de l'onglet
Si possible joindre un fichier anonymisé réduit au minimum avec le pb
Pense à utiliser l'outil </> si tu colles un code.
eric
Bonjour Eric,
Voici l'endroit où la ligne de code bug :
If FeuilleSource Is Nothing Then
MsgBox "La feuille spécifiée n'existe pas dans le classeur source"
Exit Sub
End If
J'ai vérifié mon fichier source, le nom est exactement le même.
J'ai préparé deux fichiers que je joins à ce message en réduisant les infos au maximum pour qu'effectivement tu puisses comprendre ce je souhaite faire.
D'autre part ici je dis d'insérer la feuille copiée :
'Insérer une nouvelle feuille dans le classeur actuel
Set feuilleInseree = classeurActuel.Sheets.Add(After:=classeurActuel.Sheets(classeurActuel.Sheets.Count))
'Copier le contenu de la feuille source dans la feuille insérée
FeuilleSource.Copy Before:=feuilleInseree
Après réflexion ce que je veux faire c'est copier la feuille RDD_SAL_COURANT de mon fichier source et la coller dans l'onglet effectif de mon fichier de destination. Ainsi la feuille effectif de mon fichier de destination sera rafraichie à chaque lancement de la macro.
fichier-source.xlsm
Je remets les fichiers ici car j'ai l'impression que cela n'a fonctionné.
Bonjour,
Merci d'indiquer le nom de la macro et le module ou elle est`.
J'ai commencé à chercher mais ça m'a saoulé. C'est à toi de fournir tous les détails sans qu'on ait à les demander...
Après réflexion ce que je veux faire c'est copier la feuille RDD_SAL_COURANT de mon fichier source et la coller dans l'onglet effectif de mon fichier de destination. Ainsi la feuille effectif de mon fichier de destination sera rafraichie à chaque lancement de la macro.
C'est ce que fait l'unique ligne de code que je t'ai mise.
Il faut juste adapter les noms
eric