VBA Importation de données d'un autre classeur

Bonjour,

Je travail actuellement sur une macro Excel afin d'importer des erreurs à l'aide d'un fichier ".csv", et une base de données qui me permet par la suite de faire correspondre les erreurs avec leur libellé (j'ai utilisé la foncton VLookUp).

Pour travailler j'importe donc les deux Worksheets qui sont dans 2 Workbooks différents, dans mon WorkBook. Je n'ai aucun problème lors de l'importation des 3 colonnes de ma BDD (base de données) qui est dans un fichier (.xlsx). Cependant lorsque j'ouvre mon fichier d'erreur en ".csv" avec ma macro il change automatiquement le format des cellules.

Voici le morceau de Code :

  
  Dim a As Variant, Recepteur As String, Emetteur As String
  Dim FinalRow As Integer

'---------------------------------------- Importation Feuille excel ---

   Recepteur = ActiveWorkbook.Name  'Le classeur sur lequel je travail
    ChDrive "C:"    ' Choix du lecteur
    ChDir "C:\"    'Choix du répertoire
    a = Application.GetOpenFilename("fichier excel (*.csv), *.csv", _
                                    , "Sélection de vos fichiers excel", , True) 'Variable tableau comprenant le chemin d'accès au classeur Emetteur

    Select Case TypeName(a)
    Case Is = "Boolean"
        Exit Sub
    Case Else
        For b = LBound(a) To UBound(a)
            Workbooks.Open a(b)
        Next
    End Select

'------------------------- A partir d'ici le classeur Emetteur est deja ouvert et les cellules ont deja changees
    Emetteur = ActiveWorkbook.Name ' nom du classeur qui contient les donnees que je souhaite récupérer

    FinalRow = Range("A" & Rows.Count).End(xlUp).Row  'Derniere ligne de la colonne A du classeur Emetteur

     Cells.Select  'Selectionne toutes les celulles

    Selection.Copy 'Copie la Selection dans le Presse Papier

    Windows(Recepteur).Activate 'Place le classeur Recepteur

    Worksheets("Feuil3").Activate 'Sur la feuille 3

     Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False' Selectonne la case A1 puis fait un collage

    'Activation puis desactivation des messages d erreurs 
    Application.DisplayAlerts = False
    Windows(Emetteur).Close 'Ferme le classeur Emetteur
    Application.DisplayAlerts = True
    

Je n'ai rien inventé dans ce morceau de code, que j'ai trouvé plusieurs fois sur internet, cependant je n'ai pas trouvé un problème similaire au miens.

Je ne comprend pas pourquoi la macro concatène mes cellules en 2. Je vous joins mes 2 fichiers excel.

Je vous remercie par avance pour votre aide.

17vba.xlsm (490.22 Ko)

bonsoir,

ce code-ci, qui met les données en colonnes, était en commentaire.

'---------------------------------------- Tri_point_virgule Macro ---

    Columns("A:A").Select
  Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
       TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
       Array(7, 1), Array(8, 1), Array(9, 4), Array(10, 1), Array(11, 1)), _
     TrailingMinusNumbers:=True

'----------------------------------------

pourquoi a-t-il été désactivé ?

J'ai mis cette partie de code concernant le traitement des données sur ma page après l'importation en commentaire car mon problème avais déjà eu lieu. En effet mon problème intervient lorsque j'ouvre mon workbook qui contient les données à importer. Ces données sont normalement dans les colonnes "A:K" , mais quand j'ouvre le workbook avec ma macro les colonnes se concaténant entre ("A:B") et mes virgules deviennent des underscore ce qui me crée des problèmes par la suite. Sinon les colonnes se séparent avec un ";" et je peux les séparer avec le code que tu as réactivé. Cependant en faisant ça, la colonne "TPS_Total" contient des temps intraitable (_11 ou bien 5_88)...

De plus le fait que les virgules deviennent des underscore me fait subir des pertes de données sur certaines lignes. Cela ne se voit pas car j'ai donné un fichier d'erreur qui ne contenait que 200 erreurs au lieux des 5000 habituelles. Je joins donc un fichier ou j'ai mis en tête les lignes qui perdent des données lors du transfert (une dizaine).

8ereur2.zip (4.47 Ko)

Ces données étant envoyées par MES il m'est évidemment impossible de changer leur format.

Au plaisir de vous lire'

Bonjour,

une proposition de correction de ta macro de lecture du fichier erreur

26vba.xlsm (290.73 Ko)

Salut,

Premièrement je vous remercie d'avoir pris le temps de traiter ma demande et qui plus est d'avoir réussis à résoudre mon problème. Mon travail maintenant est donc de comprendre votre code afin de parvenir à le réaliser moi même la prochaine fois. En relisant votre travail j'ai compris plusieurs partis mais certaines reste floues à mes yeux, je vais donc vous poser quelques questions.

   dl = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To dl
        j = 2
        While Cells(i, j) <> ""
            Cells(i, 1) = Cells(i, 1) & "," & Cells(i, j)
            j = j + 1
        Wend
    Next i

En lisant cette partie de code je comprend que vous placez le contenu de chaque colonne non vide d'une ligne dans la première cellule de la ligne en séparant le contenu des colonnes avec une virgule.

Set Cible = New DataObject
    Cible.SetText ""
    Cible.PutInClipboard
    Set Cible = Nothing

Cette partie du code est bien plus abstraite pour moi, je comprend que vous utilisez une alternative au Presse-Papiers qui est active seulement pendant l'utilisation du Workbook à l'inverse du Presse-Papiers. Vous imposez un format texte à cette objet et vous l'utiliser lors du transfert des données. Ce que je ne comprends pas, c'est qu'à aucun moment, je vous vois appelé cet objet, je ne comprend donc pas comment il fonctionne.

Cordialement,

Alexian'

Salut,

Premièrement je vous remercie d'avoir pris le temps de traiter ma demande et qui plus est d'avoir réussis à résoudre mon problème. Mon travail maintenant est donc de comprendre votre code afin de parvenir à le réaliser moi même la prochaine fois. En relisant votre travail j'ai compris plusieurs partis mais certaines reste floues à mes yeux, je vais donc vous poser quelques questions.

   dl = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To dl
        j = 2
        While Cells(i, j) <> ""
            Cells(i, 1) = Cells(i, 1) & "," & Cells(i, j)
            j = j + 1
        Wend
    Next i

En lisant cette partie de code je comprend que vous placez le contenu de chaque colonne non vide d'une ligne dans la première cellule de la ligne en séparant le contenu des colonnes avec une virgule.

correct

Set Cible = New DataObject
    Cible.SetText ""
    Cible.PutInClipboard
    Set Cible = Nothing

Cette partie du code est bien plus abstraite pour moi, je comprend que vous utilisez une alternative au Presse-Papiers qui est active seulement pendant l'utilisation du Workbook à l'inverse du Presse-Papiers. Vous imposez un format texte à cette objet et vous l'utiliser lors du transfert des données. Ce que je ne comprends pas, c'est qu'à aucun moment, je vous vois appelé cet objet, je ne comprend donc pas comment il fonctionne.

pour moi cette partie-ci est inutile, mais je l'ai laissée car elle faisait partie de ton code et ne pose pas de problème.

Rechercher des sujets similaires à "vba importation donnees classeur"