MACRO / VBA

Résolu
Thelucas160 Messages postés 219 Statut Membre -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
Bonjour,

Voilà alors, je voudrais créer un programme en VBA, ou il y aurait 6 CheckBox, lorsque l'on clique sur un CheckBox je voudrais qu'il demande de choisir un fichier Excel a importé.

Une fois ceci fait, je voudrais cliquer sur un bouton qui va vérifier que dans ce fichier Excel il y a bien certaines colonnes (par exemple A,H,J) pour le checkbox1, tandis que sur le CheckBox 2 il faudra vérifier les colonnes U,K,P par exemple, le CheckBox 3 encore quelque chose d'autre.

Une fois la vérification faites, il faudrait un bouton « Exporter » qui va exporter les colonnes que l’on a vérifié en CSV sur mon bureau. Mon niveau de VBA est très faible et ce que je veux faire est très complexe. SI vous pourriez m'aider. Ci-joint une photo du visuel si ça peut aider à comprendre :



Merci beaucoup d'avance

6 réponses

Résumé de la discussion

Le sujet porte sur la création d’un formulaire VBA avec six CheckBox pour sélectionner un fichier Excel à importer, puis vérifier des colonnes spécifiques par case à cocher avant l’export CSV. Par exemple, la première case exige A, H et J; la deuxième exige U, K et P; et d’autres combinaisons, avec un bouton Exporter qui écrit les données vers le Bureau au format CSV. Les échanges abordent des conseils pratiques sur la feuille1, le débogage et l’usage éventuel d’une ListBox multisélection, ainsi que l’évitement d’erreurs telles que 1004 sur chemin réseau. D’autres réponses évoquent l’usage potentiel de requêtes SQL ou d’export via Access, et la possibilité d’organiser des colonnes et l’ordre d’export final.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    quelques pistes:

    pour ouvrir un classeur excel:

    https://analysistabs.com/vba/open-file-dialogbox-excel-macros-example-code/

    pour exporter des colonnes en CSV:

    https://www.auditsi.eu/?p=6387

    utilisation des checkbox

    https://silkyroad.developpez.com/VBA/ControlesUserForm/#LII-B

    Après avoir essayé cela reviens si tu as d'autres difficultés

    0
    1. Thelucas160 Messages postés 219 Statut Membre 14
       
      Merci beaucoup pour ta réponse, je vais voir si j'y arrive !
      0
  2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voici un exemple avec les liens que je t'ai donnés.
    A adapter

    https://www.cjoint.com/c/HKgpuT70K7Q

    Dézipper le fichier, il y a 2 classeurs pour les essais.

    Le CSV s'enregistre dans le même dossier que le classeur au même nom avec l'extension CSV

    0
    1. Thelucas160 Messages postés 219 Statut Membre 14
       
      Bonjour, merci beaucoup, vous m'avancer beaucoup !
      0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Je me suis amusé à le faire pour ta problématique avec des checkbox, si cela peut t'aider

    Dans un UserForm mettre 1 CommandButton et 2 CheckBox avec ce code:

    Option Explicit
     Dim dest As Workbook
     Dim nom As String
     Dim strFileToOpen As String
     Dim chemin As String
     Dim nomcsv As String
     Dim n As Long
    Private Sub UserForm_Initialize()
      CheckBox1.Enabled = False
       CheckBox2.Enabled = False
       CheckBox1.Caption = "Colonne A,H,J"
       CheckBox2.Caption = "Colonne K,P,U"
    End Sub
     Private Sub CheckBox1_Change()
       If CheckBox1.Value = True Then
            CheckBox2.Value = False
            n = Range("J65536").End(xlUp).Row 'dernière ligne
           If n > 1 Then 'colonne remplie
    dest.Sheets(1).Range("A1:A" & n & ",H1:H" & n & ",J1:J" & n & "").Select 'plage de cellule
    exportCSV 'enregistrement CSV
    Else
    MsgBox "Il y a une colonne vide!", vbExclamation, "Export CSV"
    End If
         End If
    End Sub
    Private Sub CheckBox2_Change()
       If CheckBox2.Value = True Then
            CheckBox1.Value = False
            n = Range("U65536").End(xlUp).Row 'dernière ligne
             If n > 1 Then 'colonne remplie
    dest.Sheets(1).Range("K1:K" & n & ",P1:P" & n & ",U1:U" & n & "").Select 'plage de cellule
    exportCSV 'enregistrement CSV
    Else
    MsgBox "Il y a une colonne vide!", vbExclamation, "Export CSV"
    End If
         End If
    End Sub
    Private Sub CommandButton1_Click()
    strFileToOpen = Application.GetOpenFilename _
    (Title:="Sélectionnez le classeur à ouvrir", _
    FileFilter:="Excel Files *.xlsx (*.xlsx),")
        Set dest = Workbooks.Open(Filename:=strFileToOpen) 'ouvre le classeur xlsx
      nom = Dir(strFileToOpen) 'nom classeur xlsx
      chemin = Replace(strFileToOpen, nom, "") 'chemin seul
      nomcsv = Replace(nom, "xlsx", "csv") 'nom csv on change l'extension
      CheckBox1.Enabled = True 'check opérationnelle
       CheckBox2.Enabled = True 'check opérationnelle
     End Sub
    Sub exportCSV()
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=chemin & nomcsv, FileFormat:=xlCSV, CreateBackup:=False 'enregistrement CSV
    ActiveWindow.Close
    Application.DisplayAlerts = True
    MsgBox "Votre classeur: " & nomcsv & " est enregistré dans le même dossier que votre classeur: " & nom, vbInformation, "Export CSV"
    dest.Close 'ferme le classeur
    Unload Me 'ferme l'UserForm
    End Sub
    
    
    

    0
    1. Thelucas160 Messages postés 219 Statut Membre 14
       
      Waw, c'est très gentil ! Vous avez fait des étude et programmation / VBA ? merci encore je suis plus qu'avancer !
      0
    2. Thelucas160 Messages postés 219 Statut Membre 14
       
      Est-il possible, lorsque l'on demander de choisir un fichier, d’ouvrir le sélectionneur de fichier a l'emplacement \\192.168.x.x\mesfichier. Sachant que ce chemin réseau doit ce connecter avec un compte (Utilisateur et mdp d'un utilisateur du domaine) et choisir ou enregistrer le fichier csv par la suite ? l'un des tuto qui vous m'avez envoyer permettrait de trouver tout ça ?
      0
    3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Pour ouvrir sur un dossier précis:

      ChDir "C:\Users\LePivert\Documents\Exporter_CSV\" 'a adapter
      strFileToOpen = Application.GetOpenFilename _
      (Title:="Sélectionnez le classeur à ouvrir", _
      FileFilter:="Excel Files *.xlsx (*.xlsx),")


      Pour enregistrer:

      Dim Fichier As String
       ChDir "C:\Users\LePivert\Documents\Exporter_CSV\" a adapter
         Fichier = Application.GetSaveAsFilename(Fichier, "Fichiers CSV (*.csv), *.csv")
          ActiveWorkbook.SaveAs Fichier


      ou récupérer le chemin pour associer à la macro déjà existante:

      MsgBox Fichier


      Voilà

      @+ Le Pivert
      0
    4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      J'ai un peu de temps, voilà comment procéder:

      Option Explicit
       Dim dest As Workbook
       'Dim nom As String
       Dim strFileToOpen As String
       'Dim Chemin As String
       'Dim nomcsv As String
       Dim n As Long
      Dim Fichier As String
      Private Sub UserForm_Initialize()
        CheckBox1.Enabled = False
         CheckBox2.Enabled = False
         CheckBox1.Caption = "Colonne A,H,J"
         CheckBox2.Caption = "Colonne K,P,U"
      End Sub
       Private Sub CheckBox1_Change()
         If CheckBox1.Value = True Then
              CheckBox2.Value = False
              n = Range("J65536").End(xlUp).Row 'dernière ligne
             If n > 1 Then 'colonne remplie
      dest.Sheets(1).Range("A1:A" & n & ",H1:H" & n & ",J1:J" & n & "").Select 'plage de cellule
      ChDir "C:\Users\LePivert\Documents\Exporter_CSV\" 'a adapter
         Fichier = Application.GetSaveAsFilename(Fichier, "Fichiers CSV (*.csv), *.csv") 'chemin de l'enregistrement
      exportCSV 'enregistrement CSV
      Else
      MsgBox "Il y a une colonne vide!", vbExclamation, "Export CSV"
      End If
           End If
      End Sub
      Private Sub CheckBox2_Change()
         If CheckBox2.Value = True Then
              CheckBox1.Value = False
              n = Range("U65536").End(xlUp).Row 'dernière ligne
               If n > 1 Then 'colonne remplie
      dest.Sheets(1).Range("K1:K" & n & ",P1:P" & n & ",U1:U" & n & "").Select 'plage de cellule
      ChDir "C:\Users\LePivert\Documents\Exporter_CSV\" 'a adapter
         Fichier = Application.GetSaveAsFilename(Fichier, "Fichiers CSV (*.csv), *.csv") 'chemin de l'enregistrement
      exportCSV 'enregistrement CSV
      Else
      MsgBox "Il y a une colonne vide!", vbExclamation, "Export CSV"
      End If
           End If
      End Sub
      Private Sub CommandButton1_Click()
      ChDir "C:\Users\LePivert\Documents\Exporter_CSV\" 'a adapter
      strFileToOpen = Application.GetOpenFilename _
      (Title:="Sélectionnez le classeur à ouvrir", _
      FileFilter:="Excel Files *.xlsx (*.xlsx),")
          Set dest = Workbooks.Open(Filename:=strFileToOpen) 'ouvre le classeur xlsx
        'nom = Dir(strFileToOpen) 'nom classeur xlsx
       ' Chemin = Replace(strFileToOpen, nom, "") 'chemin seul
       ' nomcsv = Replace(nom, "xlsx", "csv") 'nom csv on change l'extension
        CheckBox1.Enabled = True 'check opérationnelle
         CheckBox2.Enabled = True 'check opérationnelle
       End Sub
      Sub exportCSV()
      Selection.Copy
      Workbooks.Add
      ActiveSheet.Paste
      Application.CutCopyMode = False
      Application.DisplayAlerts = False
      ActiveWorkbook.SaveAs Filename:=Fichier, FileFormat:=xlCSV, CreateBackup:=False 'enregistrement CSV
      ActiveWindow.Close
      Application.DisplayAlerts = True
      MsgBox "Emplacement de votre classeur CSV: " & Fichier, vbInformation, "Export CSV"
      dest.Close 'ferme le classeur
      Unload Me 'ferme l'UserForm
      End Sub
      


      @+ Le Pivert
      0
    5. Thelucas160 Messages postés 219 Statut Membre 14
       
      Merci encore ^^ par contre j'ais une petite erreur en voulant modifier le code :





      je veu choisir les colonne B et L sur un export, dnoc je change le n = Range("U65536") par n = Range("L65536")

      et

      dest.Sheets(1).Range("K1:K" & n & ",P1:P" & n & ",U1:U" & n & "").Select 'plage de cellule

      remplacer par

      dest.Sheets(1).Range("B1:B" & n & ",L1:L" & n & "").Select 'plage de cellule

      Une idée ? j'ai du me louper quelque part
      0
  4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Ce que tu veux faire, c'est nommer une plage de données
    Voir ceci:

    http://www.helenemarchand.com/2010/05/31/excel-2007-nommer-une-plage-de-donnees/

    Mais pour faire cela il faut avoir préalablement sélectionné la plage!

    Voici un exemple de ce que l'on peut faire avec la sélection multiple:

    https://www.cjoint.com/c/HKnmPiuj5RQ

    l'avantage, cela nécessite très peu de code et évite une usine à gaz!
    en prime j'ai ajouté la conversion de CSV vers Excel

    Voilà
    0
    1. Thelucas160 Messages postés 219 Statut Membre 14
       
      Ça a l'aire bien compliquer de mettre un ordre spécifique ! Mais je me penche sur la selection multiple ! merci

      Petite question, jais fait ce code :

      If CheckBox2.Value = True Then
      Range("B1, L1").Select
      If (IsEmpty(ActiveCell)) Then
      TextBox2.Text = "colonne vide : " & ActiveCell.Address
      Else
      TextBox2.Text = "Pret a l'export"
      End If

      Il fonctionne a moitie, lorsque B1 est vide ca fonctionne, mais lorsque B1 est pleine et L1 vide il dis que tout va bien.

      C'est 1 seul bouton qui normalement me dis quelle colonne est vide (ici checkbox2 a besoin de B et L donc il faut vérifier quelle sois bien pleine et qu'il n'y est pas de décalage!)
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Faire comme l'exemple ici sur les 2 colonnes:

      https://forums.commentcamarche.net/forum/affich-35679687-macro-vba#5

      C'est pour cela que je dis que c'est une usine à gaz, si il y a 3, 4 etc; colonnes!!!!!!!!!

      enfin c'est toi le chef

      j'ai eu un post qui me demandait de permuter les colonnes. Si cela t’intéresse j'ai fait une macro

      @+ Le Pivert
      0
    3. Thelucas160 Messages postés 219 Statut Membre 14
       
      La macro je suis preneur :) merci

      Oui une usine a Gaz c'est sur !! J'essaie de faire au mieux malgré mon faible niveau

      j'avais commencer par un if elseif qui fonctionnais bien. mais je fait plusieurs code différent pour apprendre / voir la différence
      0
    4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      faut vérifier quelle sois bien pleine et qu'il n'y est pas de décalage!)

      comme ceci:

       Private Sub CheckBox2_Change()
       Dim nB As Integer
        Dim nL As Integer
        If CheckBox2.Value = True Then
         nB = Range("B65536").End(xlUp).Row 'dernière ligne B
         nL = Range("L65536").End(xlUp).Row 'dernière ligne L
         If nB = nL Then 'colonne égale
      MsgBox "Pret a l'export"
      Else
      MsgBox "une des 2 colonnes n'est pas égale"
      End If
      End If
         End Sub


      Pour permuter une colonne:

       Dim coldepart As String
        Dim coldest As String
      coldepart = InputBox("Entrez la lettre de la colonne à permuter", "Permuter colonne", "A")
      Do While Len(coldepart) = 0
      Exit Sub
      Loop
      coldest = InputBox("Entrez la lettre de la colonne  de destination", "Permuter colonne", "E") 'si destination A->Z colonne a gauche de la lettre choisie, si destination A<-Z colonne lettre choisie
      Do While Len(coldest) = 0
      Exit Sub
      Loop
      Columns(coldepart & ":" & coldepart).Select
          Selection.Cut
          Columns(coldest & ":" & coldest).Select
          Selection.Insert Shift:=xlToRight
      


      Voilà

      @+ Le Pivert
      0
    5. Thelucas160 Messages postés 219 Statut Membre 14
       
      Merci beaucoup, ça ma bien servit et ça fonctionne très bien. Désoler réponse tardive.

      Vous pensez que l'on peu l'adapter pour le faire automatiquement avec des colonne prédéfinie.

      Demander par exemple :

      Permuter A avec F puis G avec D puis J avec B et après ça enregistre ?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Thelucas160 Messages postés 219 Statut Membre 14
     
    Par contre, est-il possible de prendre les colonne A,B,C,D (par exemple)

    et de les mettre a a partie de A3, B3, C3, D3

    tout en disant de remplir A1 avec Test, B2 avec Truc2 etc... ? je ne suis pas claire je pense mais compliquer d'expliquer :/
    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Tu t'embarques encore dans une usine à gaz ! -:(

      mettre ce code à l'ouverture du classeur:

        Dim n As Integer
          n = 2 'nbre lignes à ajouter
      ActiveSheet.Rows(1).Resize(n).Insert Shift:=xlDown
      Range("A1").Value = "machin"
      Range("A2").Value = "truc"
      


      à adapter les autres cellules de remplissage

      ne pas oublier à la fermeture du classeur de ne pas enregistrer les modifications
      0
    2. Thelucas160 Messages postés 219 Statut Membre 14
       
      Les usine a gaz j'adore çà apparemment :/

      Si vous voulez auriez vue mon programme actuellement...

      Pour l'instant il faut que, en appuyant sur le bouton enregistrer, il prenne les colonne de fichier Custommer et les mette dans des autre colonne du nouveau fichier.. je ne sais pas si sans permutation c'est possible.

      Pour bien comprendre. a la tout fin, je choisir le fichier custommer et j'en sort 2 fichier différent.

      A quoi correspond c'es ligne :

      n = 2 'nbre lignes à ajouter
      ActiveSheet.Rows(1).Resize(n).Insert Shift:=xlDown

      Moi j'avais penser a simplement faire [B1]="Test" quand on clique sur enregistrer (qui fonctionne pour le moment) Mais ce n'est peu-être pas ergonomique
      0
    3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      n = 2 'nbre lignes à ajouter

      c'est assez explicite

      tu peux mettre aussi ceci:

      ActiveSheet.Rows(1).Resize(2).Insert Shift:=xlDown '1 première ligne, 2 lignes a ajouter
      


      Donc quand tu lances ce code, il va ajouter 2 lignes avant les en-têtes, ensuite il te suffit de permuter tes colonnes, de sélectionner celles à enregistrer et d'ajouter le texte aux cellules que tu désires.
      Quand toute ta tambouille est faite tu n'as plus qu'à enregistrer!

      C'est simple :-)

      @+
      0
  7. Thelucas160 Messages postés 219 Statut Membre 14
     
    Bonjour, Merci pour la dernière, je n'est pas eu de temps de repondre.

    Petit question :

    J'ai 2 colonne,

    A = CODE CLIENT ou 1/2/3 etc.. ( sachant que 1 peu resortir plusieur fois par exemple)
    B = V50 ou V10 ou V100 ou V20 etc...

    j'aimerait avoir une colonne pour chaque V10 V20 etc en fonction de ce que dispose le client.

    donc une sorte de tableau croiser dynamique en vba avec un commandbutton

    Serais-ce possible ?
    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Bonjour,

      Pour une plus grande clarté sur le forum:

      Nouvelle question = nouveau post

      @+ Le Pivert
      0