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,
Si, ok, passage à l'opération suivante,

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

Oups, avec le fichier c'est mieux

Merci

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,

A tester!...

Cdlt.

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

Rechercher des sujets similaires à "probleme enregistrement fichier"