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
 

Fichiers joints

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.
 

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/threads/couleur-des-barres-dun-graphique-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:

Dranreb

XLDnaute Barbatruc
j'ai oublié sans doute une instruction If IsEmpty(TDon(L, 1)) Then Exit For
juste à la place du second On Error Resume Next, qui fait double emploi.
 

mécano41

XLDnaute Accro
Merci. J'ai corrigé et cela fonctionne parfaitement sur les fichiers d'essai. (et là, il n'y a plus ce que j'évoquais au point 2)
me reste à comprendre et à adapter aux autres fichiers...

Cordialement
 

Max22

XLDnaute Nouveau
rebonjour !

Oui le besoin est d'avoir qqchose qui se gère simplement
je définis
le RANGE_FICHIER (en colonne) => nbr de fichier
le RANGE_PARAMETRE ( en_tete de ligne)
 

mécano41

XLDnaute Accro
@Dranreb,

Je viens de mettre la nouvelle appli dans l'autre fil ; tout semble fonctionner.

Merci pour toutes les infos. Il me semble que des facilités on été ajoutées de puis l'époque ou j'ai commencé le VBA avec EXCEL 2003 et lorsque je suis passé à EXCEL 2010, je n'ai pas dû profiter des améliorations - que dire des versions plus récentes! - mais j'ai déjà fort à faire...( à 75 ans bien tassés, cela rentre moins vite dans la tête et en sort beaucoup plus vite!).

Encore merci.

Cordialement
 

Max22

XLDnaute Nouveau
je vais essayer de reformuler ma pensée

BESOIN : Faire la synthèse (tableau) de valeurs (comportant des « noms ») récupérées dans des fichiers xlsm sur serveur http://xxxx ( avec peut être un code utilisateur + mot de passe)


La structure doit me permettre simplement de :
  • rajouter des « rep + fichiers « (colonnes) et éventuellement de redéfinir les zones ListeRepertoires et listeNmFich
  • rajouter des « parameters « (entete) et éventuellement la zone ListeParam


Sur la page de synthèse

ListeRepertoires et listeNmFich (2colonnes rep & file ) nbr de fichier (par defaut 20lignes + 10 lignes en plus)

ListeParam (ligne avec entete des noms des paramètres à utiliser lors de la recherche (ex : « Project_Name », « Percentage_ALR ») nbre de paramêtre (par défaut 40 paramètres + 10 en plus)



Idée de programme ( 2 tests + 2 boucles)

1) Tester si répertoire existe
2) Tester si fichier existe
3) Loop pour listeNmFich ++ until fin ou vide
4) Loop pour ListeParam ++
If parameter existe return value , else » 0 «
until fin ou vide
End loop ListeParam
End loop listeNmFich

est ce que je dis des bétises ?

Certains paramètres peuvent ne pas exister (rare mais possible dans un premier temps en attendant que j’harmonise tous les fichiers) si possible mettre la cellule en rose et retourner » 0 «

Les paramètres a retourner sont de 4 types : Date, txt , nombre entier ou %

Ex : Date_version dd/mm/yyyy
Ex : Percentage_ALR %
Ex : Project_Name string
Ex : Nbr_open >256 < 1000

Je ne sais pas si ça pose un problème de formatage , ou si résolu avec format cellule

% => Ok
Txt => ok
Nbr => ok
Date = ? à voir
 
Haut Bas