Problème enregistrement fichier
Bonjour à tous,
Je suis tout nouveau dans le codage vba et je rencontre un problème pour enregistrer (sous) un fichier.
J'ai créé une macro et elle est enregistrée dans PERSONAL.xlsb
A partir d'un fichier Excel ouvert, la macro doit :
- enregistrer les modifications apportées à ce fichier,
- ouvrir une fenêtre demandant si on veut convertir ce fichier en csv,
- si réponse "oui", enregistrer (sous) le fichier avec une extension .csv (séparateur point virgule) au même endroit que le fichier Excel,
- fermer le fichier csv,
- et réouvrir le fichier Excel
Le problème que je rencontre est que la macro ne copie pas mon fichier Excel pour le convertir en csv, mais elle enregistre un fichier csv portant le nom de Personal.csv. Et bien entendu, ce fichier est vide.
Pourriez vous, s'il vous plait, m'aider ? Car je bloque totalement. J'ai certainement mal formulé ma macro mais je ne voit pas où.
Je vous mets mon code à la fin du message
Je vous en remercie
Jeje
Sub Conversion_csv()
'Enregistrer les modifications apportées au classeur
ThisWorkbook.Save
'Génération d'une fenêtre pour demander la création du fichier .csv
Reponse = MsgBox("Voulez vous convertir le fichier en .csv ?", vbYesNo + vbQuestion + vbDefaultButton2, "Préparation du fichier pour l'interface SAP")
'Si l'utilisateur a choisi le bouton Oui
If Reponse = vbYes Then
'Déclaration des variables
Dim memPath As String, myfile As String
'Mémoriser le chemin et le nom du fichier
memPath = ThisWorkbook.FullName
'Mémoriser le nom du fichier (.xls) sans extension
myfile = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
'Alors enregistrement du fichier en .csv au même endroit
ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & myfile & ".csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
'Ouvrir l'ancien classeur excel (celui d'avant l'"enregistrer sous")
Application.Workbooks.Open memPath
'Fermer ce classeur csv (la copie)
ThisWorkbook.Close False
'Sinon
Else
'Fermeture de la fenêtre
Close
End If
End Sub
Bonjour,
Essaie ainsi :
Option Explicit
Public Sub Conversion_csv()
Dim wb As Workbook, wb2 As Workbook
Dim Message As String, Title As String
Dim strFullname As String, strPath As String, strFilename As String
Dim Style As VbMsgBoxStyle, Answer As VbMsgBoxResult
Set wb = ActiveWorkbook
strFullname = wb.FullName
strPath = wb.Path & Application.PathSeparator
strFilename = Left(wb.Name, InStrRev(wb.Name, ".") - 1) & ".csv"
'-----------------------------------------------------------------
wb.Save
'-----------------------------------------------------------------
Message = "Voulez vous convertir le fichier en .csv ?"
Style = vbYesNo + vbQuestion + vbDefaultButton2
Title = "Préparation du fichier pour l'interface SAP"
Answer = MsgBox(Message, Style, Title)
'-----------------------------------------------------------------
If Answer = vbYes Then
Application.ScreenUpdating = False
wb.SaveAs Filename:=strPath & strFilename, _
FileFormat:=xlCSV, _
Local:=True
Set wb2 = ActiveWorkbook
Application.Workbooks.Open strFullname
wb2.Close savechanges:=False
Else
Message = "Procédure annulée par l'utilisateur"
Style = vbOKOnly + vbInformation
MsgBox Message, Style, Title
End If
'-----------------------------------------------------------------
Set wb2 = Nothing: Set wb = Nothing
End Sub
Bonjour Jean Eric,
Je vous en remercie, cela fonctionne parfaitement.
C'est impeccable.
Par contre, moi qui début, je ne comprend pas tout car je ne connais pas toutes ces fonctions.
Encore merci.
Jeje
Re,
Que ne comprends-tu pas?
C'est ta procédure remaniée!?
Cdlt.
Re,
C'est parfait ce que tu as fait.
Mais, je débute totalement sur le codage vba alors je ne connais pas toutes les fonctions.
Par exemple, l'utilisation de "Set", à quoi cela sert ?
Egalement, quelle est l'utilité de "Set wb2 = Nothing: Set wb = Nothing" tout à fait à la fin ?
Merci
Re,
Un peu d'explications...
Option Explicit
Public Sub Conversion_csv()
'Déclaration des variables
Dim wb As Workbook, wb2 As Workbook 'Objets
Dim Message As String, Title As String
Dim strFullname As String, strPath As String, strFilename As String
Dim Style As VbMsgBoxStyle, Answer As VbMsgBoxResult
'Initialisation des variables
'-----------------------------------------------------------------
'Déclare la variable wb comme un objet de type Workbook
'(classeur actif ou est lançée la procédure)
Set wb = ActiveWorkbook
'Nom de l'objet incluant le chemin d'accès et le nom du
'fichier/classeur
strFullname = wb.FullName
'Chemin d'accès complet au fichier/classeur et le caractère
'séparateur de chemin d'accès (Windows : \)
strPath = wb.Path & Application.PathSeparator
'Nom du nouveau fichier/classeur sans son extension avec sa nouvelle
extension (.csv)
'Faire un double clic sur InStrRev puis F1 pour afficher l'aide
strFilename = Left(wb.Name, InStrRev(wb.Name, ".") - 1) & ".csv"
'-----------------------------------------------------------------
wb.Save
'-----------------------------------------------------------------
Message = "Voulez vous convertir le fichier en .csv ?"
Style = vbYesNo + vbQuestion + vbDefaultButton2
Title = "Préparation du fichier pour l'interface SAP"
Answer = MsgBox(Message, Style, Title)
'-----------------------------------------------------------------
If Answer = vbYes Then
Application.ScreenUpdating = False
wb.SaveAs Filename:=strPath & strFilename, _
FileFormat:=xlCSV, _
Local:=True
Set wb2 = ActiveWorkbook
Application.Workbooks.Open strFullname
wb2.Close savechanges:=False
Else
Message = "Procédure annulée par l'utilisateur"
Style = vbOKOnly + vbInformation
MsgBox Message, Style, Title
End If
'-----------------------------------------------------------------
'RAZ des variables (on libère la mémoire)
Set wb2 = Nothing: Set wb = Nothing
End Sub
Re,
Jean Eric, merci pour toutes ces commentaires dans ton code, cela m'aide énormément.
Je m'excuse, je vais abuser, j'aurai une autre demande.
Dans ce même fichier, je dois faire un contrôle avant la fermeture du fichier excel.
J'ai 2 colonnes avec des valeurs et je dois contrôler que le total de la colonne 1 est égale au total de la colonne 2.
Dans chacune de ces colonnes, il n'y a pas de total de colonne, uniquement des valeurs unitaires.
De plus, si le total 1 n'est pas égal au total 2, je dois ouvrir une fenêtre d'alerte.
Aurais tu, s'il te plait, une idée pour coder ce contrôle ?
Merci
Jeje
Re,
Pour cette nouvelle question, il est préférable que tu joignes un classeur (représentatif de tes données).
Et préciser si la procédure sera stockée dans le personal.xlsb.
Cdlt.
Bonjour Jean Eric,
Je te mets en pièce jointe le fichier Excel que je souhaite modifier automatiquement par une macro et qu'il faudrait convertir ensuite en fichier csv.
Je souhaiterai que ma macro réalise ces opérations au final :
- Ouvrir une boite de dialogue pour demander si l'utilisateur veut convertir ce fichier Excel en .csv (=> Code que tu m'as corrigé hier)
=> Si "Oui" : (=> Code que tu m'as corrigé hier)
- Faire une sauvegarde du fichier Excel, (=> Code que tu m'as corrigé hier)
- Supprimer les lignes 2 et 3,
- Convertir les dates des colonnes C, D et R au format YYYYMMDD,
- Contrôler le que la somme des cellules de la colonne J = la somme des cellules de la colonne K,
Sinon, Message d'alerte de l'utilisateur que les colonnes ne sont pas égales,
et réouverture du fichier Excel à la dernière sauvegarde.
- Convertir les chiffres des colonnes J et K en remplacant la virgule par un point tout en gardant 2 chiffres après la virgule,
- Enregistrer ce fichier modifié en .csv séparateur point virgule (=> Code que tu m'as corrigé hier)
- Fermer ce fichier .csv (=> Code que tu m'as corrigé hier)
- Réouvrir le fichier Excel à la dernière sauvegarde (=> Code que tu m'as corrigé hier)
=> Si "Non" : (=> Code que tu m'as corrigé hier)
- Générer un message pour informer l'utilisateur que la procédure est annulée (=> Code que tu m'as corrigé hier)
Je ne suis pas au bout de mes peines.
Merci
Jérôme
Une information complémentaire que tu m'as demandé et que j'ai oublié de te mettre :
la procédure sera stockée dans le personal.xlsb
Merci
Jeje
Bonjour Jean Eric,
Tu es une bête !!!! Tu as compris mon besoin et cela fonctionne parfaitement.
Juste une petite remarque, est ce que tu pourrais, s'il te plait, modifier le code pour que la colonne R soit convertie au format YYYYMMDD comme pour les colonnes C et D ?
J'ai essayé d'y regarder mais je vais être franc, je ne comprends pas comment faire la modification.
Je vois où est la condition pour faire la modification du format des dates, mais je ne comprends pas comment tu dis au programme que c'est les colonnes C et D.
[code]
N = .Cells(.Rows.Count, 1).End(xlUp).Row
tbl = .Cells(2, 3).Resize(N - 1, 2).Value
For i = LBound(tbl) To UBound(tbl)
For j = LBound(tbl, 2) To UBound(tbl, 2)
tbl(i, j) = Format(CDate(tbl(i, j)), "yyyymmdd")
Next j
Next i
/code]
Merci
Jeje
Re,
Ton fichier modifié en conséquence.
A te relire.
Cdlt.
Re,
C'est parfait, je t'en remercie.
Merci également pour avoir séparé les différentes opérations pour mieux si retrouver dans le codage.
J'ai copié ce code dans Personal.xlsb et cela fonctionne également.
Un grand merci.
Bonne journée
Jeje