[résolu]erreur de compilation, variable non définie

charette63

XLDnaute Occasionnel
bonsoir le forum,

c'est encore moi, la dernière macro reçue de Dranreb (que je remercie encore au passage) fonctionne très bien.... sur le formulaire "test" que j'ai crée pour mes... euh...tests

macro permettant la copie d'une valeur d'une cellule se trouvant dans un autre classeur, avec l'adresse du classeur source "modifiable" suivant la valeur d'une autre cellule de ce classeur

Code :
Code:
Feuil1.[E1].Value = Workbooks("test onglets0 " & Feuil1.[A10].Value & "bis.xls").Worksheets(Feuil1.Name).Cells(1, 1).Value

je la copy/past dans mon dossier final, l'adapte au dossier:
Code :
Code:
Feuil17.[Q1].Value = Workbooks("fiche perso cuisine test" & " " & Feuil17.[L1].Value & ".xls").Worksheets(Feuil2.Name).Cells(2, 1).Value

et là, lors de l'activation de la macro, message d'erreur: erreur de compilation, variable non définie.-----> et " (Feuil2.Name) " est surligné en jaune.

je fais quelques essais pour tâcher de trouver la cause:
-j'ai supprimé une à une toutes les macros du classeur
-j'ai inscrit la valeur en cells(2, 1) manuellement vu qu'elle s'inscrit par liaison
-j'ai renommé l'onglet de la Feuil2 manuellement vu qu'elle s'inscrit par liaison

toujours le même problème

par contre, je change le " Worksheets(Feuil2.Name) " par " Worksheets(2) " (emplacement de l'onglet sur sa ligne) et là, la macro me donne entière satisfaction.

une idée? une piste? mieux encore, une solution?

merci

cordialement
 
Dernière édition:

charette63

XLDnaute Occasionnel
Re: erreur de compilation, variable non définie

bonjour Pierrot, merci de t'interresser,

"appeler" les feuilles par leur "codename" ne m'interresse pas, les onglets sont suscptibles de changer de nom, tout comme les "appeler" par leur position sur la "ligne" d'onglets , les feuilles sont susceptibles de changer de positions.

j'en profite pour confirmer, après d'autres test, que le codename (Feuil2.CodeName) "appeler" par la macro est bien celui du classeur actif, et pas (comme esperé) celui du classeur renseigné dans la macro.

y-a-t-il possibilité de la modifier,

merci
cordialement
Thierry
 

charette63

XLDnaute Occasionnel
Re: erreur de compilation, variable non définie

je joint deux petits fichiers, quelques instruction sur le classeur test onglet2 2011
 

Pièces jointes

  • test onglets0 2011.xls
    38 KB · Affichages: 49
  • test onglets2 2011.xls
    39.5 KB · Affichages: 55
  • test onglets0 2011.xls
    38 KB · Affichages: 50
  • test onglets2 2011.xls
    39.5 KB · Affichages: 57
  • test onglets0 2011.xls
    38 KB · Affichages: 50
  • test onglets2 2011.xls
    39.5 KB · Affichages: 58
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : erreur de compilation, variable non définie

Bonjour le fil, bonjour le forum,

En effet il semble que le CodeName ne s'applique qu'au classeur actif. J'ai essayé avec des With... End With et le classeur cible mais ça plante toujours. J'ai réussi à contourner le problème avec ce bout de code :
Code:
Sub Macro30()
Dim cl As Workbook 'déclare la variable cl (CLasseur)
Dim no As String 'déclare la variable no (Nom de l'Onglet)
Dim x As Integer 'déclare la variable x (incrément d'onglet)
 
Set cl = Workbooks("test onglets0 " & Feuil1.[A10].Value & ".xls") 'définit le classeur cl
With cl 'prend en compte le classeur cl
    For x = 1 To .Sheets.Count 'boucle sur tous les onglets du classeur cl
        'condition : si l'onglet a pour Codename "Feuil1", définit le nom du classeur no et sort de la boucle
        If .Sheets(x).CodeName = "Feuil1" Then no = .Sheets(x).Name: Exit For
    Next x 'prochain onglet du classeur cl
End With 'fin de la prise en compte du classeur cl
 
Feuil1.[F1].Value = Workbooks("test onglets0 " & Feuil1.[A10].Value & ".xls").Worksheets(no).Cells(1, 2).Value
End Sub
Ça Marche ! j'ai renommé tant l'onglet Feuil1 du classeur onglets0 que celui de onglets2, je les ai déplacé et ça fonctionne toujours...
 

charette63

XLDnaute Occasionnel
Re: erreur de compilation, variable non définie

eh bien, mon cher Robert tu as fait un travail du tonnerre, la macro rempli toute mes espérances.

avec tout mes remerciements.

Sans vouloir abuser, et j'avoue que pour ceci je n'ai fait aucune recherche ou travail préparatoire, crois tu possible que par macro il soit possible de renommer les feuilles d'un classeur A au même nom que les feuilles d'un classeur B (si codename de Feuil1 de classeur A=dupont, alors codename de Feuil1 de classeur B=dupont )

j'envois un message privé à Dranreb pour l'inviter à lire cette discussion, c'est lui qui m'a aidé pour le premier code, et ne sait peut-être pas que le codename ne s'applique qu'à la feuille active.

merci à tous
cordialement
Thierry
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [résolu]erreur de compilation, variable non définie

Bonsoir le fil, bonsoir le forum,

J'ai repris ton exemple mais tu peux définir les classeurs source et cible différemment :
Code:
Sub Nom()
Dim cs As Workbook 'déclare la variable cs (CLasseur Source)
Dim cc As Workbook 'déclare la variable cc (CLasseur Cible)
Dim no As String 'déclare la variable no (Nom de l'Onglet)
Dim x As Integer 'déclare la variable x (incrément d'onglet)
Dim y As Integer 'déclare la variable y (incrément d'onglet)
 
Set cs = ThisWorkbook 'définit le classeur source
Set cc = Workbooks("test onglets0 " & Feuil1.[A10].Value & ".xls") 'définit le classeur cible
For x = 1 To cs.Sheets.Count 'boucle 1 : sur tous les onglets du classeur source
    'condition : si l'onglet a pour Codename "Feuilx", définit le la variable no
    If cs.Sheets(x).CodeName = "Feuil" & x Then no = cs.Sheets(x).Name
    For y = 1 To cc.Sheets.Count 'boucle 2 : sur tous les onglets du classeur cible
        'condition : si l'onglet a pour Codename "Feuilx", renomme l'onglet, sort de la boucle
        If cc.Sheets(y).CodeName = "Feuil" & x Then cc.Sheets(y).Name = no: Exit For
    Next y 'prochain onglet du classeur cible
Next x 'prochain onglet du classeur source
End Sub
Cette macro va comparer les onglets par rapport à leur CodeName et va renommer (propriété Name) les onglets qui ont le même CodeName en prenant le nom du classeur source.
 

Dranreb

XLDnaute Barbatruc
Re : [résolu]erreur de compilation, variable non définie

Bonjour.
j'envois un message privé à Dranreb pour l'inviter à lire cette discussion, c'est lui qui m'a aidé pour le premier code, et ne sait peut-être pas que le codename ne s'applique qu'à la feuille active.
Faux, comme répondu au message privé, le CodeName n'est pas fait pour manipuler des feuilles de ActiveWorkbook ni d'aucun autre classeur que ThisWorkbook car c'est le seul qui contient le projet Visual basic où ces CodesNAmes sont connus comme noms d'objets lui appartenant.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : [résolu]erreur de compilation, variable non définie

Bonjour le fil, bonjour le forum,

il me semble pourtant, Bernard, que ce code fonctionne :
Code:
[FONT=monospace]Sub Nom()[/FONT]
[FONT=monospace]Dim cs As Workbook 'déclare la variable cs (CLasseur Source)[/FONT]
[FONT=monospace]Dim cc As Workbook 'déclare la variable cc (CLasseur Cible)[/FONT]
[FONT=monospace]Dim no As String 'déclare la variable no (Nom de l'Onglet)[/FONT]
[FONT=monospace]Dim x As Integer 'déclare la variable x (incrément d'onglet)[/FONT]
[FONT=monospace]Dim y As Integer 'déclare la variable y (incrément d'onglet)[/FONT]
[FONT=monospace] [/FONT]
[FONT=monospace]Set cs = ThisWorkbook 'définit le classeur source[/FONT]
[FONT=monospace]Set cc = Workbooks("test onglets0 " & Feuil1.[A10].Value & ".xls") 'définit le classeur cible[/FONT]
[FONT=monospace]For x = 1 To cs.Sheets.Count 'boucle 1 : sur tous les onglets du classeur source[/FONT]
[FONT=monospace]    'condition : si l'onglet a pour Codename "Feuilx", définit le la variable no[/FONT]
[FONT=monospace]    If cs.Sheets(x).CodeName = "Feuil" & x Then no = cs.Sheets(x).Name[/FONT]
[FONT=monospace]    For y = 1 To cc.Sheets.Count 'boucle 2 : sur tous les onglets du classeur cible[/FONT]
[FONT=monospace]        'condition : si l'onglet a pour Codename "Feuilx", renomme l'onglet, sort de la boucle[/FONT]
[FONT=monospace]        If cc.Sheets(y).CodeName = "Feuil" & x Then cc.Sheets(y).Name = no: Exit For[/FONT]
[FONT=monospace]    Next y 'prochain onglet du classeur cible[/FONT]
[FONT=monospace]Next x 'prochain onglet du classeur source[/FONT]
[FONT=monospace]End Sub[/FONT]

où je compare avec le CodeName d'un onglet d'un autre classeur que ThisWorkbook :
Code:
If cc.Sheets(y).CodeName = "Feuil" & x Then cc.Sheets(y).Name = no: Exit For
Comment se fait-ce ?
 

Dranreb

XLDnaute Barbatruc
Re : [résolu]erreur de compilation, variable non définie

Bonjour Robert
Je n'ai pas dit que ça ne fonctionnait pas.
À partir du moment où on a un objet Worksheet d'un classeur quelconque, on peut extraire son CodeName mais celui ci est alors un String et pas un nom d'objet Worksheet en tant que tel, connu du projet VBA du classeur qui le contient.
CodeName, propriété


Renvoie le nom de code de l'objet. Type de données String en lecture seule.

Remarque La valeur qui apparaît dans la cellule affichée à droite de (Nom) dans la fenêtre Propriétés correspond au nom de code de l'objet sélectionné. Au moment de la création, vous pouvez changer le nom de code d'un objet en modifiant cette valeur. Il est toutefois impossible de modifier cette propriété par programmation au moment de l'exécution.

Remarques

Le nom de code d'un objet peut être utilisé à la place d'une expression qui renvoie l'objet. Par exemple, si le nom de code de la feuille de calcul 1 est « Sheet1 », les expressions suivantes sont identiques :

Worksheets(1).Range("a1")
Sheet1.Range("a1")
On peut évidemment utiliser ce String à des fins spéciales, mais je doute qu'il n'y ait pas de moyen plus orthodoxe de trouver les bons liens dans une application rationnelle bien structurée.
 

Discussions similaires

Réponses
3
Affichages
581
Réponses
3
Affichages
363

Statistiques des forums

Discussions
312 601
Messages
2 090 150
Membres
104 411
dernier inscrit
saidokhan