XL 2016 Importation de donnée d'un fichier vers un autre

scoubidou35

XLDnaute Occasionnel
Bonjour à tous,
Je suis depuis ce WE à essayer de comprendre pourquoi mon code ne veux pas fonctionner donc je vous sollicite une fois de plus.

Je veux pouvoir importer des données dans mon fichier 'MONFICHIERS' à partir d'un fichier que j'aurai choisi moi même (les noms changes d'une année sur l'autre mais la structure du fichier lui reste toujours la même).

J'aimerai récupéré les colonnes 1 et 13 dans 'Fichier avec données à importer' et les copier dans 'MONFICHIERS' respectivement dans les colonnes B et A
J'arrive à ouvrir le fichier de mon choix mais après il y a un bug et rien n'est transféré.

Il faut en plus mais je ne suis pas encore penché dessus que l'information de la colonne 13 soit modifié pour la colonne A pour n'avoir qu'une partie de l'info :
exemple : dans la colonne 13 j'ai 20200504-152600-TEST_2020LMTA19_1_1_7.spc mais je veux que dans la colonne A de 'MONFICHIERS' n'apparaisse seulement 2020LMTA19_1_1_7

Je reste dispo pour toutes informations complémentaires bien sûre.

Merci d'avance pour l'aide
 

Pièces jointes

  • Fichier avec données à importer.xlsx
    18.5 KB · Affichages: 6
  • MONFICHIERS.xlsm
    35 KB · Affichages: 8
Solution
Bonjour,

Voici une macro d'extraction avec une connexion ADODB au fichier choisit. Fichier qui n'est donc point ouvert par excel.

C'est la requête SQL qui fait le travail de nettoyage des chaînes.

Bien-sûr tout peut être amélioré, les lignes ajoutées au lieu d'être remplacées etc..

Cordialement

scoubidou35

XLDnaute Occasionnel
edit:
Je me suis aperçu ce matin que le code plante si le fichier des données est déjà ouvert.
J'ai rajouté une récupération de la chaine en une seule ligne.
ci-joint fichier.


Bonjour cp4.
Merci pour l'aide. Peux tu me dire pourquoi tu me conseilles plutôt d'utiliser le code :
Tfinal(1, j) = Mid(Tsource(i, 13), InStr(Tsource(i, 13), "_") + 1, InStr(Tsource(i, 13), ".") - InStr(Tsource(i, 13), "_") - 1)

Plutôt que celui-ci
Tfinal(1, j) = Replace(Tsource(i, 13), ".spc", " ")
Tfinal(1, j) = Mid(Tfinal(1, j), 22, 17)

Le résultat est le même au final. Merci de m'éclairer et à mieux comprendre VBA
 

cp4

XLDnaute Accro
Bonjour cp4.
Merci pour l'aide. Peux tu me dire pourquoi tu me conseilles plutôt d'utiliser le code :
Tfinal(1, j) = Mid(Tsource(i, 13), InStr(Tsource(i, 13), "_") + 1, InStr(Tsource(i, 13), ".") - InStr(Tsource(i, 13), "_") - 1)

Plutôt que celui-ci
Tfinal(1, j) = Replace(Tsource(i, 13), ".spc", " ")
Tfinal(1, j) = Mid(Tfinal(1, j), 22, 17)

Le résultat est le même au final. Merci de m'éclairer et à mieux comprendre VBA
En effet, au final on a le même résultat. Il y a bien d'autres solutions.
La fonction InStr renvoie la position du caractère dans la chaîne. Pour reste c'est de l'arithmétique dans l'utilisation de la fonction Mid.
 

scoubidou35

XLDnaute Occasionnel
Bonjour,

Voici une macro d'extraction avec une connexion ADODB au fichier choisit. Fichier qui n'est donc point ouvert par excel.

C'est la requête SQL qui fait le travail de nettoyage des chaînes.

Bien-sûr tout peut être amélioré, les lignes ajoutées au lieu d'être remplacées etc..

Cordialement


Merci Roblochon pour cette autre possibilité. Je suis loins de maitriser comme vous excel. D'ailleur je n'avais jamais entendu parler de connexion ADODB encore quelque chose que je devrai fouiller sur internet durant l'hiver.
 

scoubidou35

XLDnaute Occasionnel
Bon je vous remercie cp4, Herve62, et Roblochon pour le temps que vous m'avez consacré et les solutions proposées (plus ou moins complexe, mais je suis ici pour apprendre) mais je crois qu'il va falloir que j'investisse dans le livre "VBA pour les nuls" pour essayer de maîtriser encore plus à Noël :). Je vais voir pour adapter le code de cp4 à mon vrai fichier. Mais je garde la solution de Roblochon avec PowerQuery sous le coude pour plus tard car j'ai regardé sur internet un peu hier soir et c'est un outil qui se situerai entre mon niveau excel et VBA.
Merci encore à tous et bonne journée.
 

scoubidou35

XLDnaute Occasionnel
En effet, au final on a le même résultat. Il y a bien d'autres solutions.
La fonction InStr renvoie la position du caractère dans la chaîne. Pour reste c'est de l'arithmétique dans l'utilisation de la fonction Mid.

Re-bonjour cp4
J'ai fait une erreur avec le fichier test que j'ai mis sur le site et le mon fichier de travail.
En fait actuellement, dans le fichier test Tfinal affiche les données dans les colonnes A et B du tableau or en fait dans mon fichier de travail il y a un décalage d'une colonne donc il faut que les données soient transposé en colonnes B et C.
Je pensais qu'en modifiant au niveau du code
Tfinal(1, j) = Mid(Replace(Tsource(i, 13), ".spc", " "), 22, 17) 'scan file name col13
Tfinal(2, j) = Tsource(i, 1) 'sample col1

en mettant Tfinal(2,j) =.......
Tfinal(3,j) = .......
que cela fonctionnerait mais ce n'est pas le cas. Comment je dois procéder? Merci
 

cp4

XLDnaute Accro
Re-bonjour cp4
J'ai fait une erreur avec le fichier test que j'ai mis sur le site et le mon fichier de travail.
En fait actuellement, dans le fichier test Tfinal affiche les données dans les colonnes A et B du tableau or en fait dans mon fichier de travail il y a un décalage d'une colonne donc il faut que les données soient transposé en colonnes B et C.
Je pensais qu'en modifiant au niveau du code
Tfinal(1, j) = Mid(Replace(Tsource(i, 13), ".spc", " "), 22, 17) 'scan file name col13
Tfinal(2, j) = Tsource(i, 1) 'sample col1

en mettant Tfinal(2,j) =.......
Tfinal(3,j) = .......
que cela fonctionnerait mais ce n'est pas le cas. Comment je dois procéder? Merci
Non ce n'est pas ça, il faudrait remplacer juste la colonne de départ au lieu de A c'est B au niveau de la ligne de code juste avant le dernier End With (ci-dessous)
VB:
      If j > 0 Then Sheets("validation").Range("A" & dl).Resize(j, 2) = Application.Transpose(Tfinal)
'au lieu Range("A"& dl)------> Range("B"& dl)
 

scoubidou35

XLDnaute Occasionnel
Non ce n'est pas ça, il faudrait remplacer juste la colonne de départ au lieu de A c'est B au niveau de la ligne de code juste avant le dernier End With (ci-dessous)
VB:
      If j > 0 Then Sheets("validation").Range("A" & dl).Resize(j, 2) = Application.Transpose(Tfinal)
'au lieu Range("A"& dl)------> Range("B"& dl)

Merci, en fait Tsource et Tfinal sont des tableaux fictives pour faire la transition. C'est bien cela?
 

Discussions similaires

Haut Bas