Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Remplacer les valeurs d'erreurs

11 réponses
Avatar
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.

10 réponses

1 2
Avatar
MichD
Bonjour,

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
'------------------------------------------
Avatar
MichD
Et par macro, tu peux enregistrer au format CSV avec virgule ou
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
'-----------------------------------
Avatar
GL
Le 06/05/2014 16:33, MichD a écrit :
Et par macro, tu peux enregistrer au format CSV avec virgule ou
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



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.



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
'-----------------------------------

Avatar
MichD
| affreusement buggué VBA...

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.
Avatar
GL
Le 06/05/2014 21:46, MichD a écrit :
| affreusement buggué VBA...

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.
Avatar
GL
Le 06/05/2014 16:33, MichD a écrit :
'-----------------------------------
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
'-----------------------------------




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.
Avatar
MichD
Pourrais-tu élaborer davantage, j'ai de la difficulté à saisir la
problématique!
Avatar
GL
Le 07/05/2014 16:46, MichD a écrit :
Pourrais-tu élaborer davantage, j'ai de la difficulté à saisir la
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.
Avatar
DanielCo
Le 07/05/2014 16:46, MichD a écrit :
Pourrais-tu élaborer davantage, j'ai de la difficulté à saisir la
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
Avatar
MichD
Si tu as des caractères spéciaux dans une plage de cellules, cette procédure
"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
'=======================================================
1 2