MACRO / VBA

Résolu/Fermé
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 - 6 nov. 2018 à 11:05
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 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
A voir également:

6 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié le 6 nov. 2018 à 11:39
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
6 nov. 2018 à 13:14
Merci beaucoup pour ta réponse, je vais voir si j'y arrive !
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
6 nov. 2018 à 16:23
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
8 nov. 2018 à 10:42
Bonjour, merci beaucoup, vous m'avancer beaucoup !
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 nov. 2018 à 11:16
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
8 nov. 2018 à 11:58
Waw, c'est très gentil ! Vous avez fait des étude et programmation / VBA ? merci encore je suis plus qu'avancer !
0
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
8 nov. 2018 à 15:29
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 nov. 2018 à 16:01
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 nov. 2018 à 18:41
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
9 nov. 2018 à 09:40
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
13 nov. 2018 à 13:46
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
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!)
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
14 nov. 2018 à 14:13
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
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
0
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
25 nov. 2018 à 19:04
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
28 nov. 2018 à 15:11
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
28 nov. 2018 à 16:42
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
29 nov. 2018 à 09:13
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
29 nov. 2018 à 11:10
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
Thelucas160 Messages postés 206 Date d'inscription jeudi 27 juin 2013 Statut Membre Dernière intervention 8 mars 2019 14
7 déc. 2018 à 10:40
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 déc. 2018 à 09:30
Bonjour,

Pour une plus grande clarté sur le forum:

Nouvelle question = nouveau post

@+ Le Pivert
0