Menu

MACRO / VBA

Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
- - Dernière réponse : cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
- 8 déc. 2018 à 09:30
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

6 réponses

Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Bonjour,

quelques pistes:

pour ouvrir un classeur excel:

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

pour exporter des colonnes en CSV:

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

utilisation des checkbox

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

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



Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
Merci beaucoup pour ta réponse, je vais voir si j'y arrive !
Commenter la réponse de cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
0
Merci
Voici un exemple avec les liens que je t'ai donnés.
A adapter

http://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

Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
Bonjour, merci beaucoup, vous m'avancer beaucoup !
Commenter la réponse de cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
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



cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
Je t'ai fait un exemple avec 4 CheckBox, tu vas voir qu'avec 26 cela devient vite une usine à gaz.

http://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
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
Le même principe avec une listBox.

Avantage beaucoup moins de code!

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

@+ Le Pivert
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
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 ?
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
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
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
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
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
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:

http://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à
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
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
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
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 ?
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
Voici un programme qui permute 2 colonnes après les avoir sélectionnées.

Ensuite après une nouvelle sélection des colonnes, enregistrement en CSV (5 colonnes maxi, a adapter pour +):

http://www.cjoint.com/c/HKAhYuMG6yQ

de nombreux commentaires pour plus de compréhension


@+ Le Pivert
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
Ca marche parfaitement :)

Vous penser qu'il est possible d'utiliser ce code, pour exporter en xlsx

j'ai modifier FileFormat:=xlsx mais il me dis variable non définie.

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

mercii :)
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
Ca fonctionne avec "xlOpenXMLWorkbook" et en changeant chemin & "nom_que_je_souhaite"
Commenter la réponse de cs_Le Pivert
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
0
Merci
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 :/
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
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
Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
-
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
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
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 :-)

@+
Commenter la réponse de Thelucas160
Messages postés
196
Date d'inscription
jeudi 27 juin 2013
Dernière intervention
7 décembre 2018
0
Merci
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 ?
cs_Le Pivert
Messages postés
5599
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
10 décembre 2018
-
Bonjour,

Pour une plus grande clarté sur le forum:

Nouvelle question = nouveau post

@+ Le Pivert
Commenter la réponse de Thelucas160
Rail Wars! | Generating a Business Idea with Limited Funds: Activity | Garo: Kami no kiba (2017) [BluRay] [720p] [YTS] [YIFY]