Problème objet ou variable non définie
Je cherche à copier les données d'un tableau1 d'une feuille d'un document excel vers une feuille d'un autre document excel tout en ne copiant les lignes du tableau1 que si à la cellule Ni de la ligne le mot "dure" est contenu dans la cellule.
J'ai l'erreur d'exécution 91 : variable objet ou variable de bloc With non définie. Pourtant j'ai l'impression que toutes mes variables sont définies.
Si quelqu'un arrive à repérer l'erreur car mon système de débogage souligne la première ligne du code...
Merci beaucoup, bonne journée !
Voici le code que j'ai pour le moment :
Private Sub extraire()
Dim fichierSource As Workbook
Dim fichierDestination As Workbook
Dim feuilleSource As Worksheet
Dim feuilleDestination As Worksheet
'spécifier le nom du fichier source et la feuille à copier'
Set fichierSource = Workbooks.Open("O:chemind'accès.xlsx")
Set feuilleSource = fichierSource.Sheets("classement")
'spécifier le nom du fichier destination et la feuille où coller les données'
Set fichierDestination = Workbooks.Open("O:chemind'accès2.xlsm")
Set feuilleDestination = fichierDestination.Sheets("rdv")
'variable = le mot recherché'
Dim dure As String
dure = "dure"
Dim derniereligne As Long
Dim dernierelignetableau As Long
Dim i As Long
Dim tableau As Variant
'déterminer la dernière ligne de la première colonne'
derniereligne = Cells(Rows.Count, 1).End(xlUp).Row
'référencer le tableau existant où les lignes doivent être copiées'
Set tableau = feuilleDestination.Range("A2:N2")
'déterminer la dernière ligne où va être copié notre ligne'
dernierelignetableau = tableau.Rows.Count
'boucle qui passe par chaque cellule de la nième colonne'
For i = 1 To derniereligne
Dim cellule As Range
Set cellule = Cells(i, 14)
'cherche si le mot dure est dans la cellule Ni'
If InStr(1, cellule.Value, dure, vbTextCompare) > 0 Then
'copie la ligne existante dans le tableau existant'
dernierelignetableau = dernierelignetableau + 1
Range("A" & i & ":N" & i).Copy Destination:=tableau.Cells(dernierelignetableau, 1)
End If
Next i
End SubBonjour,
C'est sur cette ligne ?
Set fichierSource = Workbooks.Open("O:chemind'accès.xlsx")Si oui, c'est que le code ne trouve pas votre fichier Xlsx
Vous devriez déjà essayer sans l'apostrophe. ON ne le dit jamais assez. évitez les accents, les espaces dans le nom des feuilles et fichier. Avec VBA cela apporte souvent des soucis
Vous êtes sous MAC là ?
Bonjour Carla,
dans votre macro, vous avez 2 classeurs ouverts, fichierSource, fichierDestination et vous souhairez travailler sur 2 feuilles feuilleSource et feuilleDestination.
Pour vous référer à un objet d'une feuille, une feuille d'un classeur, il faut indiquer le parent, (pour la feuille active par exemple: ActiveSheet.) .
ET dans votre première ligne feuilleDestination, si c'est bien sur cette feuille que vous souhaitez connaitre la dernière ligne de la colonne A
derniereligne = feuilleDestination.Cells(Rows.Count, 1).End(xlUp).RowJe n'avais pas vu le message de Dan mais ma remarque reste valable
Bonjour, j'ai mis des chemins d'accès fictifs car je suis sur le réseau de mon entreprise que je ne veux pas dévoiler, mais je ne pense pas que l'erreur vienne d'ici car j'ai fait attention de récupérer le chemin d'accès en copiant directement sur les propriétés du document.
Dans le chemin que j'utilise il n'y a pas d'apostrophe. Je suis sur HP.
Et le débogage excel ne m'identifie pas la ligne quand je force à détailler il me met que c'est sur la première ligne qui définie la fonction.
Merci de votre aide
j'ai mis des chemins d'accès fictifs
vérifiez que vous avez bien le \ dans le répertoire .. donc O:\chemin....
Et le débogage excel ne m'identifie pas la ligne quand je force à détailler il me met que c'est sur la première ligne qui définie la fonction.
Donnez plutôt la ligne qui est identifiée
Bonjour,
Je ne suis pas sûre de comprendre comment insérer le parent de mes feuilles, je pensais que la partie fichierSource.sheet de la ligne fichierSource.Sheets("rdv") indiquait que ma feuille provenait du document fichierSource définit auparavant et pareil avec fichierDestination.Sheets("classement").
J'ai donc modifié, si je ne m'emmêle pas les pinceaux c'est la dernière ligne du fichier source que je cherche :
'déterminer la dernière ligne de la première colonne'
derniereligne = feuilleSource.Cells(Rows.Count, 1).End(xlUp).RowMerci beaucoup !
Je vous met un chemin d'accès en modifiant le moins possible :
Set fichierDestination = Workbooks.Open("O:\_COMMUN\TEAM\monprenom\rdv.xlsm")Normalement il n'y a pas d'oublis de \.
Et étrangement le logiciel VBA ne m'identifie pas la ligne à laquelle se réfère l'erreur c'est pour cela que je force un débogage détaillé sans grand succès. Il m'est alors difficile d'identifier l'erreur.
Merci Dan
Oui, c'est bien cela mais dans ces lignes
derniereligne = Cells(Rows.Count, 1).End(xlUp).Row
Set cellule = Cells(i, 14)
Range("A" & i & ":N" & i).Copy Destination:=tableau.Cells(dernierelignetableau, 1)Sans autre précision, la cellule, plage ... pointe sur la feuille active.
C'est peut-être correct mais il est préférable d'éliminer tout risque d'erreur en précisant le "parent", comme ceci par exemple où le parent serait feuilleDestination.
derniereligne = feuilleDestination.Cells(Rows.Count, 1).End(xlUp).Row
Set cellule = feuilleDestination.Cells(i, 14)
feuilleDestination.Range("A" & i & ":N" & i).Copy Destination:=tableau.Cells(dernierelignetableau, 1)Après correction des parents j'ai l'impression que mon code fonctionne du moins il se lance.
Le nouveau problème c'est que le fichier source est ouvert (celui-ci ne contenant aucune macro) mais le code échoue en m'ouvrant la fenêtre "microsoft a identifé un problème de sécurité potentiel" et me demande d'activer les macros. Or le document fichierDestination m'a déjà demandé à l'ouverture d'activer les macros ce que j'ai fait et de plus il est enregistré sous le format .xslm.
Egalement, dans les paramètres de confidentialités de microsoft excel j'ai activé les macros je ne comprends donc pas d'où provient ce problème.
Auriez-vous une idée ? Encore merci pour votre aide et vos réponses rapides !
La solution est peut-être ici Débloquer les macros Excel
Edit ?
C'est à dire
Comment puis-je remplacer cette ligne :
Set fichierDestination = Workbooks.Open("O:chemind'accès2.xlsm")car je pense que le problème vient du fait que j'ouvre le fichier destination qui n'est d'autre que le fichier où est écrit ce code. Serait-il possible de remplacer le workbooks.open par activeworkbook ? Comment exprimer que le fichier destination et le fichier sur lequel est inscrit le code est le même car en évitant de l'ouvrir et en comprenant que c'est le même je contourne l'erreur d'activation des macros qui se déclenche à chaque ouverture du document.
J'ai essayé de modifier le code pour éviter d'ouvrir le fichier destination alors qu'il est déjà ouvert :
Private Sub extraire()
Dim fichierSource As Workbook
Dim feuilleSource As Worksheet
'spécifier le nom du fichier source et la feuille à copier'
Set fichierSource = Workbooks.Open("O:\_.xlsx")
Set feuilleSource = fichierSource.Sheets("classement")
'variable = le mot recherché'
Dim dure As String
dure = "dure"
Dim derniereligne As Long
Dim dernierelignetableau As Long
Dim i As Long
Dim tableau As Variant
'déterminer la dernière ligne de la première colonne'
derniereligne = feuilleSource.Cells(Rows.Count, 1).End(xlUp).Row
'référencer le tableau existant où les lignes doivent être copiées'
Set tableau = Active.Sheet("rdv").Range("A2:N2")
'déterminer la dernière ligne où va être copié notre ligne'
dernierelignetableau = tableau.Rows.Count
'boucle qui passe par chaque cellule de la nième colonne'
For i = 1 To derniereligne
Dim cellule As Range
Set cellule = Cells(i, 14)
'cherche si le mot dure est dans la cellule Ni'
If InStr(1, cellule.Value, dure, vbTextCompare) > 0 Then
'copie la ligne existante dans le tableau existant'
dernierelignetableau = dernierelignetableau + 1
Range("A" & i & ":N" & i).Copy Destination:=tableau.Cells(dernierelignetableau, 1)
End If
Next i
End Submais j'ai toujours un problème d'objet qui je pense provient de la ligne :
Set tableau = Active.Sheet("rdv").Range("A2:N2")car je ne suis pas sûre de mon utilisation de Active.Sheet
PS : encore une fois j'ai enlevé le chemin d'accès mais il y est dans mon code
Set fichierDestination = Workbooks("O:\_COMMUN\TEAM\monprenom\rdv.xlsm")
ou
Set fichierDestination = ActiveWorkbookActiveWorkbook signifie Classeur actif (si votre macro est lancé depuis ce classeur )
pour le 2ème problème
Set tableau = ActiveSheet.Range("A2:N2")à interpréter comme la plage "A2:N2" de la feuille courante.
Je n'ai plus d'erreur et le fichiersource s'ouvre bien mais aucune données n'est copiées dans mon fichier destination (qui est celui où j'ai écris le code).
Pour mieux détailler mes fichiers, mon fichier source possède N colonnes remplis et je veux que si dans la case Ni il y a le mot dur alors cette ligne est copié dans le fichier destination. Je ne comprends pas ce qui ne fonctionne pas.
Sachant que j'ai enlevé le dim fichierDestination, set fichierDestination et dim feuilleDestination et set feuilleDestination qui ne me semble pas nécessaire dans la suite du code si je met ActiveSheet.Range dans la suite du code. Qu'en pensez-vous ?
Merci encore pour votre patience,
Carla
J'ai essayé de bien mettre les parents des feuilles à chaque ligne.
Private Sub extraire()
Dim fichierSource As Workbook
Dim feuilleSource As Worksheet
Dim fichierDestination As Workbook
'spécifier le nom du fichier source et la feuille à copier'
Set fichierSource = Workbooks.Open("O:\_.xlsx")
Set feuilleSource = fichierSource.Sheets("classement")
'spécifier la feuille de destination'
Set feuilleDestination = ThisWorkbook.Sheets("rdv")
'variable = le mot recherché'
Dim dure As String
dur = "dur"
Dim derniereligne As Long
Dim dernierelignetableau As Long
Dim i As Long
Dim tableau As Variant
'déterminer la dernière ligne de la première colonne'
derniereligne = feuilleSource.Cells(feuilleSource.Rows.Count, 1).End(xlUp).Row
'déterminer la dernière ligne où va être copiée notre ligne'
dernierelignetableau = feuilleDestination(feuilleDestination.Rows.Count, 1).End(xlUp).Row + 1
'boucle qui passe par chaque cellule de la nième colonne'
For i = 1 To derniereligne
Dim cellule As Range
Set cellule = feuilleSource.Cells(i, 14)
'cherche si le mot dure est dans la cellule Ni'
If InStr(1, cellule.Value, dure, vbTextCompare) > 0 Then
'copie la ligne existante dans le tableau existant'
feuilleSource.Range("A" & i & ":N" & i).Copy Destination:=feuilleDestination.Cells(dernierelignetableau, 1)
dernierelignetableau = dernierelignetableau + 1
End If
Next i
'fermer le fichier source sans sauvegarder les modifications'
fichierSource.Close SaveChanges:=False
End SubEdit ?
C'est à dire
Oui j'avais supprimé ma réponse pour ne pas embrouiller car "clr" vous avait apporté une réponse et donc que ma réponse ne servait à rien
car je pense que le problème vient du fait que j'ouvre le fichier destination qui n'est d'autre que le fichier où est écrit ce code. Serait-il possible de remplacer le workbooks.open par activeworkbook ? Comment exprimer que le fichier destination et le fichier sur lequel est inscrit le code est le même car en évitant de l'ouvrir et en comprenant que c'est le même je contourne l'erreur d'activation des macros qui se déclenche à chaque ouverture du document.
Le plus simple est d'utiliser THISWORKBOOK pour le fichier qui contient le code
Puis mettre des variables c'est bien mais trop, la lecture du code devient plus difficile à suivre (enfin je trouve)
Edit : dans votre dernier post vous mettez
dur = "dur"Ce n'est pas
dure = "dur"J'ai changé le dure en dur car je me suis rendu compte que dans mes données à extraire le mot clé était "dur" mais j'avais oublié de le remplacer dans la ligne :
If InStr(1, cellule.Value, dur, vbTextCompare) > 0 Thenmerci dan ! maintenant j'ai l'erreur propriété ou méthode non gérée. Je ne comprends pas pourquoi le logiciel ne me met plus en jaune la ligne concernée par le problème... si vous avez une idée ?
J'ai changé le dure en dur car je me suis rendu compte que dans mes données à extraire le mot clé était "dur"
Votre déclaration Dim, vous l'avez adaptée ? donc --> Dim dur as string
Autre chose juste au dessus de Private Sub extraire(), avez vous l'instruction Option explicit ?
Oui merci je viens de corriger le dim et j'ai rajouté le option explicit. J'ai toujours un problème de propriété non gérée peut être je peux vous envoyer un fichier exemple qui ressemble au mien avec la macro dedans.
Bonjour,
Vous avez une erreur à cette ligne. Remplacez-là remplacez par celle-ci
dernierelignetableau = feuilleDestination.Cells(Rows.Count, 1).End(xlUp).Row + 1C'est un peu comme je vous écrivais avant, à force de multiplier les variables, on peut se perdre dans le code et oublier une instruction
Rem : j'éviterai d'utiliser "Cellule" comme nom de variable car "Cellule" est aussi une fonction d'excel... Utilisez plutôt "Cel" par exemple