Optimisation VBA macro
Résolu
manautop
Messages postés
138
Date d'inscription
Statut
Membre
Dernière intervention
-
manautop Messages postés 138 Date d'inscription Statut Membre Dernière intervention -
manautop Messages postés 138 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je me permet de me tourner vers vous pour optimiser ma macro qui se lance par un USERFORM qui permet de mettre en forme un classeur et le découper en fichiers plus petits ( car notre log qui intègre le résultat n'arrive pas à gerer des fichiers de plus de 250 lignes)
voici comment je procède avec en premier la userform puis les modules
je met en gras ce que j'aimerais modifier mais dont je ne trouve pas la solution
Merci d'avance pour votre aide
User form1
Private Sub CommandButton1_Click()
If CheckBox1.Value = True Then
Call SuprimeLigne
End If
If CheckBox2.Value = True Then
Call RenommeOnglets
End If
If CheckBox3.Value = True Then
Call FormatNombreMillier
End If
If CheckBox4.Value = True Then
Call Separe200
End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
---------------------module-----------------------------------------
Sub SuprimeLigne()
' supprime la première ligne si entête
Rows("1:1").Select
Selection.Delete Shift:=xlUp
End Sub
---------------------module-----------------------------------------
renome les feuilles en feuil1/2...
Sub RenommeOnglets()
Dim i, j
For i = 1 To Worksheets.Count
j = Format(i, "#")
ActiveWorkbook.Sheets(i).Name = "Feuil" & j
Next i
End Sub
---------------------module-----------------------------------------
Sub FormatNombreMillier()
' met en forme la colonne en enlevant les espaces sur les milliers
Set Range1 = Application.InputBox("Select the title of the first variable !", "Sélection de cellules", Type:=8)
Range1.NumberFormat = "General"
End Sub
---------------------module-----------------------------------------
sub Separe200()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
'----ici je voudrais dans la mesure du possible qu'il me demande l'emplacement du fichier (en sachantyqu'il sagit toujours de la feuille 1)
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
'----renvoie le numéro de la dernière ligne non vide de la colonne A
DrLig = .Range("B" & Rows.Count).End(xlUp).Row
'----renvoie le numéro de la dernière ligne non vide de la colonne B
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
'----enregistre le fichier de +1 à partir du chiffre 141 ici, je voudrais qu'il me demande de rentrer la première partie du nom du fichier ainsi que le numéro ou commencer
Workbooks.Add
.Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1")
.Range("B" & Lign & ":B" & Lign + 199).Copy Range("B1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False, local:=True
ActiveWindow.Close
'----local:=True permet de mettre le point virgule je voudrais dans la mesure du possible qu'il me demande d'indiquer où enregistrer les fichiers decoupés
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
je me permet de me tourner vers vous pour optimiser ma macro qui se lance par un USERFORM qui permet de mettre en forme un classeur et le découper en fichiers plus petits ( car notre log qui intègre le résultat n'arrive pas à gerer des fichiers de plus de 250 lignes)
voici comment je procède avec en premier la userform puis les modules
je met en gras ce que j'aimerais modifier mais dont je ne trouve pas la solution
Merci d'avance pour votre aide
User form1
Private Sub CommandButton1_Click()
If CheckBox1.Value = True Then
Call SuprimeLigne
End If
If CheckBox2.Value = True Then
Call RenommeOnglets
End If
If CheckBox3.Value = True Then
Call FormatNombreMillier
End If
If CheckBox4.Value = True Then
Call Separe200
End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
---------------------module-----------------------------------------
Sub SuprimeLigne()
' supprime la première ligne si entête
Rows("1:1").Select
Selection.Delete Shift:=xlUp
End Sub
---------------------module-----------------------------------------
renome les feuilles en feuil1/2...
Sub RenommeOnglets()
Dim i, j
For i = 1 To Worksheets.Count
j = Format(i, "#")
ActiveWorkbook.Sheets(i).Name = "Feuil" & j
Next i
End Sub
---------------------module-----------------------------------------
Sub FormatNombreMillier()
' met en forme la colonne en enlevant les espaces sur les milliers
Set Range1 = Application.InputBox("Select the title of the first variable !", "Sélection de cellules", Type:=8)
Range1.NumberFormat = "General"
End Sub
---------------------module-----------------------------------------
sub Separe200()
Dim Lign As Long, DrLig As Long
Dim Cpt As Integer
Dim Chemin As String, NomFich As String
Application.DisplayAlerts = False
Cpt = 0
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
With Workbooks("A.xlsx").Sheets("Feuil1")
'----ici je voudrais dans la mesure du possible qu'il me demande l'emplacement du fichier (en sachantyqu'il sagit toujours de la feuille 1)
DrLig = .Range("A" & Rows.Count).End(xlUp).Row
'----renvoie le numéro de la dernière ligne non vide de la colonne A
DrLig = .Range("B" & Rows.Count).End(xlUp).Row
'----renvoie le numéro de la dernière ligne non vide de la colonne B
For Lign = 1 To DrLig Step 200
NomFich = "OFFRE5402_" & 141 + Cpt & ".csv"
'----enregistre le fichier de +1 à partir du chiffre 141 ici, je voudrais qu'il me demande de rentrer la première partie du nom du fichier ainsi que le numéro ou commencer
Workbooks.Add
.Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1")
.Range("B" & Lign & ":B" & Lign + 199).Copy Range("B1")
ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False, local:=True
ActiveWindow.Close
'----local:=True permet de mettre le point virgule je voudrais dans la mesure du possible qu'il me demande d'indiquer où enregistrer les fichiers decoupés
Cpt = Cpt + 1
Next
End With
Application.DisplayAlerts = True
End Sub
A voir également:
- Optimisation VBA macro
- Optimisation pc - Accueil - Utilitaires
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Optimisation découpe panneau gratuit - Télécharger - Outils professionnels
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
2 réponses
Salut et bonne année!
Tes 3 questions :
1- ici je voudrais dans la mesure du possible qu'il me demande l'emplacement du fichier (en sachantyqu'il sagit toujours de la feuille 1) Si c'est TOUJOURS la feuille "Feuil1", ne change rien!
2- ici, je voudrais qu'il me demande de rentrer la première partie du nom du fichier ainsi que le numéro ou commencer
Il faut donc, avant de lancer la boucle (donc avant la ligne : For Lign = 1 To DrLig Step 200), définir une variable, qu'on appelera prefixe, et qui stockera le nom demandé par Inputbox. Idem pour le premier numéro, avec une variable de type Integer :
3- je voudrais dans la mesure du possible qu'il me demande d'indiquer où enregistrer les fichiers decoupés
Tu as cette ligne de code :
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
Il suffit d'entrer en Feuil2, A1 par exemple un nom de chemin valide exemple : C:\Documents and Settings\JSEBBAN\travail\
et de l'attribuer à la variable Chemin :
Ce qui te donne au final :
Tes 3 questions :
1- ici je voudrais dans la mesure du possible qu'il me demande l'emplacement du fichier (en sachantyqu'il sagit toujours de la feuille 1) Si c'est TOUJOURS la feuille "Feuil1", ne change rien!
2- ici, je voudrais qu'il me demande de rentrer la première partie du nom du fichier ainsi que le numéro ou commencer
Il faut donc, avant de lancer la boucle (donc avant la ligne : For Lign = 1 To DrLig Step 200), définir une variable, qu'on appelera prefixe, et qui stockera le nom demandé par Inputbox. Idem pour le premier numéro, avec une variable de type Integer :
Dim prefixe As String, numero As Integer prefixe = InputBox("Saisir un nom valide : sans <,>,?,|,/,\...", "Saisie du prefixe") If prefixe = "" Then Exit Sub numero = Application.InputBox("Saisir un nombre", "Saisie du premier numéro", Type:=1) If numero = 0 Then Exit Sub For Lign = 1 To DrLig Step 200 NomFich = prefixe & numero + Cpt & ".csv"
3- je voudrais dans la mesure du possible qu'il me demande d'indiquer où enregistrer les fichiers decoupés
Tu as cette ligne de code :
Chemin = "C:\Documents and Settings\JSEBBAN\Bureau\2\"
Il suffit d'entrer en Feuil2, A1 par exemple un nom de chemin valide exemple : C:\Documents and Settings\JSEBBAN\travail\
et de l'attribuer à la variable Chemin :
With Sheets("Feuil2") Chemin = .Range("A1").Value End With
Ce qui te donne au final :
sub Separe200() Dim Lign As Long, DrLig As Long Dim Cpt As Integer Dim Chemin As String, NomFich As String Dim prefixe As String, numero As Integer Application.DisplayAlerts = False Cpt = 0 With Sheets("Feuil2") Chemin = .Range("A1").Value End With With Workbooks("A.xlsx").Sheets("Feuil1") DrLig = .Range("A" & Rows.Count).End(xlUp).Row '----renvoie le numéro de la dernière ligne non vide de la colonne A DrLig = .Range("B" & Rows.Count).End(xlUp).Row '----renvoie le numéro de la dernière ligne non vide de la colonne B prefixe = InputBox("Saisir un nom valide : sans <,>,?,|,/,\...", "Saisie du prefixe") If prefixe = "" Then Exit Sub numero = Application.InputBox("Saisir un nombre", "Saisie du premier numéro", Type:=1) If numero = 0 Then Exit Sub For Lign = 1 To DrLig Step 200 NomFich = prefixe & numero + Cpt & ".csv" Workbooks.Add .Range("A" & Lign & ":A" & Lign + 199).Copy Range("A1") .Range("B" & Lign & ":B" & Lign + 199).Copy Range("B1") ActiveWorkbook.SaveAs Filename:=Chemin & NomFich, FileFormat:=xlCSV, CreateBackup:=False, local:=True ActiveWindow.Close Cpt = Cpt + 1 Next End With Application.DisplayAlerts = True End Sub
Bonne Année et merci à toi
Ca fait très longtemps tu m'avais deja aidé, c'est fou de te retrouver ici (2008/09)^^
j'ai un peu progressé depuis le temps
donc une petite erreur(je me permet)
ici
With Workbooks("A.xlsx").Sheets("Feuil1")
à remplacer par
With Sheets("Feuil1")
sinon ça ne marche pas puisqu'il s'agit du classeur actif.
Par contre je voudrais qu'il demande spécifiquement à l'utilisateur où il veut enregistrer les fichiers séparés,
je pensais passer par cette ligne de code
MsgBox SelectFolder("Sélectionnez un répertoire :", 0)
mais je ne sais pas faire en sorte que la macro s'en souvienne ....
Merci Pour ton Aide
Ca fait très longtemps tu m'avais deja aidé, c'est fou de te retrouver ici (2008/09)^^
j'ai un peu progressé depuis le temps
donc une petite erreur(je me permet)
ici
With Workbooks("A.xlsx").Sheets("Feuil1")
à remplacer par
With Sheets("Feuil1")
sinon ça ne marche pas puisqu'il s'agit du classeur actif.
Par contre je voudrais qu'il demande spécifiquement à l'utilisateur où il veut enregistrer les fichiers séparés,
je pensais passer par cette ligne de code
MsgBox SelectFolder("Sélectionnez un répertoire :", 0)
mais je ne sais pas faire en sorte que la macro s'en souvienne ....
Merci Pour ton Aide
Je ne connais pas SelectFolder (et j'ai pas envie de chercher...) donc essaye ceci :
Dim objShell As Object, objFolder As Object Dim Chemin As String Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&) If objFolder Is Nothing Then MsgBox "Abandon opérateur", vbCritical, "Annulation" Exit Sub Else Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\" End If MsgBox Chemin