MACRO / VBA

MACRO / VBA Call macro vba - Conseils pratiques - Visual Basic Macros - Comment les créer - Articles Exécuter une macro - Articles Appliquer une pause dans une macro vba excel ✓ - Forum - VB / VBA Actualiser feuille excel avec macro VBA ✓ - Forum - Access

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

Forum

MACRO / VBA Call macro vba - Conseils pratiques - Visual Basic Macros - Comment les créer - Articles Exécuter une macro - Articles Appliquer une pause dans une macro vba excel ✓ - Forum - VB / VBA Actualiser feuille excel avec macro VBA ✓ - Forum - Access

Web: www.shapebootstrap.net

32 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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



Reply
réponses:
  • auteur

    Merci beaucoup pour ta réponse, je vais voir si j'y arrive !

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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

Reply
réponses:
  • auteur

    Bonjour, merci beaucoup, vous m'avancer beaucoup !

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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   

Reply
réponses:
  • auteur

  • auteur

    Waw, c'est très gentil ! Vous avez fait des étude et programmation / VBA ? merci encore je suis plus qu'avancer !

  • auteur

    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 ?

  • auteur

    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

  • auteur

    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

  • auteur

    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

  • auteur

    Le code est bon, je ne vois qu'une seule chose:
    la feuille est bien la feuille 1?

  • auteur

    Oui c'est bien la Feuil1 et j'ai essayer avec feuille1 aussi. Ce qui me perturbe c'est que ca fonctionnait hier !

  • auteur

    Je viens de tester avec votre fichier Customer, avec les colonne D et F et même problème

    dest.Sheets(1).Range("D1:D" & n & ",F1:F" & n & "").Select 'plage de cellule

  • auteur

    Le je vien de tester, j'ai importer un autre UserForm, j'ai mis 2 checkbox, et un bouton, coller le code que vous m'avez gentillement mis a disposition et même erreur (test avec la feuil Customer).

    C'est toujours avec qu'il y a des chose inexplicable !

  • auteur

    Voilà un fichier qui fonctionne très bien chez moi. Il suffira de changer le chemin du dossier. Tu remarqueras que j'ai changé le nom de l'utilisateur par ceci qui s'adaptera à n'importe quel environnement:

     nom = Environ("USERNAME") 'nom de l'utilisateur


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

    @+ Le Pivert

  • auteur

    Merci ! J'ai changer de Poste et j'ai réussi a faire marcher aha. sauf une ligne :

    dest.Sheets(1).Range("X1:X" & n & ",M1:M" & n & ",BH1:BH" & n & ",N1:N" & n & ",AE1:AE" & n & ",AW1:AW" & n & "BI1:BI" & n & "").Select 'plage de cellule

    La feuille est bien la feuille1 et elle s’appelle vInfo (peu être la raison du problème ?

    Je test avec le fichier que vous m'avez envoyer :) merci encore

  • auteur

    Il y a plusieurs manières de nommer une feuille voir ceci:

    https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/

    @+

  • auteur

    Merci :D

  • auteur

    manque un virgule ici:

    "BI1:BI"

  • auteur

    Mon problème doit venir du fait que sur 1 seul bouton, je veuille faire plusieur action :

    Si cehckbox1 alors enregistrer avec les colonne A,V,B
    Si checkbox2 alors enregistrer U,O,P,K,F (valeur au hasard)
    Si checkbox3 etc..

    jai 26 CheckBox en tout, pour 1 bouton "enregistrer"

  • auteur

    Ce n'est pas possible!

    Il faut enregistrer un checkbox à la fois de la manière dont le code est fait.
    Il ouvre le classeur a chaque checkbox coché

    Si tu veux faire plusieurs choix, cela va être une usine à gaz

    Il faut un utiliser un Select Case.avec multiple choix
    Renseigne toi de ce côté

    voilà

  • auteur

    Voici un essai avec une listBox multisélection. J'ai commencé avec 3 colonnes pour que tu voies la marche à suivre.
    l'index de chaque colonne sélectionnée est mis dans la 2 ème feuille de Customer. Pour être rappelé pour la sélection des colonnes. Parce qu'avec tes checkbox à chaque fois que tu cliques tu effaces la sélection précédente. Il faudra que tu fasses une macro pour chaque cas: 2 colonnes, 3, 4, 5, 6 etc.
    L'avantage tu peux choisir tes colonnes.

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

    @+ Le Pivert

  • auteur

    Je t'ai fait un exemple avec 4 CheckBox, tu vas voir qu'avec 26 cela devient vite une usine à gaz.

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

    Moi je verrai plus une sélection manuelle des colonnes avec Ctrl pour ajouter une nouvelle sélection. Ensuite il n'y a plus qu'a exporter.

    A toi de voir la balle est dans ton camp!

    Bon WE

    @+ Le Pivert

  • auteur

    Le même principe avec une listBox.

    Avantage beaucoup moins de code!

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

    @+ Le Pivert

  • auteur

    Merci beaucoup pour tout ! désoler pour ma réponse tardive ! Vous savez si il est possible lorsque je clique sur annuler si imagination je me trompe de fichier, je n'est pas d'erreur "1004" le fichier Faux.xls est introuvable.

    J'ai réussi a bien avancer grasse a vous ! seul partie compliquer : ouvrir le chemin \\192.168.1.8\MONFICHIER

    Vous avez fait des étude de prog ?

  • auteur

    Je n'ai pas fait d'étude de programmation, je suis un autodidacte comme beaucoup de membres de ce site. J'ai appris grâce au forum, et maintenant je renvoie l’ascenseur.
    Pour ton problème , c'est vrai que ce code d'ouverture présente des lacunes. Voici donc une autre variante qui fonctionne très bien!

    Dim intChoice As Integer ChDir "C:\Users\" & nom & "\Documents\Exporter_CSV\" 'a adapter 'only allow the user to select one file Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False 'make the file dialog visible to the user intChoice = Application.FileDialog(msoFileDialogOpen).Show 'determine what choice the user made If intChoice <> 0 Then 'get the file path selected by the user strFileToOpen = Application.FileDialog( _ msoFileDialogOpen).SelectedItems(1) Set dest = Workbooks.Open(Filename:=strFileToOpen) 'ouvre le classeur xlsx    End If


    Pour ce qui est du chemin, c'est pour cela que j'ai mis la variable nom qui fonctionnera sur n'importe quel PC:

     nom = Environ("USERNAME") 'nom de l'utilisateur

  • auteur

    Vous avez un très bon niveau ! je vous remercie encore énormément. une dernière question pour la route et je vous embête plus :

    J'ai pensez a passer par des requete SQL pour sortir les colonnes dans un ordre specifique sans trop de difficulter, mais je ne sais pas si en passant par Excel c'est possible. Sachant que via Access on ne peu pas cree de Form, et qu'il faudrait reprendre de 0.

    Par exemple remplacer :

    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

    Par :

    select J,H,A From classeur1

    Sachant que apparemment on peu enregistrer le résultat d'une requête SQL en CSV !

    Vous pensez que c'est possible ?

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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à

Reply
réponses:
  • auteur

    Ç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!)

  • auteur

    Faire comme l'exemple ici sur les 2 colonnes:

    https://www.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

  • auteur

    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

  • auteur

    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

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed