Remplacer les valeurs d'erreurs
Le
GL

Bonjour,
Je suis en train de me fabriquer une macro d'exportation
(notamment au format csv). D'ailleurs c'est bizarre qu'il
n'existe pas une fonctionnalité d'exportation d'une plage
donnée en natif
Je recopie donc par valeur les données à exporter puis lance
l'exportation et je voudrais l'option "remplacer les valeurs d'erreurs"
(en général par vide).
Mais il n'existe pas de
.SpecialCells(xlCellValueContainsAnErrorIdentifierProvidedByMicroMouAfterUsersRequestsToFulfillTheirCustomersDesires)
Comment feriez-vous au plus simple ?
Merci d'avance.
Je suis en train de me fabriquer une macro d'exportation
(notamment au format csv). D'ailleurs c'est bizarre qu'il
n'existe pas une fonctionnalité d'exportation d'une plage
donnée en natif
Je recopie donc par valeur les données à exporter puis lance
l'exportation et je voudrais l'option "remplacer les valeurs d'erreurs"
(en général par vide).
Mais il n'existe pas de
.SpecialCells(xlCellValueContainsAnErrorIdentifierProvidedByMicroMouAfterUsersRequestsToFulfillTheirCustomersDesires)
Comment feriez-vous au plus simple ?
Merci d'avance.
Pour supprimer les cellules ayant une valeur d'erreur :
Pour supprimer les cellules
'------------------------------------------
Sub test()
On Error Resume Next
With Worksheets("Feuil1")
With .Range("A1:G25")
.SpecialCells(xlCellTypeFormulas, xlErrors).Delete
.SpecialCells(xlCellTypeConstants, xlErrors).Delete
End With
End With
End Sub
'------------------------------------------
Pour vider le contenu des cellules affichant des valeurs d'erreur
'------------------------------------------
Sub test()
On Error Resume Next
With Worksheets("Feuil1")
With .Range("A1:G25")
.SpecialCells(xlCellTypeFormulas, xlErrors)=""
.SpecialCells(xlCellTypeConstants, xlErrors)=""
End With
End With
End Sub
'------------------------------------------
point-virgule
la plage de ton choix en utilisant cette macro. Elle enlève aussi les
valeurs
d'erreur.
'-----------------------------------
Sub EnregistrerFormatSpecial()
Dim Plage As Range, Séparateur As String
Dim NomFichierSauvegarde As String
On Error Resume Next
With Worksheets("Feuil1") 'Nom feuille à déterminer
With .Range("A1:G25") 'Plage de cellules à définir
.SpecialCells(xlCellTypeFormulas, xlErrors) = ""
.SpecialCells(xlCellTypeConstants, xlErrors) = ""
Set Plage = .Cells
End With
End With
Séparateur = ";"
NomFichierSauvegarde = "C:MichD.csv"
Call SaveAsCSV(Plage, Séparateur, NomFichierSauvegarde)
End Sub
'-----------------------------------
Sub SaveAsCSV(Plage As Range, Séparateur As String, _
NomFichierSauvegarde As String)
Dim Temp As String, R As Range, C As Range
Open NomFichierSauvegarde For Output As #1
For Each R In Plage.Rows
Temp = ""
For Each C In R.Cells
Temp = Temp & C & Séparateur
Next
Temp = Left(Temp, Len(Temp) - 3)
Print #1, Temp
Next
Close
Set Plage = Nothing: Set C = Nothing: Set R = Nothing
End Sub
'-----------------------------------
Ok Merci beaucoup !
Pour l'export en CSV pour l'instant je passe par :
Workbook.SaveAs FileFormat:=xlCSV, filename:=... etc
Mais le plus bizarre, c'est que j'ai un fichier .csv
séparé par des VIRGULES (alors que les paramètres de windows,
et donc l'export par le menu, me donne un fichier séparé par
des point-virgules ;)
Toujours affreusement buggué VBA...
Bonne soirée.
Non, c'est normal. Tu es dans une fenêtre VBA et dans cette fenêtre, le code
utilise par défaut les paramètres américains comme pour le séparateur
décimal, le format des dates...etc.
Si tu utilises la commande "enregistrer sous" du menu fichier et que tu
choisis comme type de fichier .Csv, tu auras le point-virgule comme
séparateur.
La macro proposée lorsque la plage n'est pas très grande permet de choisir
le séparateur d'éléments du futur fichier .csv.
Oui. Effectivement c'est pour des plages pas très grandes.
Le deuxième intérêt de cette macro que je vais finalement
reprendre (ça évite de créer un nouveau classeur juste pour
la sauvegarde en CSV) c'est qu'on peut vérifier si les données
contiennent déjà le séparateur, et avertir ainsi l'utilisateur
d'un problème...
Merci encore.
Un autre problème c'est pour l'unicode, ou plus
généralement la page de code du fichier texte.
Apparemment, il n'y a pas d'option pour Open
pour fixer la page de code... (XL 2010/Office14)
Cordialement.
problématique!
Open et Write / Print semblent conçus pour travailler
en ASCII, ou avec la page de code de windows (latin1 = cp1252 =
ISO8859-1 qui correspond aux langues dites "occidentales").
Si une cellule contient par exemple : α β γ
Print va écrire des trucs illisibles dans le fichier,
alors que l'exportation en format délimité unicode
(.txt, colonnes séparées par des tabulations)
va écrire dans le fichier en suivant l'encodage
UTF-16 avec un BOM FFFE.
De sorte que la lecture du fichier dans un éditeur de texte
(c'est l'intérêt des formats csv/txt) donnera bien les
lettres α β γ (qui sont absentes de l'encodage latin1)
Grâce au BOM, l'importation du fichier par un autre programme
se passera bien aussi (fichier unicode en UTF-16-LE).
En utilisant Print, apparemment, on ne peut écrire dans le fichier
que de l'ASCII (proprement que de l'ASCII 128 et par extension du
latin1)
Cdt.
Bonjour,
Une fois ton ficjer csv créé, ouvre-le dans le bloc notes et
enregistre-le en encodage UTF.
Daniel
"Test()" permet d'enregistrer cette plage de cellule au format CSV utilisant
directement le format UTF8.
Lorsque le fichier .CSV est créé, dans l'explorateur Windows, tu fais un
clic droit sur le fichier et tu choisis la commande "ouvrir avec" et tu
retiens l'application "NotePad".
Pour exécuter ce code, tu as besoin d'ajouter la référence suivante à partir
de la barre des menus de la fenêtre de l'éditeur de code / Références / et
tu coches :
"Microsoft Activex Data Objects 2.8 Library"
Dans la procédure test() tu n'as qu'à spécifier le chemin et le nom du
fichier .csv à générer. N'oublie pas de spécifier le nom du classeur, le nom
de la feuille de calcul et l'adresse de la plage de cellules à traiter.
'====================================================== Sub Test()
'Requiert : "Microsoft Activex Data Objects 2.8 Library"
Dim Fichier As String, Tblo As Variant
'Chemin + nom du fichier où se retrouveront
'les données au format UTF8
Fichier = "c:UsersdenisDocumentsMichD2.csv"
On Error Resume Next
'Le fichier Excel désigné doit être ouvert
With Workbooks(ThisWorkbook.Name)
'Nom feuille à adapter
With .Worksheets("Feuil1")
With .Range("A1:E" & .Range("A65536").End(xlUp).Row)
.SpecialCells(xlCellTypeFormulas, xlErrors) = ""
.SpecialCells(xlCellTypeConstants, xlErrors) = ""
Tblo = .Value
End With
End With
End With
Fichier = Fichier_CSV_UTF8(Fichier, Tblo)
End Sub
'====================================================== Function Fichier_CSV_UTF8(Fichier As String, Tblo As Variant)
Dim A As Long, B As Long
Dim Texte As String
Dim objStream As ADODB.Stream
Set objStream = New ADODB.Stream
objStream.Open
objStream.Charset = "utf-8"
objStream.Type = adTypeText
objStream.LineSeparator = adCRLF
objStream.Position = 0
For A = 1 To UBound(Tblo, 1)
Texte = ""
For B = 1 To UBound(Tblo, 2)
Texte = Texte & Replace(Replace(Replace(Tblo(A, B), _
"r", " "), "n", " "), ";", ".") & ";"
Next
objStream.WriteText Texte, adWriteLine
Next
objStream.SaveToFile Fichier, adSaveCreateOverWrite
objStream.Close
Set objStream = Nothing
Fichier_CSV_UTF8 = Enlever_BOM(Fichier)
End Function
'======================================================
Function Enlever_BOM(Fichier)
Dim Writer, Reader, FileSize
Set Writer = CreateObject("Adodb.Stream")
Set Reader = CreateObject("Adodb.Stream")
Reader.Open
Reader.LoadFromFile Fichier
Writer.Mode = 3
Writer.Type = 1
Writer.Open
Reader.Position = 5
Reader.CopyTo Writer, -1
Writer.SaveToFile Fichier, 2
Enlever_BOM = Fichier
Set Writer = Nothing
Set Reader = Nothing
End Function
'=======================================================