Microsoft 365 Import Donnes issu de fichier CSV

GClaire

XLDnaute Occasionnel
Supporter XLD
Salut les exceliennes(iens)

je continue sur le fichier de mon ami.

Il reçoit régulièrement de nouveaux thème.
Ces nouveaux thèmes sont dans un fichier CSV,

je tente désespérément d'importer ces données dans mon fichier, mais cela ne se passe pas comme il faut, lol

Ce que je cherche a faire

1) Rechercher le fichier (Qui n'aura jamais le même nom, mais sur le bureau) avec le juste chemin (Sans son nom) dans la cellule "B4" de la feuille "Paramètres", si rien est renseigné dans cette cellule, faire une recherche jusqu'au bureau.

2) Importer les données du fichier trouvé, dans la feuille "Nouveau Theme" de la colonne "A:G"

pour le moment cela importe, mais cela ne garde pas les colonnes comme dans le fichier, je me doute que c'est du fait que c'est un CSV, mais je ne vois pas ce qu'il faut faire.

Il y a peut être d'autres choses qui ne vont pas dans ce code, mais j'ai tenté de faire par rapport a ce que j'ai pu voir sur le forum et adapté.

Si vous avez la solution

Par avance, merci,

Passez une bonne soirée

G'Claire
 

Pièces jointes

  • Aide forum.xlsm
    25.1 KB · Affichages: 3
  • openquizzdb_259.zip
    18.1 KB · Affichages: 5

Cousinhub

XLDnaute Barbatruc
@Cousinhub chez moi à la place de 65001 on peut mettre 2 ou xlWindows
Hi,
Perso, j'ai juste pris ce que PQ proposait (et comme l'import se faisait correctement, je n'ai pas cherché plus....)
1713171142156.png
 

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour,
En rajoutant l'origine des données

VB:
Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
A priori, le texte s'importe correctement
(Bon, je ne vais pas cacher que je préfère PQ, mais si c'est pour le bien de tout le monde....)
Bonne journée
Perso je n'y vois pas d'inconveignant sauf que je métrise encore moins, lol

Je ne voyais pas comment allé se faire la suite car le fichier d'import changera a chaque nouveau theme.

En faite le truc complet et :



1) J'importe la feuille : (Code de job75) dans ce UserForm (Loiiiiiiiiiiiin d'être fini, lol)

1713176413290.png


Avec ce code et les suivants :

Code:
Private Sub UserForm_Initialize()

ImporterDonneesCSV

 With LsV_Import
  With .ColumnHeaders
      .Clear
      .Add , , "N° Question", 60
      .Add , , "Question", 300
      .Add , , "Réponse A", 100
      .Add , , "Réponse B", 100
      .Add , , "Réponse C", 100
      .Add , , "Réponse D", 100
      .Add , , "Niveau", 40, lvwColumnCenter
    End With
    .View = lvwReport 'Affichage en mode Rapport
  End With
  LsV_Import.Gridlines = True 'Affichage d'un quadrillage
  appel
fin:
    Dim i As Integer
   
    ' Parcours de toutes les lignes de la ListView
    For i = 1 To LsV_Import.ListItems.Count
        ' Changer la couleur de la deuxième colonne (index 2)
        'LsV_Import.ListItems(i).ListSubItems(3).ForeColor = RGB(146, 208, 80) ' Modifier vbRed avec la couleur souhaitée
    Next i
End Sub

Sub appel()
Dim i, k
With LsV_Import
 Sheets("Import Theme").Activate
 For i = 1 To Range("A65536").End(xlUp).Row
       
           .ListItems.Add , , Cells(i, 1)
               For k = 2 To 11
                 .ListItems(.ListItems.Count).ListSubItems.Add , , Cells(i, k), , lvwColumnCenter
               Next
         .ListItems(.ListItems.Count).ListSubItems.Add , , i, , lvwColumnCenter
        Next
End With
fin:
End Sub

Code:
Sub ImporterDonneesCSV()

    Dim fichier As Variant
    Dim x As Long
    Dim a() As String
    Dim n As Long
    Dim b() As String
    Dim i As Long

    ChDir ThisWorkbook.Path
    fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

    If fichier = False Then Exit Sub

    Application.ScreenUpdating = False

    ' Supprimez les données existantes sur la feuille "Import Theme"
    Sheets("Import Theme").Cells.Delete

    Workbooks.OpenText fichier, semicolon:=True, Local:=True
'    ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")
    ActiveSheet.UsedRange.Copy Feuil2.[A1]
    ActiveWorkbook.Close

    ' Effectuez les remplacements de caractères
    With Sheets("Import Theme").Cells
        '.Replace "Ã ", "à", xlPart
        .Replace "Ã ", "à", xlPart
        .Replace "À", "À"
        .Replace "â", "â"
        .Replace "ç", "ç"
        .Replace "é", "é"
        .Replace "É", "É"
        .Replace "è", "è"
        .Replace "ê", "ê"
        .Replace "î", "î"
        .Replace "ô", "ô"
        .Replace "ü", "ü"
        .Replace "«", "«"
        .Replace "»", "»"
    End With

    ' Ajustez les largeurs des colonnes
    Sheets("Import Theme").Columns.AutoFit

    ' Supprimez les lignes qui ne sont pas en français
    SupprimerLignesNonFR

    ' Assignez des valeurs de niveau
    AssignerNiveauValeurs
 
    Application.ScreenUpdating = True

    MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub

J'ouvre un UserForm, qui importe cette feuille, dans la feuille "Import theme", je fais un ti ménage :

2) Suppression de tout ce qui n'est pas FR

VB:
Sub SupprimerLignesNonFR()
Dim ws As Worksheet
Dim DerrLigne As Long, i As Long

' Définir la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import theme")

' Trouver la dernière ligne dans la colonne "B"
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

' Parcourir de la dernière ligne à la première
For i = DerrLigne To 1 Step -1
    ' Vérifier si la valeur de la cellule dans la colonne "B" n'est pas "FR"
    If ws.Cells(i, "B").Value <> "fr" Then
        ' Si ce n'est pas "FR", supprimer la ligne entière
        ws.Rows(i).Delete
    End If
Next i
End Sub

3) Je change les valeurs de la colonne "H"

Code:
Sub AssignerNiveauValeurs()
Dim ws As Worksheet
Dim DerrLigne As Long
Dim niveau As String
Dim valeur As Integer

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme")

' Boucler à travers les lignes de la colonne H
For DerrLigne = 1 To ws.Cells(ws.Rows.Count, "H").End(xlUp).Row
    ' Récupérer le niveau de compétence dans la colonne H
    niveau = ws.Cells(DerrLigne, "H").Value
 
    ' Assigner la valeur en fonction du niveau
    Select Case niveau
        Case "Débutant"
            valeur = 1
        Case "Confirmé"
            valeur = 2
        Case "Expert"
            valeur = 3
        Case Else
            ' Gérer les cas où le niveau n'est pas spécifié
            ' ou n'est pas l'un des cas attendus
            valeur = 0 ' Ou toute autre valeur que vous voulez assigner pour ces cas
    End Select
 
    ' Assigner la valeur dans une colonne ou ligne spécifique
    ws.Cells(DerrLigne, "H").Value = valeur
 
Next DerrLigne

'Suppression des colonnes "B", "I:J"
Sheets("Import Theme").Range("B:B,I:I,J:J").Delete Shift:=xlToLeft

End Sub

Ensuite se sera importé dans une listview et des controls en vue de modification si des erreurs ont été décélées.

Si Ok, on envoie dans la feuille "Base" en dispatchant en dessous si les thèmes existent en réincrémentant le N° de questions a la suite de ceux déjà la, et si les thèmes n'existent pas, les mettre a la fin de la base en incrémentant les N° de questions a partir de 1.

Mais la c'est se qu'il y'a dans la tête, je ne sais même pas comment le faire, lol.

Voili toute l'histoire

Y'a peut être plus simple, lol

Merci

Bonne journée
 
Dernière édition:

GClaire

XLDnaute Occasionnel
Supporter XLD
Re-,
Euh, tu avais juste à ajouter 65001, entre fichier et semicolon
VB:
fichier, 650001, semicolon:=True,

Et tout le traitement effectué après import pourrait se faire via PQ...
Mais si tu obtiens le résultat voulu, c'est le principal
Hello

Merci pour la réponse

C'est chose faite, ce qui donne :

VB:
Sub ImporterDonneesCSV()

    Dim fichier As Variant
    Dim x As Long
    Dim a() As String
    Dim n As Long
    Dim b() As String
    Dim i As Long

    ChDir ThisWorkbook.Path
    fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

    If fichier = False Then Exit Sub

    Application.ScreenUpdating = False

    ' Supprimez les données existantes sur la feuille "Import Theme"
    Sheets("Import Theme").Cells.Delete

 '   Workbooks.OpenText fichier, semicolon:=True, Local:=True
 Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
'    ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")
    ActiveSheet.UsedRange.Copy Feuil2.[A1]
    ActiveWorkbook.Close

'    ' Effectuez les remplacements de caractères
'    With Sheets("Import Theme").Cells
'        '.Replace "Ã ", "à", xlPart
'        .Replace "Ã ", "à", xlPart
'        .Replace "À", "À"
'        .Replace "â", "â"
'        .Replace "ç", "ç"
'        .Replace "é", "é"
'        .Replace "É", "É"
'        .Replace "è", "è"
'        .Replace "ê", "ê"
'        .Replace "î", "î"
'        .Replace "ô", "ô"
'        .Replace "ü", "ü"
'        .Replace "«", "«"
'        .Replace "»", "»"
'    End With

    ' Ajustez les largeurs des colonnes
    Sheets("Import Theme").Columns.AutoFit

    ' Supprimez les lignes qui ne sont pas en français
    SupprimerLignesNonFR

    ' Assignez des valeurs de niveau
    AssignerNiveauValeurs
    
    Application.ScreenUpdating = True

    MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub

Après, PQ, je ne sais pas trop faire pour la suite des évènements, autrement sais pas trop non plus d'ailleurs , lol.

Merci

Bonne journée.

G'Claire
 

job75

XLDnaute Barbatruc
Bonjour GClaire, Cousinhub,

Le fichier CSV que vous utilisez a été enregistré au format UTF-8.

C'est la raison pour laquelle des caractères spéciaux s'introduisent, pour les éviter il suffit d'enregistrer le fichier au format classique CSV (séparateur point-virgule), c'est le cas du fichier zippé joint.

A+
 

Pièces jointes

  • Aide forum.xlsm
    21 KB · Affichages: 0
  • openquizzdb_259.zip
    18.4 KB · Affichages: 0

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour GClaire, Cousinhub,

Le fichier CSV que vous utilisez a été enregistré au format UTF-8.

C'est la raison pour laquelle des caractères spéciaux s'introduisent, pour les éviter il suffit d'enregistrer le fichier au format classique CSV (séparateur point-virgule), c'est le cas du fichier zippé joint.

A+
Hello Job75, le forum

Merci, je vais regarder cela

Sinon j'ai ce code (Me souviens plus de qui, oups) qui fonctionne bien avec les modif indiquées ci dessus

Sub ImporterDonneesCSV()

Dim fichier As Variant
Dim x As Long
Dim a() As String
Dim n As Long
Dim b() As String
Dim i As Long

ChDir ThisWorkbook.Path
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

If fichier = False Then Exit Sub

Application.ScreenUpdating = False

'Supprimez les données existantes sur la feuille "Import Theme"
Sheets("Import Theme").Cells.Delete

'Workbooks.OpenText fichier, semicolon:=True, Local:=True
Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
'ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")

ActiveSheet.UsedRange.Copy Feuil2.[A2]

ActiveWorkbook.Close

' Ajustez les largeurs des colonnes
Sheets("Import Theme").Columns.AutoFit


Application.ScreenUpdating = True

MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub
Et pour arriver a mes fins car les concepteurs du soft ne sont pas capables, de donner un fichier qui est structuré de la même manière partout.

Donc j'importe le CSV

Puis je supprime les question qui ne sont pas en FR (Français)

VB:
Sub SupprimerLignesNonFR()
Dim ws As Worksheet
Dim DerrLigne As Long, i As Long

' Définir la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import theme")

' Trouver la dernière ligne dans la colonne "B"
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row + 1

' Parcourir de la dernière ligne à la première
For i = DerrLigne To 2 Step -1
    ' Vérifier si la valeur de la cellule dans la colonne "B" n'est pas "FR"
    If ws.Cells(i, "B").Value <> "fr" Then
        ' Si ce n'est pas "FR", supprimer la ligne entière
        ws.Rows(i).Delete
    End If
Next i
End Sub

Ensuite J'assigne des valeurs au niveau utilisais (Mon pote préférait des numeros)

Code:
Sub AssignerNiveauValeurs()
Dim ws As Worksheet
Dim DerrLigne As Long
Dim niveau As String
Dim valeur As Integer

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme")

' Boucler à travers les lignes de la colonne H
For DerrLigne = 1 To ws.Cells(ws.Rows.Count, "H").End(xlUp).Row
    ' Récupérer le niveau de compétence dans la colonne H
    niveau = ws.Cells(DerrLigne, "H").Value
    
    ' Assigner la valeur en fonction du niveau
    Select Case niveau
        Case "Débutant"
            valeur = 1
        Case "Confirmé"
            valeur = 2
        Case "Expert"
            valeur = 3
        Case Else
            ' Gérer les cas où le niveau n'est pas spécifié
            ' ou n'est pas l'un des cas attendus
            valeur = 0 ' Ou toute autre valeur que vous voulez assigner pour ces cas
    End Select
    
    ' Assigner la valeur dans une colonne ou ligne spécifique
    ws.Cells(DerrLigne, "H").Value = valeur ' Par exemple, colonne I
    
Next DerrLigne

With ws
'Suppression des colonnes "B", "I:J"
.Range("B:B,I:I,J:J").Delete Shift:=xlToLeft

'Ajout des entêtes de colonnes
.Range("A1:K1").Value = Array("N° Questions", "Questions", "Réponse A", "Réponse B", "Réponse C", "Réponse D", "Niveau", "Catégorie", "Theme", "N° Theme", "Difficulté")
End With

End Sub

Puis je réorganise les colonnes pour quelles soient a l'identiques de la base et pour l'import dans une listview afin de modifier des données et réexporter dans la base (Ca je n'y arrive pas car plusieurs conditions )

Code:
Sub ReorganiserColonnes()

' Déclarer les variables
Dim ws As Worksheet
Dim DerrLigne As Long

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme") ' Remplacez "Nom_de_votre_feuille" par le nom de votre feuille

' Trouver la dernière ligne avec des données dans la colonne A
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

' Déplacer les colonnes
With ws
    .Columns("J:J").Cut
    .Columns("A:A").Insert Shift:=xlToRight
    .Columns("J:J").Cut
    .Columns("C:C").Insert Shift:=xlToRight
    .Columns("I:I").Cut
    .Columns("D:D").Insert Shift:=xlToRight
    
    Application.CutCopyMode = False
End With

Et pour finir, je rempli les colonnes pour indiquer que ces données doivent être modifiées

Code:
Sub PreRemplirColonnes_AC()
    Dim ws As Worksheet
    Dim DerrLigne As Long
    Dim i As Long

    ' Spécifie la feuille de calcul à utiliser
    Set ws = ThisWorkbook.Sheets("Import Theme")

    ' Trouve la dernière ligne de la colonne A
    DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    ' Parcourt toutes les lignes de la colonne A à partir de la ligne 2 jusqu'à la dernière ligne
    For i = 2 To DerrLigne
        ' Remplit la cellule de la colonne A avec la valeur "A définir"
        With ws
            .Cells(i, "A").Value = "A définir"
            .Cells(i, "C").Value = "A définir"
        End With
    Next i
End Sub

Je pense qu'il y avait plus simple, mais ca encore j'ai réussi a me débrouiler, lol.


La je me bas avec l'export du contenu de ma listview vers ma feuille "Base", car il y a 2 conditions et je n'y arrive pas

Merci

Bonne soirée, G'Claire
 

Discussions similaires

Réponses
3
Affichages
204

Statistiques des forums

Discussions
312 242
Messages
2 086 536
Membres
103 244
dernier inscrit
lavitzdecreu