Probléme programmation VBA

jeanbat29

XLDnaute Nouveau
Bonjour,
Un petit soucis: j'ai des fichiers .univ qui sont des résultats d'essais, écrits comme un fichier .txt, avec des tas de chiffres séparés par des espaces.
J'aimerais créer un fichier excel qui me "range" ces données, une valaur dans chaque cellule.
J'essaie de trouver des explications sur VBA, mais j'y comprends que couic. A la base je suis ingé en mécanique, très mateux mais j'ai jamais été fichu de taper ou de comprendre un prodramme il faut dire...
Quelqu'un connait il une vraie initiation à VBA (Tout ce que je trouve, au bout de 4 lignes je suis paumé...).
merci
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

re,

je quitte mon travail dans quelques minutes.
je pense que je n'aurai pas accès à internet d'ici la rentrée, on regardera ça à ce moment là si tu n'as pas eu de réponce d'ici là.

a+ et bonnes fêtes ;)

Heureuse année!
Ma principale résolution reste justement de pouvoir trier ces fichiers .univ!!!
Bref, je m'y remet juste et c'est pas encore gagné...
 

mromain

XLDnaute Barbatruc
Re : Probléme programmation VBA

bonjour jeanbat29 et bonne année ;)


peux-tu déposer :
- le fichier .unv (complet), ainsi que
- le fichier excel souhaité après "l'import" de ce fichier .unv

le tout sur un site du genre Cijoint (ne pas oublier de cocher la case "Rendre public le fichier").

a+
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

Merci!
Je viens d'essayer, mais on ne peut pas déposer de fichier avec l'extension .univ, et quand je la change en .txt c'est le fichier qui change...
Il ne fait que 900 KB, je peux peut être te l'envoyer par mail??
 

mromain

XLDnaute Barbatruc
Re : Probléme programmation VBA

Bonjour,


Voici la macro modifiée. Elle a l'air de fonctionner sur le fichier que tu m'as fourni.
Code:
Public Sub TestImportUnv()
Dim fichierUnv As Object, ligneCourante As String, capteurCourant As String, fichiersUnv As Variant, iFichier As Integer
Dim frequence As Double, incrementation As Double, compteurLigneEcriture As Long, compteurLigneLecture As Long, compteurIncrementation As Long, tabStr() As String
    
compteurLigneEcriture = 1

'récupérer les fichiers à importer (multi-sélection possible avec la touche Ctrl)
fichiersUnv = Application.GetOpenFilename("Fichiers .unv,*.unv", , "Fichiers à importer :", , True)

'si la fenêtre de sélection a été fermée sans de fichiers sélectionnées, quitter la macro
If VarType(fichiersUnv) = vbBoolean Then Exit Sub
 
'boucler sur les fichiers sélectionnés
For iFichier = LBound(fichiersUnv) To UBound(fichiersUnv)
    
    'ouvrir le fichier courant
    Set fichierUnv = CreateObject("Scripting.FileSystemObject").OpenTextFile(fichiersUnv(iFichier), 1)
    
    'Tant qu'on est pas à la fin du fichier
    While Not fichierUnv.AtEndOfStream
        
        'aller jusqu'à la prochaine ligne commançant par "frequency_spectr (peak_amplitude) for "
        While (ligneCourante Like "frequency_spectr (peak_amplitude) for *" = False) And (Not fichierUnv.AtEndOfStream)
            ligneCourante = fichierUnv.ReadLine
        Wend
        
        'on va récupérer le capteur analysé (les 2 caractères après "frequency_spectr (peak_amplitude) for ")
        capteurCourant = Left(Replace(ligneCourante, "frequency_spectr (peak_amplitude) for ", ""), 2)
        
        'sauter 5 ligne (pour récupérer la fréquence et l'incrémentation
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 5)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
        'récupérer les diférentes valeurs de la ligne dans un tableau
        tabStr = Split(NettoyerEspaces(fichierUnv.ReadLine), " ")
        'récupérer la fréquence et l'incrémentation
        frequence = CDbl(Evaluate(tabStr(3)))
        incrementation = CDbl(Evaluate(tabStr(4)))
        
        'sauter les 4 lignes suivantes
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 4)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
        'boucler sur les lignes contenant les valeurs (jusqu'à la ligne contenant le "-1")
        compteurIncrementation = 0
        While (Not fichierUnv.AtEndOfStream) And ligneCourante <> "-1"
            ligneCourante = NettoyerEspaces(fichierUnv.ReadLine)
            
            'récupérer les diférentes valeurs de la ligne dans un tableau
            tabStr = Split(ligneCourante, " ")
            
            'écrire les diférentes valeurs
            If ligneCourante <> "-1" Then
                'premier terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Value = tabStr(0)
                Range("D" & compteurLigneEcriture).Value = tabStr(1)
                compteurIncrementation = compteurIncrementation + 1
            
                'deuxième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Value = tabStr(2)
                Range("D" & compteurLigneEcriture).Value = tabStr(3)
                compteurIncrementation = compteurIncrementation + 1
            
                'troisième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Value = tabStr(4)
                Range("D" & compteurLigneEcriture).Value = tabStr(5)
                compteurIncrementation = compteurIncrementation + 1
            End If
        Wend
        
    Wend
    
    'fermer le fichier .unv
    fichierUnv.Close
Next iFichier
Set fichierUnv = Nothing
End Sub


'efface les multiples espaces dans une chaine de caractère
Private Function NettoyerEspaces(texte As String) As String
While InStr(texte, "  ")
    texte = Replace(texte, "  ", " ")
Wend
If Right(texte, 1) = " " Then texte = Left(texte, Len(texte) - 1)
If Left(texte, 1) = " " Then texte = Right(texte, Len(texte) - 1)
NettoyerEspaces = texte
End Function


a+
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

Salut!

Ben oui ça marche pas mal du tout! Enorme!
Par contre si j'osais: ça fait beaucoup de lignes, j'aimerais ranger chaque capteur sur une colonne différente, pas tous dans les colonnes A,B,C,D.
C'est possible??

J'essaie de déchiffrer ton code, histoire d'essayer de comprendre comment ça marche.

Bonne journée et encore merci!
 

mromain

XLDnaute Barbatruc
Re : Probléme programmation VBA

Salut!

Ben oui ça marche pas mal du tout! Enorme!
Par contre si j'osais: ça fait beaucoup de lignes, j'aimerais ranger chaque capteur sur une colonne différente, pas tous dans les colonnes A,B,C,D.
C'est possible??

J'essaie de déchiffrer ton code, histoire d'essayer de comprendre comment ça marche.

Bonne journée et encore merci!
Bonjour

Voici la macro modifiée :
Code:
Public Sub TestImportUnv()
Dim fichierUnv As Object, ligneCourante As String, capteurCourant As String, fichiersUnv As Variant, iFichier As Integer[COLOR=Red][B], iCapteur As Integer[/B][/COLOR]
Dim frequence As Double, incrementation As Double, compteurLigneEcriture As Long, compteurLigneLecture As Long, compteurIncrementation As Long, tabStr() As String
Dim mem1 As Boolean, mem2 As Boolean, mem3 As Long

mem1 = Application.ScreenUpdating: Application.ScreenUpdating = False
mem2 = Application.EnableEvents: Application.EnableEvents = False
mem3 = Application.Calculation: Application.Calculation = xlCalculationManual

[COLOR=Red][B]iCapteur = 0[/B][/COLOR]

'récupérer les fichiers à importer (multi-sélection possible avec la touche Ctrl)
fichiersUnv = Application.GetOpenFilename("Fichiers .unv,*.unv", , "Fichiers à importer :", , True)

'si la fenêtre de sélection a été fermée sans de fichiers sélectionnées, quitter la macro
If VarType(fichiersUnv) = vbBoolean Then Exit Sub
 
'boucler sur les fichiers sélectionnés
For iFichier = LBound(fichiersUnv) To UBound(fichiersUnv)
    
    'ouvrir le fichier courant
    Set fichierUnv = CreateObject("Scripting.FileSystemObject").OpenTextFile(fichiersUnv(iFichier), 1)
    
    'Tant qu'on est pas à la fin du fichier
    While Not fichierUnv.AtEndOfStream
        
        [COLOR=Red][B]compteurLigneEcriture = 1[/B][/COLOR]
        
        'aller jusqu'à la prochaine ligne commançant par "frequency_spectr (peak_amplitude) for "
        While (ligneCourante Like "frequency_spectr (peak_amplitude) for *" = False) And (Not fichierUnv.AtEndOfStream)
            ligneCourante = fichierUnv.ReadLine
        Wend
        
        'on va récupérer le capteur analysé (les 2 caractères après "frequency_spectr (peak_amplitude) for ")
        capteurCourant = Left(Replace(ligneCourante, "frequency_spectr (peak_amplitude) for ", ""), 2)
        
        'sauter 5 ligne (pour récupérer la fréquence et l'incrémentation
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 5)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
        'récupérer les diférentes valeurs de la ligne dans un tableau
        tabStr = Split(NettoyerEspaces(fichierUnv.ReadLine), " ")
        'récupérer la fréquence et l'incrémentation
        frequence = CDbl(Evaluate(tabStr(3)))
        incrementation = CDbl(Evaluate(tabStr(4)))
        
        'sauter les 4 lignes suivantes
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 4)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
        'boucler sur les lignes contenant les valeurs (jusqu'à la ligne contenant le "-1")
        compteurIncrementation = 0
        While (Not fichierUnv.AtEndOfStream) And ligneCourante <> "-1"
            ligneCourante = NettoyerEspaces(fichierUnv.ReadLine)
            
            'récupérer les diférentes valeurs de la ligne dans un tableau
            tabStr = Split(ligneCourante, " ")
            
            'écrire les diférentes valeurs
            If ligneCourante <> "-1" Then
                'premier terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = capteurCourant
                Range("B" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = tabStr(0)
                Range("D" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = tabStr(1)
                compteurIncrementation = compteurIncrementation + 1
            
                'deuxième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = capteurCourant
                Range("B" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture)[B][COLOR=Red].Offset(0, iCapteur * 5)[/COLOR][/B].Value = tabStr(2)
                Range("D" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = tabStr(3)
                compteurIncrementation = compteurIncrementation + 1
            
                'troisième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = capteurCourant
                Range("B" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = tabStr(4)
                Range("D" & compteurLigneEcriture)[COLOR=Red][B].Offset(0, iCapteur * 5)[/B][/COLOR].Value = tabStr(5)
                compteurIncrementation = compteurIncrementation + 1
            End If
        Wend
        [B][COLOR=Red]iCapteur = iCapteur + 1[/COLOR][/B]
    Wend
    
    'fermer le fichier .unv
    fichierUnv.Close
Next iFichier
Set fichierUnv = Nothing

Application.ScreenUpdating = mem1
Application.EnableEvents = mem2
Application.Calculation = mem3

End Sub


'efface les multiples espaces dans une chaine de caractère
Private Function NettoyerEspaces(texte As String) As String
While InStr(texte, "  ")
    texte = Replace(texte, "  ", " ")
Wend
If Right(texte, 1) = " " Then texte = Left(texte, Len(texte) - 1)
If Left(texte, 1) = " " Then texte = Right(texte, Len(texte) - 1)
NettoyerEspaces = texte
End Function

ce qui est en rouge permet de décaler chaque capteur de 5 colonnes.

a+
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

OK, ça marche d'enfer, je vais parler de toi lors de ma prochaine réunion.
Tu m'à fait gagner au moins 1 mois...

J'ai bien une ou deux questions:
- Pour lire une ligne, pourquoi on met souvent "NettoyerEspaces" avant "fichierUnv.ReadLine" et des fois non??
- Le mem1 "ScreanUpdating", ça sert à faire tourner la macro plus rapidement je pense, mais mem2 et mem3 servent à quoi??
 

mromain

XLDnaute Barbatruc
Re : Probléme programmation VBA

re bonjour

- Pour lire une ligne, pourquoi on met souvent "NettoyerEspaces" avant "fichierUnv.ReadLine" et des fois non??
Je le mets que quand les données de la lignes sont utiles.
Cette fonction efface les multiples espaces. Par exemple, elle remplace
Code:
"         aze           rty        uio p    "
par
Code:
"aze rty uio p"
C'est utile pour récupérer les données dans un tableau (avec le Split).

- Le mem1 "ScreanUpdating", ça sert à faire tourner la macro plus rapidement je pense, mais mem2 et mem3 servent à quoi??
Ils servent également à faire tourner la macro plus vite (cf Ce lien n'existe plus).

a+
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

OK, je commence à capter le langage.

Et cerise sur le gâteau:
Pour faire apparaître dans la première ligne les légendes: Capteur, Fréquence, Partie Réelle, Partie Imaginaire. Ceci pour chaque série de valeurs, on fait comment??
 

mromain

XLDnaute Barbatruc
Re : Probléme programmation VBA

OK, je commence à capter le langage.

Et cerise sur le gâteau:
Pour faire apparaître dans la première ligne les légendes: Capteur, Fréquence, Partie Réelle, Partie Imaginaire. Ceci pour chaque série de valeurs, on fait comment??

Re,

Voici la macro modifiée :
Code:
Public Sub TestImportUnv()
Dim fichierUnv As Object, ligneCourante As String, capteurCourant As String, fichiersUnv As Variant, iFichier As Integer, iCapteur As Integer
Dim frequence As Double, incrementation As Double, compteurLigneEcriture As Long, compteurLigneLecture As Long, compteurIncrementation As Long, tabStr() As String
Dim mem1 As Boolean, mem2 As Boolean, mem3 As Long

mem1 = Application.ScreenUpdating: Application.ScreenUpdating = False
mem2 = Application.EnableEvents: Application.EnableEvents = False
mem3 = Application.Calculation: Application.Calculation = xlCalculationManual

iCapteur = 0

'récupérer les fichiers à importer (multi-sélection possible avec la touche Ctrl)
fichiersUnv = Application.GetOpenFilename("Fichiers .unv,*.unv", , "Fichiers à importer :", , True)

'si la fenêtre de sélection a été fermée sans de fichiers sélectionnées, quitter la macro
If VarType(fichiersUnv) = vbBoolean Then Exit Sub
 
'boucler sur les fichiers sélectionnés
For iFichier = LBound(fichiersUnv) To UBound(fichiersUnv)
    
    'ouvrir le fichier courant
    Set fichierUnv = CreateObject("Scripting.FileSystemObject").OpenTextFile(fichiersUnv(iFichier), 1)
    
    'Tant qu'on est pas à la fin du fichier
    While Not fichierUnv.AtEndOfStream
        
        compteurLigneEcriture = 1
        
        'aller jusqu'à la prochaine ligne commançant par "frequency_spectr (peak_amplitude) for "
        While (ligneCourante Like "frequency_spectr (peak_amplitude) for *" = False) And (Not fichierUnv.AtEndOfStream)
            ligneCourante = fichierUnv.ReadLine
        Wend
        
        'on va récupérer le capteur analysé (les 2 caractères après "frequency_spectr (peak_amplitude) for ")
        capteurCourant = Left(Replace(ligneCourante, "frequency_spectr (peak_amplitude) for ", ""), 2)
        
        'sauter 5 ligne (pour récupérer la fréquence et l'incrémentation
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 5)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
        'récupérer les diférentes valeurs de la ligne dans un tableau
        tabStr = Split(NettoyerEspaces(fichierUnv.ReadLine), " ")
        'récupérer la fréquence et l'incrémentation
        frequence = CDbl(Evaluate(tabStr(3)))
        incrementation = CDbl(Evaluate(tabStr(4)))
        
        'sauter les 4 lignes suivantes
        compteurLigneLecture = 0
        While (Not fichierUnv.AtEndOfStream) And (compteurLigneLecture < 4)
            ligneCourante = fichierUnv.ReadLine
            compteurLigneLecture = compteurLigneLecture + 1
        Wend
        
[COLOR=Red][B]        'afficher les entêtes de colonnes
        Range("A" & 1).Offset(0, iCapteur * 5).Value = "Capteur"
        Range("B" & 1).Offset(0, iCapteur * 5).Value = "Fréquence"
        Range("C" & 1).Offset(0, iCapteur * 5).Value = "Partie Réelle"
        Range("D" & 1).Offset(0, iCapteur * 5).Value = "Partie Imaginaire"
[/B][/COLOR]        
        'boucler sur les lignes contenant les valeurs (jusqu'à la ligne contenant le "-1")
        compteurIncrementation = 0
        While (Not fichierUnv.AtEndOfStream) And ligneCourante <> "-1"
            ligneCourante = NettoyerEspaces(fichierUnv.ReadLine)
            
            'récupérer les diférentes valeurs de la ligne dans un tableau
            tabStr = Split(ligneCourante, " ")
            
            'écrire les diférentes valeurs
            If ligneCourante <> "-1" Then
                'premier terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(0)
                Range("D" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(1)
                compteurIncrementation = compteurIncrementation + 1
            
                'deuxième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(2)
                Range("D" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(3)
                compteurIncrementation = compteurIncrementation + 1
            
                'troisième terme de la ligne
                compteurLigneEcriture = compteurLigneEcriture + 1
                Range("A" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = capteurCourant
                Range("B" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = frequence + (compteurIncrementation * incrementation)
                Range("C" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(4)
                Range("D" & compteurLigneEcriture).Offset(0, iCapteur * 5).Value = tabStr(5)
                compteurIncrementation = compteurIncrementation + 1
            End If
        Wend
        iCapteur = iCapteur + 1
    Wend
    
    'fermer le fichier .unv
    fichierUnv.Close
Next iFichier
Set fichierUnv = Nothing

Application.ScreenUpdating = mem1
Application.EnableEvents = mem2
Application.Calculation = mem3

End Sub


'efface les multiples espaces dans une chaine de caractère
Private Function NettoyerEspaces(texte As String) As String
While InStr(texte, "  ")
    texte = Replace(texte, "  ", " ")
Wend
If Right(texte, 1) = " " Then texte = Left(texte, Len(texte) - 1)
If Left(texte, 1) = " " Then texte = Right(texte, Len(texte) - 1)
NettoyerEspaces = texte
End Function
a+
 

jeanbat29

XLDnaute Nouveau
Re : Probléme programmation VBA

re bonjour

Je le mets que quand les données de la lignes sont utiles.
Cette fonction efface les multiples espaces. Par exemple, elle remplace
Code:
"         aze           rty        uio p    "
par
Code:
"aze rty uio p"
C'est utile pour récupérer les données dans un tableau (avec le Split).

Ils servent également à faire tourner la macro plus vite (cf Ce lien n'existe plus).

a+

OK, mais la fonction "NettoyerEspaces" est définie pour des caractères(String) alors qu'on l'utilise dans des lignes ou il y a des nombres (integer et double).
Comment ça se fait que ça marche??
 

Discussions similaires

Réponses
10
Affichages
325
Réponses
3
Affichages
584

Statistiques des forums

Discussions
311 737
Messages
2 082 030
Membres
101 876
dernier inscrit
JULIEN21370