Microsoft 365 Supprimer des caractères non visibles en passant par une variable tableau

DanB34

XLDnaute Nouveau
Bonjour,
Je reçois fréquemment de gros fichiers, issus de différentes bases de données et contenant parfois des caractères non conformes. Pour gagner beaucoup de temps, je voudrais supprimer des caractères invisibles contenus dans des cellules en effectuant le traitement dans une variable tableau.
Actuellement la macro passe par une boucle qui effectue le traitement directement sur la feuille de données, cellule par cellule.
Je cherche à :
- charger les données dans une variable tableau (ça c'est fait).
- tester les données contenues dans ce tableau (pas fait !) -> s'il y a des caractères invisibles les supprimer.
- recopier le tableau sur la feuille après traitement.

J'ai joint un fichier ex. avec macros dont une permettant après traitement de restaurer les données avec les cellules contenant des caractères invisibles.

Merci d'avance pour votre aide et idées
Bien cordialement,
Dan

VB:
Option Explicit

Sub Nettoyage_Cellules_Vides_Tableau_Complet()
Dim Tablo As Variant
Dim WsD As Worksheet
Dim Lig As Long, LigDer As Long, LigNb As Long, Cpt As Long
Dim Col As Integer, LigDep As Integer, ColDep As Integer, ColDer As Integer, ColNb As Integer
Dim CelDep As String, CelArv As String
Dim ColDepL As String, ColArvL As String, ColDerL As String
Dim C As Range
Dim x As String
Dim rep As String

Set WsD = Sheets("Donnees")

WsD.Select
LigDep = 13 'Range("A1").End(xlDown).Row
'LigDer = WsL.Range("A1048576").End(xlUp).Row
LigDer = WsD.Range("B" & Rows.Count).End(xlUp).Row
ColDep = 2
ColDepL = "B"
ColDer = Rows(12).Find("*", , , , xlByRows, xlPrevious).Column
ColDerL = ColLettre(ColDer)

ColNb = ActiveSheet.UsedRange.Columns.Count 'Compte toutes les colonnes occupées sur la feuille
LigNb = ActiveSheet.UsedRange.Rows.Count 'Compte toutes les lignes occupées sur la feuille
ColDer = Cells(12, Columns.Count).End(xlToLeft).Column 'n° de la dernière colonne non vide de la ligne 1
ColNb = ColDer - (ColDep - 1) '-1 afin d'avoir toutes les colonnes (si le tableau commence col A (1) et qu'il s'arrête col M (13) il y a 13 - (1 - 1) = 13 col remplies
CelDep = Range(ColDepL & LigDep).Address
CelArv = Range(ColDerL & LigDer).Address

'Sélection du tableau en 1 fois
Tablo = Range(CelDep & ":" & CelArv).Value
Cpt = 0
For Each C In Range(CelDep & ":" & CelArv).SpecialCells(xlCellTypeConstants)
If C.Text = "" Then
    x = C.Address
    Cpt = Cpt + 1
    'C.Value = Empty 'commenté pour test
End If
Next

'Partie ajoutée afin de pouvoir tester
If Cpt = 0 Then
    MsgBox "Il n'y a aucune cellule contenant des caractères invisibles"
    End
End If

rep = MsgBox("Il y a " & Cpt & " caractères non visibles" & vbLf & "Voulez-vous les supprimer ?" & vbCrLf, vbYesNo + vbQuestion, "Réponse...")
If rep = 7 Then
    End
Else
    For Each C In Range(CelDep & ":" & CelArv).SpecialCells(xlCellTypeConstants)
        If C.Text = "" Then
            x = C.Address
            C.Value = Empty
End If
    Next
End If

Range("A1").Select

End Sub

Sub Restaure()
'Recopie des données de la feuille Copie sur la feuille Donnees pour relancer le test
Dim WsD As Worksheet
Dim WsC As Worksheet

Set WsD = Sheets("Donnees")
Set WsC = Sheets("Copie")

WsD.Range("B12:P151").Value = WsC.Range("B12:P151").Value


End Sub


Function ColLettre(Col)
    ColLettre = Split(Cells(1, Col).Address, "$")(1)
    'ColFinLettre = ColLettre
End Function
 

Pièces jointes

  • Sup_Car_Invisibles.xlsm
    35.4 KB · Affichages: 21
Dernière édition:
Solution
Bonjour,

Dans ton fichier exemple, il n'y a aucun caractère invisible !
Tu ne comptes que les cellules contenant une chaine vide et ensuite tu les effaces.
Ça ne fait que supprimer les chaines vides, c'est à dire qui ne contiennent aucun caractère (vs qui contiennent des caractères invisibles).
Tu peux faire ça en 4 lignes :
VB:
Sub Nettoyage_Cellules_Vides()
  With Worksheets("Donnees").UsedRange
    .NumberFormat = "General"
    .Value = .Value
  End With
End Sub

Patrice33740

XLDnaute Impliqué
Bonjour,

Dans ton fichier exemple, il n'y a aucun caractère invisible !
Tu ne comptes que les cellules contenant une chaine vide et ensuite tu les effaces.
Ça ne fait que supprimer les chaines vides, c'est à dire qui ne contiennent aucun caractère (vs qui contiennent des caractères invisibles).
Tu peux faire ça en 4 lignes :
VB:
Sub Nettoyage_Cellules_Vides()
  With Worksheets("Donnees").UsedRange
    .NumberFormat = "General"
    .Value = .Value
  End With
End Sub
 
Dernière édition:

Patrice33740

XLDnaute Impliqué
Bonjour pierrejean
@ Patrice....
Que penses-tu du décompte des not isempty and ="" ????? (cf mon fichier )
Ç'est la bonne méthode pour décompter les cellules dont la valeur est égale à chaine vide et de cibler uniquement ces cellules (contrairement à la méthode que j'ai proposé qui supprime les formules).

C'est bien plus sûr que le test de DanB34 sur c.Text qui renvoi le texte qu'on voit dans la cellule, c'est à dire la valeur de la cellule (constante ou résultat) à laquelle est appliquée le format de cellule .
Avec un format personnalisé de type 0;-0;0; les cellules contenant du texte serait décomptées comme contenant une chaine vide et inversement avec un format @ "?" les cellules contenant une chaine vide ne seraient pas décomptées.!
 

Discussions similaires