Rechercher et Remplacer en utilisation VBA

Bonjour,

Je suis sur une partie de programme qui va chercher des données sur des fichiers au format EVO (données bruts un peu du style format csv, voir image)

modelefichierevo

, les mets en ordre et converti les "." en "," .

En séparant chaque étape cela fonctionne normalement :

remplacermanuel

Si par contre j'enregistre la manipulation et que je le place dans une macro, Excel change le format de certaines cellules et je me retrouve avec des nombres où les virgules ont sautées (Bleu = valeurs qui ont perdu la virgule => changement de format de cellules; Vert = Valeurs qui ont bien fait la transition de "." à ",") :

remplaceauto

Du coup je ne sais plus quoi faire, j'ai déplacé le code à divers endroit du processus, le problème reste le même. Si par contre je retire cette étape de la macro et que je le fais manuellement, cela fonctionne ...

Je joins le fichier et une version Bloc Note du fichier EVO (pour ne pas abimer les dossiers je travaille sur une sauvegarde et Excel a choisi ce format, j'ai fait le test avec un fichier EVO le problème reste le même)

Les macros sont dans le module 7 et 8 (et j'ai normalement retiré les chemins pour éviter les messages d'erreur sur un PC où le chemin n'éxiste pas ^^)

Merci à ceux qui y jetteront un oeil.

9testut.zip (20.26 Ko)
7sytelvforum.xlsm (222.35 Ko)

Bonjour,

ne voyant pas le code mais comme il est facile d'importer un simple fichier texte,

je dirais juste la conception a été effectuée avec les pieds qui se sont pris dans le tapis !

Activer le Générateur de macros, paramétrer l'importation par exemple via le menu Données, à partir d'un fichier

(consulter QueryTables dans l'aide VBA) puis bien répondre à chaque étape de l'assistant :

une base de code est livrée sur un plateau ! (et simplifiable)

Bonjour Marc L, j'utilise une variante car l'utilisateur peut ouvrir plusieurs fichiers d'un coup (Ouverture du ou des fichier(s), Récupération des données, Conversion des "," en espace (qui se groupent dans la colonne A lorsqu'on fait un copier/coller par macro), gestion des erreurs, lorsque l'utilisateur quitte sans choisir de fichiers, etc :

Public cUt As Integer, NbrElementsUt As Integer
Public Sub CopierCollerConvertir2()
Dim WbCible$, ArrUt As Variant

cUt = 0
ArrUt = Application.GetOpenFilename(, , , , True)
WbCUt = ThisWorkbook.Name

   On Error GoTo GESTERR
   If VarType(ArrUt) > 100 Then
   'On récupère le chemin pour enregistrer le classeur dans le même fichier à la fin (s'il y a lieu)
   'MyPath = ActiveWorkbook.Path & Application.PathSeparator
   Application.ScreenUpdating = False
   Application.DisplayAlerts = False
   'ubound determine le nombre de fichiers sélectionnés
   For i = 1 To UBound(ArrUt)
      'Ouvre les fichiers au fur et à mesure
      Workbooks.Open ArrUt(i)

      'On met le nom du fichier dans une variable
      myFileUt = ActiveWorkbook.Name
      Workbooks(WbCUt).Activate

         If ExistWorkbookSheet(WbCUt, myFileUt) = False Then
            'ouverture du classeur Test
            Workbooks(WbCUt).Sheets.Add.Name = myFileUt
            MaFeuille = ActiveSheet.Name
            'Copier/coller le contenu
            Workbooks(myFileUt).Worksheets(1).Range("A1:J500").Copy Workbooks(WbCUt).Worksheets(myFileUt).Range("A1")
            'ActiveSheet.Name = myFile
            'Fermeture du classeur .csv
            Workbooks(myFileUt).Close
            'Convertis le contenu
            '
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
        (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
        Array(27, 1)), TrailingMinusNumbers:=True

        ElseIf ExistWorkbookSheet(WbCUt, myFileUt) = True Then
            Workbooks(WbCUt).Sheets(myFileUt).Activate
            Cells.Select
            Selection.Clear
            MaFeuilleUt = ActiveSheet.Name
            'Copier/coller le contenu
            Workbooks(myFileUt).Worksheets(1).Range("A1:J500").Copy Workbooks(WbCUt).Worksheets(myFileUt).Range("A1")
            'ActiveSheet.Name = myFile
            'Fermeture du classeur .csv
            Workbooks(myFileUt).Close
            'Convertis le contenu
            '
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
        (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), _
        Array(27, 1)), TrailingMinusNumbers:=True

    End If
   Next i
   Else
   Exit Sub
   End If

traitement

Exit Sub
GESTERR:
   MsgBox "Non valide"
End Sub

Partie du code qui permet de supprimer les données inutiles à l'utilisateur

Sub traitement()
'Macro permettant la Modification des fichiers evo pour récupération données
Dim lastRow As Long
Dim nbcycle As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

' "Suppression" des lignes avec -1 dans la colonne A
For i = 1 To lastRow
 If Cells(lastRow - i + 1, 1).Value = -1 Then
 Rows(lastRow - i + 1).Select
 Selection.Delete Shift:=xlUp
 End If
 Next i
 Cells(1, 1).Select

' "Suppression" des doublons
For i = 1 To lastRow
If Cells(i, 1).Value = "SC" Or Cells(i, 1).Value = "SD" Or Cells(i, 1).Value = "SR" Then
nbcycle = Cells(i, 5).Value
Else
Cells(i, 1).Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Cells(i, 1).Value = Cells(i - 1, 1).Value
Cells(i, 2).Value = nbcycle
End If
Next i

'Ajout d'un filtre sur la colonne A
Columns("A:A").Select
Selection.AutoFilter

End Sub

Si je n'ai qu'un fichier à ouvrir j'en suis au même point qu'avec QueryTable et si j'utilise ça :

Sub ConvertirPointEnVirgules()
    Cells.Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

J'ai essayé de divers manière, cela semble venir uniquement de ce code (si je fais la même procédure manuellement, cela fonctionne, si j'utilise la macro de remplacement que ce soit après le GetOpenFileName ou le Query, ...)

Je pense que je repasserais le séparateur décimal en "." vu que la majorité des PC des utilisateurs de ce futur programme le sont, et puis tant pis, c'est étrange que la macro fasse ça mais je vais pas péter un cable sur un truc aussi débile ^^

Dans l'assistant de Données, à partir du fichier, il y a pourtant la possibilité de préciser le séparateur décimal !

Du reste TextToColumns possède aussi la même fonctionnalité, il suffit juste de consulter l'aide VBA …

Donc en VBA, il n'y a pas besoin d'une usine à gaz, un bloc QueryTables optimisé nécessite moins de vingt lignes de code

sans besoin de convertir quoique ce soit car, comme TextToColumns, il peut s'en charger pour peu de le paramétrer !

Exemple d'un sujet avec QueryTables

Mais je précise bien mon séparateur décimal, la première conversion se fait sans problèmes (remplacer les "," par des " "), c'est la seconde conversion où je voulais remplacer les "." par des "," . Mais je vais surement revenir en arrière, je viens de voir avec les techniciens, ils utilisent le "." comme séparateur décimal, donc je me débarasse de la partie qui bug. Mais ça reste un comble qu'un code qui marche quand tu l'enregistres, bug quand tu le réeffectue, au même moment, sans rien ajouter (surtout chgt de format de cellule alors qu'avant le code de conversion les formats de cellules sont inchangés)^^.

Merci au fait (je ne me souviens plus si je l'avais dit)

Si la virgule du fichier texte source représente non pas le séparateur décimal mais le séparateur de milliers,

la méthode TextToColumns comme l'objet QueryTable ont également un paramètre pour le gérer,

pas besoin de bidouiller !

Rien qu'en utilisant le Générateur de macros pour directement ouvrir le fichier texte :

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 07/05/2015 par The Noob Simulator
'
    Workbooks.OpenText Filename:="D:\Tests4Noobs\TestUt.txt", Origin:=xlWindows, _
        DataType:=xlDelimited, TextQualifier:=xlNone, ConsecutiveDelimiter:=False, _
        Tab:=False, Comma:=True, DecimalSeparator:=".", TrailingMinusNumbers:=False
End Sub

Sinon que ce soit avec la fonction Données, à partir du fichier ou avec la fonction Convertir

aucun souci en répondant bien à l'Assistant ou encore par code juste en configurant correctement les bons paramètres …

La première partie fonctionne (conversion), c'est la deuxième (remplacer par) qui bug.

J'ai besoin d'ouvrir un ou plusieurs fichiers que l'utilisateur choisit, d'où l'usine à gaz précedente et pour éviter les bugs d'un fichier déjà ouvert (oui ça arrive ^^), je vérifie si le fichier éxiste. Je ne dis pas que c'est la manière la plus simple ou la plus élégante de le faire mais cela fonctionne correctement, c'est lorsque je fais remplacer les . par des , que ça déconne. Je l'enregistre avec Excel (la manipulation marche correctement, mais quand je la réutilise sur le même fichier ou un autre en repartant du début, j'ai des cellules qui changent de format et tout qui bug)

Et encore plus fort rien qu'en lisant l'aide VBA de la méthode Workbooks.Open utilisée dans ton code !

Workbooks.Open Filename:="D:\Tests4Noobs\TestUt.txt", Format:=2

Il est tout à fait inutile de remplacer les points par des virgules, les différentes méthodes le font directement ‼

Quant au traitement, il suffit d'un simple filtre avancé pour ne pas tenir compte des lignes avec la valeur -1, boucle inutile et

c'est instantané ! Bref en revoyant la conception - c'est là tout le problème ! - moins de trente lignes de code suffisent …


L'avenir n'appartient pas qu'à ceux se levant tôt mais surtout à ceux se donnant la peine de lire …

Je vais peut être me répéter, je ne connais pas à l'avance le nom et le chemin du fichier (je fais varier le chemin avec une autre macro où l'utilisateur s'identifie, il est redirigé sur le dossier où sont stockés les résultats des tests qui lui sont associés, mais c'est lui qui choisit le ou les fichiers qui l'intéressent. Pour le forum j'ai retiré cette partie pour ne pas géner).

Aucun rapport avec la problématique d'origine de conversion de séparateur décimal ‼

Maintenant tu as assez d'éléments pour améliorer ton usine à gaz.

En cinq lignes de code il est possible d'ouvrir le fichier texte, de copier uniquement les lignes différentes de -1

puis de fermer ce fichier texte, le tout en un battement de paupières …

Rechercher des sujets similaires à "rechercher remplacer utilisation vba"