Menu

MACRO / VBA

Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 6 nov. 2018 à 11:05 - Dernière réponse :
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 14 nov. 2018 à 15:50
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
Afficher la suite 

Votre réponse

32 réponses

Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- Modifié par cs_Le Pivert le 6/11/2018 à 11:39
0
Merci
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



Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 6 nov. 2018 à 13:14
Merci beaucoup pour ta réponse, je vais voir si j'y arrive !
Commenter la réponse de cs_Le Pivert
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 6 nov. 2018 à 16:23
0
Merci
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

Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 8 nov. 2018 à 10:42
Bonjour, merci beaucoup, vous m'avancer beaucoup !
Commenter la réponse de cs_Le Pivert
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 8 nov. 2018 à 11:16
0
Merci
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



Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 10 nov. 2018 à 09:16
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
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 10 nov. 2018 à 12:07
Le même principe avec une listBox.

Avantage beaucoup moins de code!

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

@+ Le Pivert
Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 13 nov. 2018 à 09:51
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 ?
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 13 nov. 2018 à 11:17
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
Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 13 nov. 2018 à 12:01
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 ?
Commenter la réponse de cs_Le Pivert
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 13 nov. 2018 à 13:46
0
Merci
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à
Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 14 nov. 2018 à 13:48
Ç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!)
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 14 nov. 2018 à 14:13
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
Messages postés
190
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
14 novembre 2018
- 14 nov. 2018 à 14:52
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
Messages postés
5534
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
20 novembre 2018
- 14 nov. 2018 à 15:50
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
Commenter la réponse de cs_Le Pivert