Mise à Jour Fichier excel

qwcio

XLDnaute Nouveau
Bonjour à tous,

Vrai novice en VB, cela fait 1 semaine que je traîne sur le internet pour m'aider, mais après l'essai de nombreux scripts trouvés ici ou là, sans obtenir le résultat attendu, je craque et m'adresse à vous directement.

Voici mon souhait, pourtant simple:
Un fichier excel qui doit être mis à jour par un fichier csv (celui est généré par un script de récupération de data sur mes serveurs linux).
Il ne s'agit pas de seulement importer le .csv (ça, avec une macro, j'avais réussi à le faire), mais vraiment une mise à jour, c'est à dire que seules les données nouvelles du .csv doivent être inscrites dans le fichier excel (correction des données pour celles déjà existantes si nécessaire, + import des nouvelles lignes).

Donc il ne faut pas qu'il y ait écrasement des anciennes datas déjà présentes dans le fichier excel (car dans le fichier excel, certaines colonnes contiennent des données "manuelles" qu'on ne retrouve dans le fichier csv).


En gros, voici à quoi devrait ressembler le fichier excel:
Nom de l'application | Code ID | Commentaire | Port | Diag
toto | 28 | fait du toto | 12100 | OK
tata | 32 | remplace tata | 1100 | KO


Et pour le .csv:
toto;28;;12100;OK
tata;32;;1100;KO


Et donc, si le .csv futur est de ce type:
toto;30;;12100;OK
tata;32;;1100;OK
titi;45;;13500;Error

Le fichier excel devra automatiquement se mettre ainsi:
Nom de l'application | Code ID | Commentaire | Port | Diag
toto | 30 | fait du toto | 12100 | OK
tata | 32 | remplace tata | 1100 | OK
titi | 45 | déploie titi | 13500 | Error


Pour information (et je pense que pour les boucles de recherche pour faire des maj c'est important), le nom de l'application n'est jamais variant.


Voilà toutes propositions sera la bienvenue.
Et merci d'avance.
 

Dranreb

XLDnaute Barbatruc
Re : Mise à Jour Fichier excel

Bonjour.

Et les donnés absentes du csv sont elle à conserver dans le fichier Excel ?
Moi je mettrais les deux sources dans des tableaux, puis je les fusionnerais dans un tableau unique en ajoutant devant une colonne 0 où j'y mettrais 0 pour ceux qui viennent du csv, 1 pour ceux de la base à mettre à jour, puis tout ça dans une collection d'éléments classés par nom de l'application. Le code pourrait être étonnamment simple dans la mesure où le plus gros serait fait par des modules de service tout faits. Joignez un classeur avec la lecture du csv que vous avez déjà programmée, je vous mettrai le reste. N'oubliez pas ma 1ère question.
 

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Pour la 1ère question: Oui les données absentes du .csv sont à conserver.
Il s'agit de données "utilisateurs" remplies manuellement, et qui doivent rester absolument en place du mise à jour à l'autre.


Alors pour la lecture du csv, il s'agit d'une simple enregistrement de macro, où j'ai import le .csv.

Je mets en pièce jointe. Mais là encore la méthode n'est pas vraiment satisfaisante, puisqu'au lieu de prendre la place des données présentes, la macro décale les données déjà présentes, puis importe les nouvelles.
J'ai rajouté alors une suppression manuelle des anciennes données, mais cette méthode me paraît vraiment peu efficace.


PS: Je n'arrive pas à joindre un exemple de .csv, mais, en gros, il y a vraiment juste à reprendre l'exemple de mon 1er post.
 

Pièces jointes

  • EXCEL.xlsm
    15.1 KB · Affichages: 31
  • EXCEL.xlsm
    15.1 KB · Affichages: 31
  • EXCEL.xlsm
    15.1 KB · Affichages: 33

Dranreb

XLDnaute Barbatruc
Re : Mise à Jour Fichier excel

Je vais regarder. Mais d'abord, j'ai peut être mal posé ma question, si mal que vous avez peut être compris "les colonnes absente du csv… ". Je repose donc ma question: les lignes aux noms d'application devenus absents du csv sont elles à conserver coté Excel ? Et sinon, il n'y a donc aucun moyen via le csv de commander une suppression, et celle ci ne peut être que manuelle ?
 

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

A priori, une "application" ne devrait pas disparaître de mes machines (et donc du .csv).
Mais dans l'éventualité, elle devra en effet disparaître du fichier excel.


Toutefois, si cela est trop complexe à mettre en place, la suppression pourrait se faire manuellement dans le fichier excel sans trop de problème je pense (en dehors du fait qu'il faudra savoir que cette "appli" est retirée, mais je le saurais :D ).
 

Dranreb

XLDnaute Barbatruc
Re : Mise à Jour Fichier excel

Voila la chose, avec une certaine programmation de service lourde et occulte mais performante, et une programmation applicative ultra simple. Ça me semble donner le résultat souhaité, à l'ordre de classement près, et sans un certain "Déploie titi" que je ne sais d'où sortir.
L'identification et l'ordre de classement devait peut être plutôt être le Code ID, non ? J'ai pris le nom comme critère en attendant.
 

Pièces jointes

  • GrpOrgQwcio.xls
    149 KB · Affichages: 21
Dernière édition:

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Déjà merci pour ton travail.

Il se fait un peu tard, donc je regarderai plus en détail demain matin, mais a priori, quand je clique sur la mise à jour, cela fait ce que je demande.

Je me mets dans ton code pour le comprendre au réveil.
 

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Ton script est riche! Merci encore une fois pour tout ce travail. Je n'en espéré pas autant.
Je vais avoir pas mal de boulot pour le comprendre et l'adapter à mes fichiers, mais merci beaucoup.


J'ai tout de même quelques questions:
. Si mon fichier csv comporte une colonne nouvelle, celle-ci ne s'ajoute pas dans le feuillet "Base".
En lisant le script, je crois comprendre que c'est la fonction PlgUti qui détermine la range d'importation. Celle-ci utilise PlagExam visiblement pour déterminer le nombre de colonnes (et de lignes), mais je ne vois pas où se situe la définition de cette fonction PlagExam?


. De plus, comme ta méthode (import du csv puis implémentation) me paraît extrêmement efficace, je vais la garder, mais j'aimerais savoir si il est possible de clore le feuillet du csv à la fin de la maj sans tout casser (j'ai fait un test juste en supprimant toutes les valeurs de ce feuillet, et il semble que ton script n'ai pas trop apprécié l'idée :D ).
Si oui, du coup, je pourrais mettre en place dans la MAJ au début l'import du csv dans un feuillet, la MAJ, puis la suppression du feuillet non?


. En important par macro un nouveau fichier csv dans le feuillet DonCSV, cela fait complètement planté le script de MAJ.
Et pour être honnête, j'ai vraiment du mal à comprendre pourquoi?
Les datas sont pourtant positionnées exactement au même endroit, mais j'ai l'impression que du coup, le "rafraichissement" fait perdre la tête à ton script.
 

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Pour répondre à tes questions:
. C'est bien la la colonne "Nom de l'application" qui est invariant.
. Le "deploie titi" est une données manuelle. Elle n'est en effet retrouvable nulle part, sauf après ajout manuel dans le feuille Base, donc sans importance dans le cas qui nous occupe (en dehors du fait que si je l'ajoute, il ne doit pas disparaître, ce qui est le cas).
 

Dranreb

XLDnaute Barbatruc
Re : Mise à Jour Fichier excel

Bonjour.

PlageExam est le second paramètre, Optional, de PlgUti.
' PlageExam: Plus grande plage susceptible de contenir la plage cherchée.
' Facultatif: UsedRange assumé par défaut.
et en effet la 3ième instruction fait If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
Pas de souci donc pour récupérer en entrée les données qu'il y a. Encore faut-il reproduire la colonne supplémentaire par Ts(Ls, 6) = Détail(6) et prévoir d'abord 1 To 6 au ReDim Ts

Encore que cela pourrait se faire comme ça, je ne conseille pas la suppression du feuillet DonCSV d'importation (ne serait-ce que parce que j'ai donné un nom FDonCSV mnémonique à l'objet Worksheet qui le représente dans la rubrique Microsoft Excel Objets). Totalement à l'opposé, la lecture du CSV pourrait aussi être faite directement dans un tableau VBA. Celui ci serait supporté comme argument de la fonction TableUnique.
 
Dernière édition:

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Bonjour.

PlageExam est le second paramètre, Optional, de PlgUti.et en effet la 3ième instruction fait If PlagExam Is Nothing Then Set PlagExam = PlageDép.Worksheet.UsedRange
Pas de souci donc pour récupérer en entrée les données qu'il y a. Encore faut-il reproduire la colonne supplémentaire par Ts(Ls, 6) = Détail(6) et prévoir d'abord 1 To 6 au ReDim Ts

J'ai essayé de faire la modification comme tu me l'indiques:
ReDim Ts(1 To UBound(Te, 1), 1 To 6)
For Each App In GroupOrg(Te, 1)
Ls = Ls + 1: Ts(Ls, 1) = App.Id
For Each Détail In App.Contenu
Ts(Ls, 2) = Détail(2)
If Détail(0) = 0 Then
Ts(Ls, 3) = Détail(3)
Else
Ts(Ls, 2) = Détail(2)
Ts(Ls, 4) = Détail(4)
Ts(Ls, 5) = Détail(5)
Ts(Ls, 6) = Détail(6)
End If: Next Détail, App

Mais cela ne semble pas marcher. Y'a-t'il un autre endroit où je dois préciser la taille du tableau?


De plus, n'y-at'il pas la possibilité de rajouter une boucle sur le nombre de colonne du FDonCSV?
Du style:

ReDim Ts(1 To UBound(Te, 1), 1 To 6)
For Each Colonne In FDonCSV.Col
For Each App In GroupOrg(Te, 1)
Ls = Ls + 1: Ts(Ls, 1) = App.Id
For Each Détail In App.Contenu
Ts(Ls, Colonne ) = Détail(Colonne)
If Détail(0) = 0 Then
Ts(Ls, Colonne) = Détail(Colonne)
Else
Ts(Ls, Colonne) = Détail(Colonne)
End If: Next Détail, App
Enf If: Next Colonne


Encore que cela pourrait se faire comme ça, je ne conseille pas la suppression du feuillet DonCSV d'importation (ne serait-ce que parce que j'ai donné un nom FDonCSV mnémonique à l'objet Worksheet qui le représente dans la rubrique Microsoft Excel Objets). Totalement à l'opposé, la lecture du CSV pourrait aussi être faite directement dans un tableau VBA. Celui ci serait supporté comme argument de la fonction TableUnique.


Là je suis un peu perdu.
Tu signifies que l'on pourrait faire un import du csv dans un tableau VBA (je ne suis pas sûr de voir la différence avec le feuillet DonCSV, est-ce un tableau virtuel?), qui prendrait la place du feuillet DonCSV?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Mise à Jour Fichier excel

Oui c'est bien ça. Lecture par Open…For Input As #1, Line Input #1,… dans une boucle, Close #1. Phase 2: éclatement par Split(Te(L), ";") dans un tableau interne, plus besoin de feuille Données CSV. Mais est-ce que ça apporterait vraiment quelque chose de perdre la trace du dernier CSV pris en compte ?

Pour ce qui est du nombre de colonnes variable à partir de la 4 :
VB:
Sub MàJ()
Dim Te(), Ts(), App As SsGroup, Ls&, Détail, C&
Te = TableUnique(PlgUti(FBdD.[A2]), PlgUti(FDonCSV.[A2]))
ReDim Ts(1 To UBound(Te, 1), 1 To UBound(Te, 2))
For Each App In GroupOrg(Te, 1)
   Ls = Ls + 1: Ts(Ls, 1) = App.Id
   For Each Détail In App.Contenu
      If Détail(0) = 0 Then
         Ts(Ls, 3) = Détail(3)
      Else
         Ts(Ls, 2) = Détail(2)
         For C = 4 To UBound(Ts, 2): Ts(Ls, C) = Détail(C)
         Next C: End If: Next Détail, App
FBdD.Rows(2).Resize(1000).Delete
FBdD.[A2].Resize(Ls, Ubound(Ts, 2)) = Ts
End Sub
 
Dernière édition:

qwcio

XLDnaute Nouveau
Re : Mise à Jour Fichier excel

Oui c'est bien ça. Lecture par Open…For InputAs #1, LineInput #1,… dans une boucle, Close #1. Phase 2: éclatement par Split(Te(L), ";") dans un tableau interne, plus besoin de feuille Données CSV. Mais est-ce que ça apporterait vraiment quelque chose de perdre la trace du dernier CSV pris en compte ?

En fait, c'est surtout que je connais un peu ceux qui utiliseront ce fichier excel et qu'ils risquent de ne pas comprendre ce feuillet csv, voire y faire des modifs.
Je préfère sécuriser toutes fausses manip' en ne le laissant pas à dispo.


Pour ce qui est du nombre de colonnes variable à partir de la 4 :
VB:
Sub MàJ()
Dim Te(), Ts(), App As SsGroup, Ls&, Détail, C&
Te = TableUnique(PlgUti(FBdD.[A2]), PlgUti(FDonCSV.[A2]))
ReDim Ts(1 To UBound(Te, 1), 1 To UBound(Te, 2))
For Each App In GroupOrg(Te, 1)
   Ls = Ls + 1: Ts(Ls, 1) = App.Id
   For Each Détail In App.Contenu
      If Détail(0) = 0 Then
         Ts(Ls, 3) = Détail(3)
      Else
         Ts(Ls, 2) = Détail(2)
         For C = 4 To UBound(Ts, 2): Ts(Ls, C) = Détail(C)
         Next C: End If: Next Détail, App
FBdD.Rows(2).Resize(1000).Delete
FBdD.[A2].Resize(Ls, Ubound(Ts, 2)) = Ts
End Sub

Parfait.
Je vais essayer de m'en inspirer pour mettre l'éventualité qu'une colonne rajoutée soit "manuelle" et donc que la mise à jour ne fasse pas disparaître l'information.

Je pense que pour cela, au lieu de boucler sur le nombre de colonne à partir de 4, il faut le faire dès le départ.
Je vais tenter de faire cela.
 

Discussions similaires

Statistiques des forums

Discussions
312 765
Messages
2 091 893
Membres
105 086
dernier inscrit
hyacinthe