J
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !
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 😉
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??
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
BonjourSalut!
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!
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
Je le mets que quand les données de la lignes sont utiles.- Pour lire une ligne, pourquoi on met souvent "NettoyerEspaces" avant "fichierUnv.ReadLine" et des fois non??
" aze rty uio p "
"aze rty uio p"
Ils servent également à faire tourner la macro plus vite (cf Ce lien n'existe plus).- Le mem1 "ScreanUpdating", ça sert à faire tourner la macro plus rapidement je pense, mais mem2 et mem3 servent à quoi??
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??
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
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
parCode:" aze rty uio p "
C'est utile pour récupérer les données dans un tableau (avec le Split).Code:"aze rty uio p"
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??
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?