PB temps d'excécution
Bonjour à tous,
J'ai récupéré une macro qui me permet de rapatrier un fichier .txt dans une colonne (EK) ce sont de numéros (un max de 600).
puis de ne garder par exemple de la ligne 20 à la ligne 35.
mais quelque soit la longueur de fichier txt il met tjrs autant de temps.
Dans la macro il y a à un endroit "601" alors je pense qu'il analyse les 601 cases mais les connaissances que j'ai ne me permet pas de savoir si c'est ça ou pas.
quelqu'un peut me dire si il y a un moyen de ne travailler que sur le nombre de numéro dans la colonne EK afin de réduire le temps.
par avance un grand merci.
Sub Import()
Dim contenuligne As Variant
Dim Ligne As Integer
Dim j As Integer
Dim v As Integer
Application.ScreenUpdating = False
'Fichier = "import.txt"
Dim CheminEtTypeFichier As String, Fichier As String
Columns("EK:EK").Select
Application.CutCopyMode = False
Selection.ClearContents
'Variable à définir : Le chemin par défaut
CheminEtTypeFichier = "Choix du fichier"
Fichier = BrowseFile(CheminEtTypeFichier)
If Fichier <> "" Then
m = Split(Fichier, Application.PathSeparator)
Range("CK8") = m(UBound(m))
Else
MsgBox "Aucune sélection a été effectuée."
Exit Sub
End If
Open Fichier For Input As #1
Do While Not EOF(1) And Ligne < 601
Line Input #1, contenuligne
Range("EK" & 1 + Ligne).Value = contenuligne
Ligne = Ligne + 1
Loop
Close #1
v = 1
For j = Range("CP6").Value To Range("CS6").Value
Range("AK" & v).Value = Range("EK" & j).Value
v = v + 1
Next j
Application.ScreenUpdating = True
MsgBox "Importation réussie."
End SubBonjour,
Une première proposition à vue de nez. Effectivement l'écriture ligne par ligne dans Excel peut très vite ralentir vos macros. Il est préférable de stocker toutes les données dans une Array (un tableau), puis de coller directement cette array dans Excel en 1 seule opération.
Je n'ai pas testé le programme, s'il y a une incompatibilité de type sur "Line Input #1, lignesLues(i)", remplacez "Dim lignesLues(1 To 600) As String" par "Dim lignesLues(1 To 600) As Variant".
Je pense qu'il est également possible d'optimiser la fin de votre code lorsque vous regardez les valeurs CP6 et CS6, mais pour cela j'aimerais si possible que vous joignez un fichier d'exemple afin de comprendre votre objectif final.
Sub Import()
Dim Ligne As Integer
Dim j As Integer
Dim v As Integer
Application.ScreenUpdating = False
Application.CutCopyMode = False
'Fichier = "import.txt"
Columns("EK:EK").ClearContents
Dim CheminEtTypeFichier As String, Fichier As String
'Variable à définir : Le chemin par défaut
CheminEtTypeFichier = "Choix du fichier"
Fichier = BrowseFile(CheminEtTypeFichier)
If Fichier <> "" Then
m = Split(Fichier, Application.PathSeparator)
Range("CK8").Value2 = m(UBound(m))
Else
MsgBox "Aucune sélection a été effectuée."
Exit Sub
End If
Open Fichier For Input As #1
Dim i As Long
Dim lignesLues(1 To 600) As String
For i = 1 To 600
if EOF(1) Then Goto FinLecture
Line Input #1, lignesLues(i)
Next i
FinLecture:
Close #1
' ecriture
Activesheet.Range("EK1").Resize(600, 1).Value2 = lignesLues
For j = Range("CP6").Value2 To Range("CS6").Value2
v = v + 1
Range("AK" & v).Value2 = Range("EK" & j).Value2
Next j
Application.ScreenUpdating = True
MsgBox "Importation réussie."
End SubEdit : Je pense cependant que vous devriez VRAIMENT regarder du coté de PowerQuery pour ce genre de requêtes. VBA est "obsolète" sur ce point, et juste beaucoup plus lent que PowerQuery. Surtout que la requête à l'air très simple.
Bonjour,
Je viens de tester et dans mon fichier j'ai un bouton qui affiche les numéros un par un les uns en dessous des autres.
et là il m'affiche toujours le même j'ai regardé et il n'importe que le premier numéro du fichier .txt et le répète à la suite au lieu de passer au suivant
Sinon c'est bien plus rapide merci
Bonjour,
Ah c'est probablement un problème de transposition ligne/colonne.
réessayez avec
' ecriture
Activesheet.Range("EK1").Resize(600, 1).Value2 = Application.Transpose(lignesLues)yes c'est tout bon un grand merci