XL 2013 Création d'un nom de champs de cellules provenant d'un autre classeur ouvert

ericm1960

XLDnaute Nouveau
Bonjour,
Je suis un nouveau membre, à la recherche d'une solution désespérée de code. J'ai 2 classeurs ouverts. Je voudrais, dans mon premier classeur (le classeur actif), coller un nom (Plage_CI_G) d'un champ issu du second classeur, également ouvert. C'est certainement simple, le lancement de la macro affiche une erreur que je ne parviens pas à résoudre. Par contre je parviens très bien à nommer un champs sur mon seul classeur actif. Dès que je fais appel à une référence d'un autre classeur, cela ne fonctionne pas.

Voici mon code :
VB:
Sub nom()

Dim ws, wr As Workbook
Dim Dlign1 As Integer
Set ws = ThisWorkbook
Set wr = Workbooks("Indicateurs_redressement_national")
Dim Plage_CI_G As Range

'Déterminer la plage de la feuille CI G
    wr.Activate
    Sheets("Taux de redres CI G S3C").Select
    Range("B5").Select
    Dlign1 = Cells(Rows.Count, 1).End(xlUp).Row

    ws.Activate
    Set Plage_CI_G = wr.Sheets("Taux de redres CI G S3C").Range("B6", Range("O" & Dlign1))



End Sub

Merci par avance pour votre aide
Eric
 

vgendron

XLDnaute Barbatruc
Bonjour et bienvenu sur ce forum et bonne année !

essaie avec cette correction
VB:
Sub nom()

Dim ws, wr As Workbook
Dim Dlign1 As Integer
Set ws = ThisWorkbook
Set wr = Workbooks("Indicateurs_redressement_national")
Dim Plage_CI_G As Range

'Déterminer la plage de la feuille CI G
with wr.Sheets("Taux de redres CI G S3C")
    Dlign1 = .Cells(.Rows.Count, 1).End(xlUp).Row

    Set Plage_CI_G = .Range("B6", .Range("O" & Dlign1)) 'ca ne met pas de nom à la zone sélectionnée
'ca affecte juste la zone sélectionnée à une variable nommée Plage_CI_G
end with


End Sub
 

ericm1960

XLDnaute Nouveau
Merci pour ta réponse.
Le code que tu me donnes n'affiche aucun message d'erreur. Il est donc sûrement parfait. Mais il ne me permet pas de poursuivre ma procédure, qui est d'utiliser la zone sélectionnée pour le calcul d'une RECHERCHEV, à savoir VLOOKUP. Et je ne parviens toujours pas à afficher le nom à la plage, afin de finaliser ma RECHERCHEV.
Voici le code :
VB:
Sub nombis()

Dim ws, wr As Workbook
Dim Dlign1 As Integer
Set ws = ThisWorkbook
Set wr = Workbooks("Indicateurs_redressement_national")
Dim Plage_CI_G As Range

'Déterminer la plage de la feuille CI G
With wr.Sheets("Taux de redres CI G S3C")
    Dlign1 = .Cells(.Rows.Count, 1).End(xlUp).Row

    Set Plage_CI_G = .Range("B6", .Range("O" & Dlign1)) 'ca ne met pas de nom à la zone sélectionnée
'ca affecte juste la zone sélectionnée à une variable nommée Plage_CI_G
End With
With Plage_CI_G

   .Name.Add Name:="Plage_CI_G", RefersToR1C1:=Plage_CI_G.Address
End With

'Et pour la RECHERCHEV :
    
    Sheets("Analyse S3C contrôle").Select 'feuille se trouvant sur le classeur ws
    Range("F18").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-13]C[-2],Plage_CI_G,5,FALSE)"


End Sub

L'erreur s'affiche sur la ligne .Name.Add Name:="Plage_CI_G", RefersToR1C1:=Plage_CI_G.Address
Ma syntaxe ne doit pas être bonne.

Merci par avance
Eric
 

vgendron

XLDnaute Barbatruc
Hello
Pas de message d'erreur ne veut pas dire parfait...
ex: si on ne fait rien , il n'y a pas de message.. c'est pas pour autant ce qu'on veut.... :-D

Pour ta syntaxe..
essaie ceci
VB:
ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-13]C[-2],""Plage_CI_G"",5,FALSE)"
 

ericm1960

XLDnaute Nouveau
Merci vgendron
Mais cela ne marche pas non plus. Mon problème est le "nommage" de la plage sur le 2ème classeur. Pour simplifier, j'ai essayé le code suivant :
VB:
Sub RechercheV_2bFichiers()

Dim ws, wr As Workbook
Dim Dlign1 As Integer
Set ws = ThisWorkbook
Set wr = Workbooks("Indicateurs_redressement_national")
'Dim Plage As Range

'Déterminer la plage
With wr.Sheets("Global")
    Dlign1 = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
'Donner un nom à la plage
wr.Activate
   Sheets("Global").Range("A2", Range("BB" & Dlign1)).Name = "Plage"

    ws.Activate
    Sheets("Analyse S3C contrôle").Select 'feuille se trouvant sur le classeur ws
    Range("F18").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-13]C[-2],Plage,18,FALSE)"


End Sub
Le nom de la plage est bien créé, mais dans le classeur wr. Et ma RechercheV qui se trouve dans le classeur ws ne trouve pas la plage.
Si je tente d'écrire la plage dans le classeur ws, avec le code suivant
Code:
ws.Activate
   wr.Sheets("Global").Range("A2", Range("BB" & Dlign1)).Name = "Plage"
j'obtiens un message d'erreur. Je ne parviens pas à concevoir un nom de plage qui fait référence à un autre classeur. Si je ne trouve pas, il va me falloir tout regrouper dans un même classeur. Mais cela va bouleverserl'organisation de mon projet.
 

vgendron

XLDnaute Barbatruc
Hello
Comme on a pas tes fichiers en exemple.. pas ideal pour t'aider..
mais.. as tu essayé d'ecrire ta fonction recherche à la main
1) dans ton classeur 1, tu saisis la fonction. et AU LIEU d'ecrire le nom de la range nommée. tu vas la selectionner dans ton classeur 2...
à mon avis.. pour résultat, tu as bien le nom de la range nommée MAIS précédée du nom du classeur..
un truc du genre "Classeur2.xls! Nomrange"

je pense que le NOMrange tout seul ne contient pas la référence au classeur dans lequel il est..
donc. dans ta formule.. si tu ne précises pas dans quel classeur se trouve ta zone nommée.. il ne va pas la trouver....

Ce ne sont que des pistes...sans aucune garantie.. :-D
 

ericm1960

XLDnaute Nouveau
Bonsoir vgendron, bonsoir Dranreb,
Merci beaucoup pour votre aide et vos conseils. Je n'ai pas joins mes fichiers car ils sont volumineux. C'est pourquoi je ne souhaite pas regrouper les classeurs dans un seul fichier. J'aurais pu en faire une maquette plus réduite. C'est ce que j'aurais fait si le code transmis par Dranreb n'avait pas fonctionné. Mais ça marche ! :D
J'avoue humblement ne pas avoir tout compris, la partie " .[A2:BB2].Resize(.[A1000000].End(xlUp).Row - 1)"
Je crois comprendre que la formule permet de partir de la ligne 2 [A2:BB2], et descend jusqu'au bas de la feuille pour remonter jusqu'à la dernière ligne du tableau. Je n'ai donc plus besoin de définir la dernière ligne avec Dlign1. Et le "with" me perrmet de définir une variable située dans un autre classeur, sinon je reste coincé dans mon classeur initial ws. Est-ce à peu près cela ?
Et s'il vous plait vous me direz comment procéder pour déclarer le problème comme résolu.
Bien cordialement
 

Dranreb

XLDnaute Barbatruc
Les crochets droits offrent le moyen le plus concis de désigner un plage fixe. Leur utilisation entraine celle de la méthode Evaluate et non Range, mais elle renvoie bien un Range si l'expression entre crochets désigne une plage de cellules.
Le With permet de spécifier une seule fois un objet à appliquer dans plusieurs expressions commençant alors juste par un point. Ça évite donc ici la répétion de wr.Sheets("Global") qui serait autrement nécessaire dans wr.Sheets("Global").[A2:BB2].Resize(wr.Sheets("Global").[A1000000].End(xlUp).Row - 1)

Remarque: à ce propos votre erreur provenait probablement de ce que vous tentiez de définir un Range à partir de cellules dans deux classeurs différents :
wr.Sheets("Global").Range("A2", ActiveSheet.Range("BB" & Dlign1)).Name = "Plage"
(Activesheet est assumé puisqu'il n'est pas reprécisé wr.Sheets("Global"), en dehors du fait que cette écriture définit un nom dans le classeur portant la plage, ce qui n'était pas ce que vous vouliez)
 
Dernière édition:

Discussions similaires