XL 2010 echange entre classeurs

mécano41

XLDnaute Accro
Bonjour,

Ci-joint une appli. Essai 0-0.xlsm et deux classeurs de données ClassA.xlsx et ClassB.xlsx.
Il faut mettre les trois sur le bureau et, dans l'appli, modifier un peu le répertoire dans les deux lignes du tableau

Point 1 : Tout se passe bien pour ouvrir mais il y a un problème avec les noms de feuilles en VBA entre les '########

Dranreb m'a déjà expliqué, ailleurs, une erreur que je faisais mais ici je n'arrive pas à appliquer...probablement pas bien compris...

Dans cet essai, je veux faire passer la valeur de A1 de l'un dans A1 de l'autre

L'affichage des noms montre que je suis bien dans le bon fichier mais les lignes permettant le transfert (que j'ai mises en ' ) ne fonctionnent pas et je ne vois pas où est mon erreur...

Point 2
: cela ne semble pas gênant mais lorsque le code s'est déroulé, le dernier fichier de données ouvert reste présent dans la colonne Projets alors que je ne le trouve nulle part ailleurs...

Merci d'avance

Cordialement
 

Pièces jointes

  • ClassA.xlsx
    7.6 KB · Affichages: 8
  • ClassB.xlsx
    7.6 KB · Affichages: 5
  • Essai 0-0 .xlsm
    28.9 KB · Affichages: 9

Dranreb

XLDnaute Barbatruc
Bonjour.
Déjà ne mettez pas des '= True' dans les tests portant sur des Boolean, c'est idiot parce que ça ne change rien à leur valeur:
True = True c'est True,
False = True c'est False, donc
ValideRep = True c'est ValideRep tout court.
Ensuit, que vouliez-vous faire ? Vous ne voulez quand même pas écraser la A1 de Max1 (Essai) par la A1 de la feuille active au moment de son ouverture de chaque fichier, jusqu'a n'y garder en fin de compte que celle du dernier ?
 

mécano41

XLDnaute Accro
Bonjour,

Déjà ne mettez pas des '= True' dans les tests portant sur des Boolean, c'est idiot parce que ça ne change rien à leur valeur:
True = True c'est True,
False = True c'est False, donc
ValideRep = True c'est ValideRep tout court.

oui, je le sais mais c'est une mauvaise habitude

Ensuite, que vouliez-vous faire ? Vous ne voulez quand même pas écraser la A1 de Max1 (Essai) par la A1 de la feuille active au moment de son ouverture de chaque fichier, jusqu'a n'y garder en fin de compte que celle du dernier ?

Bien sûr que non ; c'est juste parce qu'en simplifiant pour mettre les fichiers ici, je n'ai pas réduit la boucle des fichiers! Ce que je veux faire plus tard, c'est aller chercher des données dans diverses cellules successivement dans chaque fichier ClassA, ClassB...etc et les mettre dans le tableau de droite de l'appli donc j'ouvre, je copie ( à terme, plusieurs valeurs), je colle et je ferme. Mais pour le moment j'ai un problème pour simplement faire un essai de copier la valeur en A1 de la feuille X1 d'un fichier ClassA par ex et coller cette valeur en A1 de la feuille Max1 de l'appli (j'ai simplifié pour l'essai). Le problème doit venir du nom de feuille comme nous l'avons évoqué ailleurs...en essayant diverse méthodes, parfois, cela a fonctionné une fois puis plus ensuite ou bien pas du tout... et comme ce n'est pas EXCEL qui est en cause ... :mad:

Cordialement
 

Dranreb

XLDnaute Barbatruc
À priori une expression Range du fichier destinataire contenant aussi la macro c'est Max1.Range(…),
et une expression Range du classeur source juste après son ouverture c'est ActiveSheet.Range(…) ou bien ActiveWorkbook.Worksheets(1).Range(…)
Dans un projet VBA les objets Worksheet de la rubrique Microsoft Excel Objets d'un autre projet ne sont pas connus.
Moi je préfèrerais toujours passer par des tableaux dynamiques, c'est bien plus rapide.
 

mécano41

XLDnaute Accro
Merci pour cette réponse. J'ai trouvé une méthode qui fonctionne. Je la trouve néanmoins un peu compliquée...(voir entre les ######)

Cordialement
 

Pièces jointes

  • ClassA.xlsx
    8.9 KB · Affichages: 6
  • ClassB.xlsx
    7.8 KB · Affichages: 5
  • Essai 0-0 .xlsm
    31.4 KB · Affichages: 10

Max22

XLDnaute Nouveau
merci de votre retour à tous les deux , :)

je vais regarder cela demain matin, pour comprendre comment je vais pouvoir modifier le code . mais je crois y voir un prmblème avec le nom des données " donn1, donn2

Je pensais à une structure simple

dim tab_fichiers
dim tab_paramètres

et ensuite if repertoire
else si fichier existe
else status file = existe

then "status_file = no file
then recupérer
else
Qu
 

mécano41

XLDnaute Accro
Bonjour,

J'ai mis là : https://www.excel-downloads.com/thr...raphique-couleur-dune-cellule.20034676/page-2

tes fichers "réels" adaptés, avec ma méthode ci-dessus (car je n'en ai pas d'autre!)

@Dranreb : y-a-t-il une réponse à ma question posée au premier message :

-Point 2 : cela ne semble pas gênant mais lorsque le code s'est déroulé, le dernier fichier de données ouvert reste présent dans la colonne Projets alors que je ne le trouve nulle part ailleurs...

Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne comprends pas votre point 2
Commencez par écrire une procédure compréhensible avec les vraies opérations que vous voulez faires.
Chargez vos données dans un tableau au début puis parcourez ce tableau, dimensionnez un tableau pour chaque groupe de cellules à renseigner en y versant les postes du tableau sources et vers le tableau cible.
Pour les noms de variables indices prenez L… pour ligne et C… pour colonne.
Note: la Value d'un Range de plusieurs cellules est toujours un tableau dynamique 2D dont les dimensions commencent à 1, même quand il n'y a qu'une seule ligne ou colonne.
 

mécano41

XLDnaute Accro
Je ne comprends pas votre point 2

C'est simple : depuis l'appli :
- j'ouvre un fichier de données
- je récupère des données
- je ferme ce fichier de données
- la procédure est terminée

Dans la colonne des PROJETS de l'environnement VBA, il y a évidemment les feuilles...etc de l'appli, mais il reste également celles du fichier de données que j'ai fermé. Dans l'EXCEL,seule l'appli est ouverte ce qui est normal. Cela ne semble pas avoir d'importance dans le fonctionnement mais je souhaitais comprendre et savoir si je n'ai pas oublié une instruction à la fin de la procédure...

Commencez par écrire une procédure compréhensible avec les vraies opérations que vous voulez faire.
Chargez vos données dans un tableau au début puis parcourez ce tableau, dimensionnez un tableau pour chaque groupe de cellules à renseigner en y versant les postes du tableau sources et vers le tableau cible.
Pour les noms de variables indices prenez L… pour ligne et C… pour colonne.
Note: la Value d'un Range de plusieurs cellules est toujours un tableau dynamique 2D dont les dimensions commencent à 1, même quand il n'y a qu'une seule ligne ou colonne.

Cela s'adresse-t-il à moi ou à Max22?

Si c'est à moi, c'est ce que je pensais avoir fait (avec la difficulté de récupération vue plus haut). J'aurais peut-être pu faire un seul tableau avant de coller l'ensemble dans l'appli...

Ce qui complique une peu tout cela c'est que, pour que Max22 puisse adapter facilement les fichiers, on considère que l'on ne connaît, a priori, que ce qui figure initialement dans son tableau de l'appli. et qui lui permet de modifier :

- noms des répertoires et des fichiers à traiter
- le nombre de données (=Nb. de colonnes comportant un en-tête)
- noms des cellules contenant les données (Placés en en-têtes des colonnes - ici le même nom quel que soit le fichier)

On considère que, si nécessaire, Max22 saura modifier les noms de feuilles dans le VBE et fera le remplacement correspondant dans le code... si c'est ce que j'ai bien compris de sa part...

Cordialement
 

Dranreb

XLDnaute Barbatruc
Ça s'adressait à vous. Dans le classeur joint au poste #5 il y a toujours des Range et Cells à tour de bras.
Je n'en utilise jamais dans des boucles. Toujours que des tableaux 2D. Mais c'est sûr, on ne peut faire autrement avec les plages nommées Donn1 à 4 s'il n'y a pas de structure plus claire et constante dans les fichiers.
Je pense que ceci, bien plus simple, devrait pouvoir se mettre au point :
VB:
Option Explicit
Sub Test()
   Dim RngDon As Range, TDon(), TRés(), L&, C&
   Set RngDon = [ListeRepertoires].Resize(, 2)
   TDon = RngDon.Value
   ReDim TRés(1 To UBound(TDon, 1), 1 To 7)
   On Error Resume Next
   For L = 1 To UBound(TDon, 1)
      Err.Clear: ChDrive TDon(L, 1): ChDir TDon(L, 1)
      If Err = 0 Then
         Workbooks.Open TDon(L, 2)
         If Err = 0 Then
            For C = 1 To 4: TRés(L, 3 + C) = Application.Range("Donn" & C).Value: Next C
            ActiveWorkbook.Close SaveChanges:=False
            TRés(L, 2) = "Valide"
         Else: TRés(L, 2) = "Non valide": End If
         TRés(L, 1) = "Valide"
      Else: TRés(L, 1) = "Non valide": End If
      Next L
   RngDon.Offset(, 3).Resize(, 7).Value = TRés
   End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T