Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Autres Renommer les données du code vba à partir d'une cellule

medlight

XLDnaute Junior
Bonjour à tous, pouvez vous m'aider pour ces fichiers ;
j'ai utilisé ce code pour transfert les données du fichier Source.xlsm vers TESTxlsx

Le code; Workbooks("TEST.xlsx").Sheets("Feuil1").Range("B3") = Workbooks("Source.xlsm").Sheets("Feuil1").Range("B3").Value

Ma question est s'il est possible de renommer dans le code les noms (TEST et Source) partir de la cellule (i7) et (j7) du Feuil1 du fichier Source.xlsm.
 

Pièces jointes

  • Source.xlsm
    19.3 KB · Affichages: 2
  • TEST.xlsx
    9.2 KB · Affichages: 2
Solution
Bonjour.
Donc par exemple:
VB:
Option Explicit
Private Sub CommandButton1_Click()
   Dim WbkCbl As Workbook, WshCbl As Worksheet
   Set WbkCbl = Workbooks(Me.[J7].Value & ".xlsx")
   Set WshCbl = WbkCbl.Worksheets(1)
   WshCbl.[B3:B7].Value = Me.[B3:B7].Value
   WshCbl.[E6:E10].Value = Me.[E6:E10].Value
   Set WshCbl = WbkCbl.Worksheets(2)
   WshCbl.[B3:B7].Value = Feuil2.[B3:B7].Value
   WshCbl.[E6:E10].Value = Feuil2.[E6:E10].Value
   End Sub
Attention, Feuil2 n'est pas le nom de l'onglet Excel mais celui de l'objet VBA qui en assume la représentation dans la rubrique Microsoft Excel Objets du projet VBA.

Dranreb

XLDnaute Barbatruc
Bonjour.
Pour la Source, comme c'est la feuille représentée par l'objet Worksheet portant le code, on peut utiliser Me. Comme ça :
VB:
Option Explicit
Private Sub CommandButton1_Click()
   Dim WshCbl As Worksheet
   Set WshCbl = Workbooks(Me.[J7].Value & ".xlsx").Worksheets(1)
   WshCbl.[B3:B7].Value = Me.[B3:B7].Value
   WshCbl.[E6:E10].Value = Me.[E6:E10].Value
   End Sub
 
Dernière édition:

oguruma

XLDnaute Occasionnel
Bonjour, je ne vais pas en faire l'inventaire dans ce post mais je t'invite à dowloader et consulter les des outils que j'ai déposé et ainsi dans les tips car tu auras les réponses à toutes les questions que tu te poses sur les appels dynamiques concernant les noms d'onglets, fichiers etc.....
je n'appelle jamais un onglet "en dur" sauf quand c'est l'objet d'un test rapide pour voir les effets du code que je teste. voir aussi dans les tips les sources sur la classe paramètres, mes outils passent par celle-ci.
Bien entendu ça passe par un peu "de spéléo" dans mon code mais tout y est bonne lecture et découverte
 

medlight

XLDnaute Junior
Meci bcp Dranreb , ça fonctionne bien.pour la feuill1
Pouvez-vous m'expliquer comment transferer les données de plusieurs feuilles et merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Pour les autres feuilles que celle représentée par l'objet Worksheet où est écrit le code je prends toujours au lieu de Me le nom de l'objet Worksheet qui la représente, et qu'on appelle aussi parfois à tort son CodeName car il existe une propriété String en lecture seule qui s'appelle comme ça et qui reproduit ce nom. Les objets Worksheet d'un autre projet VBA que celui portant le code ne sont pas connus dans celui ci. Pour ceux ci il n'y a pas d'autre solution que de consulter la collection Worksheets de l'autre classeur.
 
Dernière édition:

oguruma

XLDnaute Occasionnel
bonjour
pour info consultes mes utilitaires comme LFMT, PQMT et les autres... dans ceux je manipule des données de mon fichier macro que je recommande de passer par Thisworkbook et j'ouvre aussi d'autres classeurs.... tu verras la démarche

Rappels
VBA
est objet
un objet s'instancie par l'instruction set qui correspond en qq sorte au signe '=' pour une variable ; déjà quand on a compris cela on a avancé d'un grand pas.

Un autre principe de base a bien avoir tête c'est la hiérarchie des objets. Pour ta difficulté que tu postes sur le forum il est essentiel de bien comprendre cette hiérarchie en le classeur (workbook), l'onglet (worksheet), et les données (range).
On a donc Workbooks : une collection, Worksheets (une collection).
En respectant cette hiérarchie tu peux attaquer les cellules (ranges) d'autres classeurs que tu as ouvert dans ton code par l'instruction set wbClasseur1=...... avec une déclaration préalable dim wbClasseur as workbook
une fois le classeur instancié et ouvert tu peux instancier un onglet/feuille. Le principe est similaire à celui de l'objet workbook. Un dim préalable comme dim wkOngletExterne as worksheet et son instanciation par un set en passant par l'objet classeur ouvert préalablement soit
set wkOngletExterne=wbClasseur1.Worksheets("NOM_DE_MA_FEUILLE")

on passe au niveau inférieur pour attaquer cette fois les ranges (cellule) qui dépendent de l'objet feuille
dim rRangeExterne as range et set rRangeExterne=wkOngletExterne.Range("A1") ou remplacer A1 par un nom de champ (plage nommée) qui est plus parlant ! Avec l'objet rRangeExterne tu as toutes ses propriétés et lui affecter une valeur rien de plus simple rRangeExterne.Value="titi" (par défaut c'est la propriété Value) si tu ne la précises pas) que ce soit en lecture ou en écriture.

Attention : ne pas oublier quand tu ouvres un classeur externe par un Set, il devient automatiquement ton classeur actif. D'où l'importance de l'objet Thisworkbook qui héberge tes macros.

Ensuite pour te balader de feuille en feuille ou de classeur en classeur tu as la méthode Activate qui correspond au passage d'une feuille à l'autre ou d'un classeur à l'autre avec la souris.
Ne pas confondre avec .Select qui correspond à une action de Selection quand tu veux faire par exemple des copier/coller.

SI tu as bien compris cette méthodologie tu as résolu déjà 80% de tes problèmes en programmation VBA.






dim wb
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Donc par exemple:
VB:
Option Explicit
Private Sub CommandButton1_Click()
   Dim WbkCbl As Workbook, WshCbl As Worksheet
   Set WbkCbl = Workbooks(Me.[J7].Value & ".xlsx")
   Set WshCbl = WbkCbl.Worksheets(1)
   WshCbl.[B3:B7].Value = Me.[B3:B7].Value
   WshCbl.[E6:E10].Value = Me.[E6:E10].Value
   Set WshCbl = WbkCbl.Worksheets(2)
   WshCbl.[B3:B7].Value = Feuil2.[B3:B7].Value
   WshCbl.[E6:E10].Value = Feuil2.[E6:E10].Value
   End Sub
Attention, Feuil2 n'est pas le nom de l'onglet Excel mais celui de l'objet VBA qui en assume la représentation dans la rubrique Microsoft Excel Objets du projet VBA.
 

medlight

XLDnaute Junior
merci bcp ça marche bien,
 

oguruma

XLDnaute Occasionnel
merci bcp ça marche bien,
Bonjour, si je peux me permettre mais ça sent la programmation vba copier/coller sans trop rien y comprendre. Je t'invite à voir les bases de la programmation objet VBA. En effet comme dit DranReb il y a une énorme différence entre le nom symbolique objet et le nom "fonctionnel" de l'onglet.
Si tu passes par le nom symbolique tu n'as pas besoin de l'instancier mais il n'est connu que dans le classeur qui exécute la macro. Si tu souhaites attaquer une feuille d'un classeur tu dois l'instancier par son nom fonctionnel.
Après chacun sa méthode .
 

oguruma

XLDnaute Occasionnel
Allez je vais être sympa un petit exemple avec mes fichiers joints. C'est une manière d'y parvenir il y en a d'autres et aussi en espérant que ça serve d'école pour les autres

Bon je préfère le signaler pour test penser à changer le chemin d'accès selon votre disque
Const CLASSEUR_EXTERNE = "D:\DATA\18__ATELIERS\___XL__DOWNLOAD\ClasseurExterne.xlsx"

VB:
Sub DEMO()
    Const CLASSEUR_EXTERNE = "D:\DATA\18__ATELIERS\___XL__DOWNLOAD\ClasseurExterne.xlsx"
    Const FEUILLE_EXTERNE = "Feuille externe"
    Const NOM_RANGE_EXTERNE = "NOM_EXTERNE"
    Const NOM_RANGE_APPEL = "NOM"

    Dim wbExterne As Workbook
    Dim wkExterne As Worksheet
    Dim rRangeExterne As Range
    Dim rRangeAppel As Range
  
    On Error GoTo HANDLE_ERR
  
    Set wbExterne = Workbooks.Open(CLASSEUR_EXTERNE)
    Set wkExterne = wbExterne.Worksheets(FEUILLE_EXTERNE)
    Set rRangeExterne = wkExterne.Range(NOM_RANGE_EXTERNE)
  
    ThisWorkbook.Activate
    Set rRangeAppel = Range(NOM_RANGE_APPEL)
    MsgBox rRangeAppel.Value
    ' Forme 2 (value est par défaut)
    ' MsgBox rRangeAppel
    MsgBox rRangeAppel.Address
  
    rRangeExterne.Value = rRangeAppel.Value & " " & Format(Now, "dd/mm/yyyy - hh:mm:ss")
  
    wbExterne.Save
    wbExterne.Close
  
FIN:
    Exit Sub

HANDLE_ERR:
    MsgBox "Erreur " & Err.Description & " n° " & Err.Number
    Resume FIN
End Sub
 

Pièces jointes

  • ClasseurDappel.xlsm
    16.7 KB · Affichages: 0
  • ClasseurExterne.xlsx
    9.9 KB · Affichages: 0

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
10
Affichages
717
Réponses
12
Affichages
822
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…