XL 2013 Recopie automatique de lignes entre 2 classeurs

LE GUERROUE

XLDnaute Nouveau
Bonjour à tous,

J'ai besoin de votre aide.

Je dispose d'une base de données exportée depuis un logiciel au format .csv et se présentant sous forme de plusieurs colonnes (CSV).
Je souhaiterais que cette extraction (régulièrement exportée et écrasée) permette d'alimenter un tableau de bord (TDB) mis en page de façon automatique.
Pour cela je pensais utiliser la fonction RECHERCHE d'Excel.
Les colonnes de mon tableau sont identiques et la première colonne N°réf est déroulée dans mon TDB.
L'idée étant donc de dire à mon TDB de copier la ligne du CSV correspondant à un N° sur la ligne correspondante dans le TDB.
Mais voilà je galère sur la formule à adopter...

Je pensais à :
=RECHERCHE($A2;'CSV'!$A:$A;'CSV'!$B:$B) mais cela ne correspond pas à la recopie d'une ligne complète mais seulement d'une case. ce qui m'oblige a déroulée la formule dans chaque case de mon TDB.

N'est-il pas possible de faire une recopie d'une ligne entière ?

Autre problème si le numéro de réf n'est pas retrouver dans le .CSV il me rempli la case avec le numéro le plus proche...

Je ne sais pas si ma demande est très claire.
J'espère un petit peu...

En vous remerciant par avance,

Audrey
 
Dernière édition:

LE GUERROUE

XLDnaute Nouveau
Bonjour,

Voici les fichiers que j'ai du revoir car confidentiel +++. Ils ont anonymisés et beaucoup plus petit qu'en réalité.
FICHIER CSV régulièrement exporté et sauvegardé (écrasement) et donc changeant.
Le "vrai" possède énormément de colonnes (45 colonnes) et de lignes (environ 2000 lignes en fin d'année), d'où l'interêt d'une recopie de la ligne entière.
En vous remerciant par avance,

Audrey
 

Pièces jointes

  • essai toto.zip
    9.6 KB · Affichages: 18

job75

XLDnaute Barbatruc
Bonjour LE GERROUE, vmax01, le forum,

Téléchargez et placez les fichiers joints dans le même répertoire (le bureau).

1) A l'ouverture (ou activation) du fichier essai(1).xlsm un Dictionary est créé par cette macro dans ThisWorkbook :
Code:
Private Sub Workbook_Activate()
Dim fichier$, texte$, ref$
fichier = Me.Path & "\toto.csv" 'à adapter éventuellement
Set dico = CreateObject("Scripting.Dictionary")
Open fichier For Input As #1 'accès au fichier csv
Do While Not EOF(1) 'EndOfFile: fin du fichier
    Line Input #1, texte 'récupère la ligne
    ref = UCase(Split(texte, ";")(0)) 'référence en 1ère colonne, majuscules
    dico(ref) = Mid(texte, Len(ref) + 2) 'mémorisation des autres colonnes
Loop
Close #1 'fermeture du fichier csv
Calculate 'recalcul des formules volatiles
End Sub
La lecture séquentielle du fichier CSV est très rapide.

2) Le Dictionary est utilisé par cette fonction VBA matricielle :
Code:
Public dico As Object 'mémorise la variable

Function CSV(ref$)
Application.Volatile
ref = UCase(ref) 'majuscules
CSV = ""
If Not dico.exists(ref) Then Exit Function
Dim s, a(), i%
s = Split(dico(ref), ";")
ReDim a(UBound(s)) 'base 0
For i = 0 To UBound(s)
    a(i) = s(i)
    If IsDate(a(i)) Then a(i) = CDate(a(i)) 'conversion
    If IsNumeric(a(i)) Then a(i) = CDbl(a(i)) 'conversion
Next
CSV = a 'vecteur ligne
End Function
Le code doit impérativement être placé dans un module standard (Module1).

3) La fonction est utilisée dans la feuille de calcul en B2:E2 :
Code:
=CSV(A2)
La formule est entrée en bloc dans la plage et validée matriciellement par les touches Ctrl+Maj+Entrée puis tirée vers le bas.

Avec cette méthode le recalcul du tableau est très rapide même s'il y a beaucoup de lignes.

Bonne journée.
 

Pièces jointes

  • essai(1).zip
    22.6 KB · Affichages: 19

job75

XLDnaute Barbatruc
Re,

J'ai testé avec un tableau de 45 colonnes et 2000 lignes : chaque fichier "pèse" environ 650 Ko.

Durées d'exécution chez moi sur Win 10 - Excel 2013 pour l'ouverture du fichier .xlsm :

- lecture séquentielle du fichier CSV et création du Dictionary => 0,14 seconde

- recalcul des formules matricielles => 0,53 seconde.

A+
 

Discussions similaires