Optimisation VBA macro

Résolu/Fermé
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 - 6 janv. 2012 à 12:10
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 - 23 janv. 2012 à 16:18
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


A voir également:

2 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
6 janv. 2012 à 13:56
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 :
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 

0
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 3
6 janv. 2012 à 17:40
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
6 janv. 2012 à 18:18
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
0
manautop Messages postés 138 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 24 janvier 2013 3
23 janv. 2012 à 16:18
Merci et dsl du retard c'est parfait ca marche nikel
0