Sûr que c'est beaucoup plus long. J'ai repris la première version en scindant le traitement par paquets de 100 lignes. Si c'est encore trop, on pourra diminuer :
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then .Cells(Ligne, 1) = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + 1 End If Next x End With Next i Application.ScreenUpdating = True End Sub
Daniel
"DanielCo" a écrit dans le message de news: kqcrpb$et5$
>
J'ai arrêté la subtest à 25000 Il s'est planté à la ligne 2434 du fichier sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le Pos As Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de mon post de 15:41:05. Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41 celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Sûr que c'est beaucoup plus long. J'ai repris la première version en
scindant le traitement par paquets de 100 lignes. Si c'est encore trop,
on pourra diminuer :
Sub Compte()
Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico
As Object
Dim Result() As Long
Application.ScreenUpdating = False
Sheets(2).[A:B].ClearContents
Tabl = Array("'", "(", ")", ".", ";") 'etc.
For Each Item In Tabl
[A:A].Replace Item, " "
Next Item
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100
With Sheets(1)
Txt = ""
Dico.RemoveAll
ReDim Result(0)
Ctr = -1
For Each C In .Range(.Cells(i, 1), .Cells(i + 99,
1).End(xlUp))
Txt = Txt & " " & C.Value
Next C
Txt = Right(Txt, Len(Txt) - 1)
Tabl = Split(Txt, " ")
For Each Item In Tabl
If Item <> "" Then
If Not Dico.exists(Item) Then
Dico.Add Item, Item
Ctr = Ctr + 1
ReDim Preserve Result(Ctr)
Result(Ctr) = Result(Ctr) + 1
Else
Pos = Application.Match(Item, Dico.items, 0)
Result(Pos - 1) = Result(Pos - 1) + 1
End If
End If
Next Item
End With
With Sheets(2)
For x = 0 To Dico.Count - 1
Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1
Var = Dico.items
If Not IsNumeric(Application.Match(Var(x), .[A:A], 0))
Then
.Cells(Ligne, 1) = Var(x)
.Cells(Ligne, 2) = Result(x)
Else
Ligne = Application.Match(Var(x), .[A:A], 0)
.Cells(Ligne, 2) = .Cells(Ligne, 2) + 1
End If
Next x
End With
Next i
Application.ScreenUpdating = True
End Sub
Daniel
"DanielCo" <dcolardelleZZZ@free.fr> a écrit dans le message de news:
kqcrpb$et5$1@speranza.aioe.org...
>
J'ai arrêté la subtest à 25000
Il s'est planté à la ligne 2434 du fichier
sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le Pos As
Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de mon
post de 15:41:05.
Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41
celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Sûr que c'est beaucoup plus long. J'ai repris la première version en scindant le traitement par paquets de 100 lignes. Si c'est encore trop, on pourra diminuer :
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then .Cells(Ligne, 1) = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + 1 End If Next x End With Next i Application.ScreenUpdating = True End Sub
Daniel
"DanielCo" a écrit dans le message de news: kqcrpb$et5$
>
J'ai arrêté la subtest à 25000 Il s'est planté à la ligne 2434 du fichier sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le Pos As Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de mon post de 15:41:05. Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41 celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Sûr que c'est beaucoup plus long. J'ai repris la première version en scindant le traitement par paquets de 100 lignes. Si c'est encore trop, on pourra diminuer :
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps en cas de boucle longue : chaque ReDim Preserve va réallouer de la mémoire et aussi recopier les données dans la nouvelle plage de mémoire (équivalent de c "realloc")
En principe, comme en c : - soit on alloue un tableau d'une taille suffisamment grande dès le départ. Pendant la boucle, il n'y a pas d'allocation. En fin de boucle, on réalloue à une taille inférieure (ce qui n'est fait qu'une seule fois donc, et en plus ne nécessite pas la recopie des données, donc très rapide).
- soit on ne sait vraiment pas choisir une borne sup pour la taille du tableau, et dans ce cas on alloue dynamiquement en progression géométrique :
1ere allocation : MemSize = 1000 par exemple ReDim Result(MemSize) puis : Si Ctr >MemSize MemSize = 2 * MemSize ReDim Preserve Result(MemSize) Ainsi le nombre de réallocation est en log_2(nombre total des données)
Et à la fin : ReDim Preserve Result (<Taille finale>) avec Taille Finale < la valeur courante de MemSize
C'est la méthode générale d'allocation dynamique d'un buffer de taille inconnue.
Cdt.
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then .Cells(Ligne, 1) = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + 1 End If Next x End With Next i Application.ScreenUpdating = True End Sub
Daniel
"DanielCo" a écrit dans le message de news: kqcrpb$et5$
>
J'ai arrêté la subtest à 25000 Il s'est planté à la ligne 2434 du fichier sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le Pos As Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de mon post de 15:41:05. Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41 celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Sûr que c'est beaucoup plus long. J'ai repris la première version en
scindant le traitement par paquets de 100 lignes. Si c'est encore trop,
on pourra diminuer :
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps
en cas de boucle longue : chaque ReDim Preserve va réallouer de la
mémoire et aussi recopier les données dans la nouvelle plage de mémoire
(équivalent de c "realloc")
En principe, comme en c :
- soit on alloue un tableau d'une taille suffisamment grande dès le
départ. Pendant la boucle, il n'y a pas d'allocation. En fin de
boucle, on réalloue à une taille inférieure (ce qui n'est fait
qu'une seule fois donc, et en plus ne nécessite pas la recopie
des données, donc très rapide).
- soit on ne sait vraiment pas choisir une borne sup pour la taille
du tableau, et dans ce cas on alloue dynamiquement en progression
géométrique :
1ere allocation : MemSize = 1000 par exemple
ReDim Result(MemSize)
puis : Si Ctr >MemSize
MemSize = 2 * MemSize
ReDim Preserve Result(MemSize)
Ainsi le nombre de réallocation est en
log_2(nombre total des données)
Et à la fin : ReDim Preserve Result (<Taille finale>)
avec Taille Finale < la valeur courante de MemSize
C'est la méthode générale d'allocation dynamique d'un buffer
de taille inconnue.
Cdt.
Sub Compte()
Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico
As Object
Dim Result() As Long
Application.ScreenUpdating = False
Sheets(2).[A:B].ClearContents
Tabl = Array("'", "(", ")", ".", ";") 'etc.
For Each Item In Tabl
[A:A].Replace Item, " "
Next Item
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100
With Sheets(1)
Txt = ""
Dico.RemoveAll
ReDim Result(0)
Ctr = -1
For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp))
Txt = Txt & " " & C.Value
Next C
Txt = Right(Txt, Len(Txt) - 1)
Tabl = Split(Txt, " ")
For Each Item In Tabl
If Item <> "" Then
If Not Dico.exists(Item) Then
Dico.Add Item, Item
Ctr = Ctr + 1
ReDim Preserve Result(Ctr)
Result(Ctr) = Result(Ctr) + 1
Else
Pos = Application.Match(Item, Dico.items, 0)
Result(Pos - 1) = Result(Pos - 1) + 1
End If
End If
Next Item
End With
With Sheets(2)
For x = 0 To Dico.Count - 1
Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1
Var = Dico.items
If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then
.Cells(Ligne, 1) = Var(x)
.Cells(Ligne, 2) = Result(x)
Else
Ligne = Application.Match(Var(x), .[A:A], 0)
.Cells(Ligne, 2) = .Cells(Ligne, 2) + 1
End If
Next x
End With
Next i
Application.ScreenUpdating = True
End Sub
Daniel
"DanielCo" <dcolardelleZZZ@free.fr> a écrit dans le message de news:
kqcrpb$et5$1@speranza.aioe.org...
>
J'ai arrêté la subtest à 25000
Il s'est planté à la ligne 2434 du fichier
sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le
Pos As Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de
mon post de 15:41:05.
Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41
celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Sûr que c'est beaucoup plus long. J'ai repris la première version en scindant le traitement par paquets de 100 lignes. Si c'est encore trop, on pourra diminuer :
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps en cas de boucle longue : chaque ReDim Preserve va réallouer de la mémoire et aussi recopier les données dans la nouvelle plage de mémoire (équivalent de c "realloc")
En principe, comme en c : - soit on alloue un tableau d'une taille suffisamment grande dès le départ. Pendant la boucle, il n'y a pas d'allocation. En fin de boucle, on réalloue à une taille inférieure (ce qui n'est fait qu'une seule fois donc, et en plus ne nécessite pas la recopie des données, donc très rapide).
- soit on ne sait vraiment pas choisir une borne sup pour la taille du tableau, et dans ce cas on alloue dynamiquement en progression géométrique :
1ere allocation : MemSize = 1000 par exemple ReDim Result(MemSize) puis : Si Ctr >MemSize MemSize = 2 * MemSize ReDim Preserve Result(MemSize) Ainsi le nombre de réallocation est en log_2(nombre total des données)
Et à la fin : ReDim Preserve Result (<Taille finale>) avec Taille Finale < la valeur courante de MemSize
C'est la méthode générale d'allocation dynamique d'un buffer de taille inconnue.
Cdt.
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then .Cells(Ligne, 1) = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + 1 End If Next x End With Next i Application.ScreenUpdating = True End Sub
Daniel
"DanielCo" a écrit dans le message de news: kqcrpb$et5$
>
J'ai arrêté la subtest à 25000 Il s'est planté à la ligne 2434 du fichier sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
Erreur d'exécution 13, incompatibilité de type Faut-il changer le Pos As Long ?
A mon avis, Excel est à court de mémoire. Utilise plutôt la macro de mon post de 15:41:05. Daniel
Il y a un malentendu, j'ai justement testé la macro de 15:41 celle d'hier ramait , j'ai attendu un bon moment et j'ai abandonné
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une question de temps mais de mémoire. Daniel
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps en cas de boucle longue : chaque ReDim Preserve va réallouer de la mémoire et aussi recopier les données dans la nouvelle plage de mémoire (équivalent de c "realloc")
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps
en cas de boucle longue : chaque ReDim Preserve va réallouer de la
mémoire et aussi recopier les données dans la nouvelle plage de mémoire
(équivalent de c "realloc")
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une question de temps mais de mémoire. Daniel
A priori, c'est le ReDim Preserve qui va manger beaucoup de temps en cas de boucle longue : chaque ReDim Preserve va réallouer de la mémoire et aussi recopier les données dans la nouvelle plage de mémoire (équivalent de c "realloc")
moi
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de cod e : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de cod e : .Cells(Pos, 2) = .Cells(Pos, 2) + 1
msg = erreur 13
et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de cod e : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
DanielCo
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Pourquoi ? Tu étais pressé ? Quand tu traites une telle masse de données, le résultat ne peut pas être instantané. Est-ce que ton texte est confidentiel ou est-ce que tu peux le mettre sur cjoint.com ou autre ? En le compactant au besoin. Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code :
.Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13
et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Pourquoi ? Tu étais pressé ? Quand tu traites une telle masse de
données, le résultat ne peut pas être instantané. Est-ce que ton texte
est confidentiel ou est-ce que tu peux le mettre sur cjoint.com ou
autre ? En le compactant au besoin.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Pourquoi ? Tu étais pressé ? Quand tu traites une telle masse de données, le résultat ne peut pas être instantané. Est-ce que ton texte est confidentiel ou est-ce que tu peux le mettre sur cjoint.com ou autre ? En le compactant au besoin. Daniel
DanielCo
Je viens d'avoir une erreur semblable. Dans mon cas, c'est un signe "=" qui provoque l'erreur. Il faut donc l'ajouter dans la liste des caractères à éliminer. Daniel
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Je viens d'avoir une erreur semblable. Dans mon cas, c'est un signe "="
qui provoque l'erreur. Il faut donc l'ajouter dans la liste des
caractères à éliminer.
Daniel
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code :
.Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13
et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Je viens d'avoir une erreur semblable. Dans mon cas, c'est un signe "=" qui provoque l'erreur. Il faut donc l'ajouter dans la liste des caractères à éliminer. Daniel
Le mercredi 26 juin 2013 11:54:07 UTC+2, DanielCo a écrit :
Intéressant, je ferais un essai. Pour le moment, ce n'est pas une
question de temps mais de mémoire.
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
DanielCo
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Je viens de faire un essai sur 13700 lignes. La macro a pris 10 mn 11 sec. Ca dépend évidemment plus du nombre de mot que du nombre de lignes. Du processeur aussi. J'ai corrigé le décompte qui était faux parfois. Je vais essayer avec ce qu' a dit GL. Voici le code modifié :
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long deb = Timer Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";", "=") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then Var1 = Var(x) .Cells(Ligne, 1).Value = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + Result(x) End If Next x End With Next i MsgBox Timer - deb Application.ScreenUpdating = True End Sub
Daniel
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code :
.Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13
et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Je viens de faire un essai sur 13700 lignes. La macro a pris 10 mn 11
sec. Ca dépend évidemment plus du nombre de mot que du nombre de
lignes. Du processeur aussi. J'ai corrigé le décompte qui était faux
parfois. Je vais essayer avec ce qu' a dit GL. Voici le code modifié :
Sub Compte()
Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico
As Object
Dim Result() As Long
deb = Timer
Application.ScreenUpdating = False
Sheets(2).[A:B].ClearContents
Tabl = Array("'", "(", ")", ".", ";", "=") 'etc.
For Each Item In Tabl
[A:A].Replace Item, " "
Next Item
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100
With Sheets(1)
Txt = ""
Dico.RemoveAll
ReDim Result(0)
Ctr = -1
For Each C In .Range(.Cells(i, 1), .Cells(i + 99,
1).End(xlUp))
Txt = Txt & " " & C.Value
Next C
Txt = Right(Txt, Len(Txt) - 1)
Tabl = Split(Txt, " ")
For Each Item In Tabl
If Item <> "" Then
If Not Dico.exists(Item) Then
Dico.Add Item, Item
Ctr = Ctr + 1
ReDim Preserve Result(Ctr)
Result(Ctr) = Result(Ctr) + 1
Else
Pos = Application.Match(Item, Dico.items, 0)
Result(Pos - 1) = Result(Pos - 1) + 1
End If
End If
Next Item
End With
With Sheets(2)
For x = 0 To Dico.Count - 1
Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1
Var = Dico.items
If Not IsNumeric(Application.Match(Var(x), .[A:A], 0))
Then
Var1 = Var(x)
.Cells(Ligne, 1).Value = Var(x)
.Cells(Ligne, 2) = Result(x)
Else
Ligne = Application.Match(Var(x), .[A:A], 0)
.Cells(Ligne, 2) = .Cells(Ligne, 2) + Result(x)
End If
Next x
End With
Next i
MsgBox Timer - deb
Application.ScreenUpdating = True
End Sub
j'ai attendu plus d'un quart d'heure et j'ai arrêté.
Pour hier soir, je précise que le code s'est planté sur la ligne de code : .Cells(Pos, 2) = .Cells(Pos, 2) + 1 msg = erreur 13 et qu'il a saisi 2434 mots avec leur nombre dans le Feuil2
Je viens de faire un essai sur 13700 lignes. La macro a pris 10 mn 11 sec. Ca dépend évidemment plus du nombre de mot que du nombre de lignes. Du processeur aussi. J'ai corrigé le décompte qui était faux parfois. Je vais essayer avec ce qu' a dit GL. Voici le code modifié :
Sub Compte() Dim Tabl, Item, Txt As String, C As Range, Ligne As Long, Ctr, Dico As Object Dim Result() As Long deb = Timer Application.ScreenUpdating = False Sheets(2).[A:B].ClearContents Tabl = Array("'", "(", ")", ".", ";", "=") 'etc. For Each Item In Tabl [A:A].Replace Item, " " Next Item Set Dico = CreateObject("Scripting.Dictionary") For i = 1 To Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Step 100 With Sheets(1) Txt = "" Dico.RemoveAll ReDim Result(0) Ctr = -1 For Each C In .Range(.Cells(i, 1), .Cells(i + 99, 1).End(xlUp)) Txt = Txt & " " & C.Value Next C Txt = Right(Txt, Len(Txt) - 1) Tabl = Split(Txt, " ") For Each Item In Tabl If Item <> "" Then If Not Dico.exists(Item) Then Dico.Add Item, Item Ctr = Ctr + 1 ReDim Preserve Result(Ctr) Result(Ctr) = Result(Ctr) + 1 Else Pos = Application.Match(Item, Dico.items, 0) Result(Pos - 1) = Result(Pos - 1) + 1 End If End If Next Item End With With Sheets(2) For x = 0 To Dico.Count - 1 Ligne = .Cells(Rows.Count, 1).End(xlUp).Row + 1 Var = Dico.items If Not IsNumeric(Application.Match(Var(x), .[A:A], 0)) Then Var1 = Var(x) .Cells(Ligne, 1).Value = Var(x) .Cells(Ligne, 2) = Result(x) Else Ligne = Application.Match(Var(x), .[A:A], 0) .Cells(Ligne, 2) = .Cells(Ligne, 2) + Result(x) End If Next x End With Next i MsgBox Timer - deb Application.ScreenUpdating = True End Sub