Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/09/2011, 18h11   #1
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Par défaut Out of Range, que se passe-t-il ?

Bonjour,

J'ai développé une macro qui tri une feuille en fonction de catégories spécifiées sur une autre feuille.

Quand je l’exécute, au bout d'un moment je me retrouve avec le message d'erreur "Out of Range" et je comprend pas du tout pourquoi.

Avez vous une idée ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
Sub reportingByModality()
 
    Application.DisplayAlerts = False
 
    With Sheets("raw_data")
 
    Dim category As String
    Dim lastCategory As String
    Dim modality As String
    Dim maxLineRawData As Long
    Dim maxLineModality As Long
    Dim cursor As Long
 
    category = ""
    lastCategory = ""
    maxLineModality = Sheets("Modality").Range("B65536").End(xlUp).Row
    maxLineRawData = Sheets("raw_data").Range("B65536").End(xlUp).Row
 
        For i = 2 To maxLineModality
 
            modality = Trim(Sheets("Modality").Range("A" & i).Value)
            category = Trim(Sheets("Modality").Range("B" & i).Value)
 
            If Replace(category, "/", "-") <> Replace(lastCategory, "/", "-") Then
                Application.ScreenUpdating = True
 
                'On crée une nouvelle feuille
                category = Replace(category, "/", "-")
                Sheets.Add.Move After:=Sheets(Sheets.Count)
                Sheets(Sheets.Count).Name = category
 
                'on copie l'entete
                Sheets("raw_data").Cells(1, "A").EntireRow.Copy
                Sheets(category).Cells(1, 1).Insert Shift:=xlDown
                Sheets(category).Range("A:CN").Columns.AutoFit
 
                Application.ScreenUpdating = False
            End If
 
            'On parse la feuille raw data
            cursor = 2
            For j = 1 To maxLineRawData
 
                If Trim(Sheets("raw_data").Range("CF" & j).Value) = Trim(modality) Then
                    Sheets("raw_data").Cells(j, "A").EntireRow.Copy
                    Sheets(category).Cells(cursor, 1).Insert Shift:=xlDown
                    cursor = cursor + 1
                End If
 
            Next j
 
            lastCategory = category
 
        Next i
 
    End With
 
End Sub
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 20h40   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
Sur qu'elle ligne ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 09h24   #3
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Citation:
Envoyé par bbil Voir le message
Sur qu'elle ligne ?
Je débute complètement en VBA, comment connaitre la ligne qui pose soucis ?
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 09h46   #4
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Je pencherai pour une variable dont le type n'est pas adaptée du style :
Code :
1
2
3
4
5
 
Dim I As Integer 'bornes -32767 à 32767
 
'dépassement de capacité
I = 60000
Mais je peux me tromper sans plus de précision.

Oups,

Je n'ai pas fait attention au code, désolé, les variables semblent bien déclarées.
Je pense que le mieux est de faire un pas à pas, appuis successifs sur F8 et à un moment donné l'erreur surviendra sur la ligne incriminée.

Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 09h59   #5
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Citation:
Envoyé par Theze Voir le message
Oups,

Je n'ai pas fait attention au code, désolé, les variables semblent bien déclarées.
Je pense que le mieux est de faire un pas à pas, appuis successifs sur F8 et à un moment donné l'erreur surviendra sur la ligne incriminée.

Hervé.
Ouai j'y ai pensé, mais je parcoure 34 000 lignes, c'est super long :s
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 10h06   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Citation:
Envoyé par bbil Voir le message
Sur qu'elle ligne ?
Bonjour,

normalement, quand il y a message d'erreur, le code VBA s'arrête sur une ligne soulignée => celle qui provoque l'erreur.

C'est cette ligne qu'on te demande

Parfois, c'est plus complexe, si la ligne n'est pas significative, on te diras comment procéder.

Si c'est une variable compteur, il faut inspecter sa valeur au moment du blocage.

Genre I en integer ne pourrait monter à 34 000 par exemple s'il était concerné...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 10h08   #7
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Citation:
Envoyé par Ormonth Voir le message
Bonjour,

normalement, quand il y a message d'erreur, le code VBA s'arrête sur une ligne soulignée => celle qui provoque l'erreur.
Je suis sous Excel 2010 et il ne me souligne pas la ligne qui provoque l'erreur.
Dois je activer une option pour cela ?

Autrement, j'ai fais le teste en déclarant i et j en tant que Long, mais j'ai le même problème, c'est vraiment étrange !
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 10h17   #8
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

Outils, Options, Général, Arrêt sur les erreurs non gérées (à cocher).

Sinon, c'est plus complexe, mais à tous les coups tu sors du champ d'une variable, d'une plage ou de la feuille.
Tu peux procéder par approximation, comme pour certaines recherches, tu limites ta procédure à 34000/ 2 = 17 000.
ça plante ou non, selon tu recommence pour
17 000 /2 ou 17 000 + 17 000/2 pour circonscrire la zone d'erreur, ça peut se programmer d'ailleurs

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 10h25   #9
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Magnifique, grace à toi je sais ou le probléme se situe :
Code :
Sheets(category).Cells(cursor, 1).Insert Shift:=xlDown
Par contre c'est complètement fou, je ne vois aucun dépassement de variable :
Code :
1
2
3
cursor = 2
j = 9931
i = 10
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2011, 10h34   #10
Membre du Club
 
Inscription : décembre 2005
Messages : 90
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 90
Points : 47
Points : 47
Problème résolu

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Sub reportingByModality()
 
    Application.DisplayAlerts = False
 
    With Sheets("raw_data")
 
    Dim category As String
    Dim lastCategory As String
    Dim modality As String
    Dim maxLineRawData As Long
    Dim maxLineModality As Long
    Dim cursor As Long
    Dim j As Long
    Dim i As Long
 
    category = ""
    lastCategory = ""
    maxLineModality = Sheets("Modality").Range("B65536").End(xlUp).Row
    maxLineRawData = Sheets("raw_data").Range("B65536").End(xlUp).Row
 
        'For i = 2 To maxLineModality
        For i = 9 To 10
 
            modality = Trim(Sheets("Modality").Range("A" & i).Value)
            modality_s = modality
            category = Trim(Sheets("Modality").Range("B" & i).Value)
            category = Replace(category, "/", "-")
 
            If category <> lastCategory Then
                Application.ScreenUpdating = True
 
                'On crée une nouvelle feuille
                Sheets.Add.Move After:=Sheets(Sheets.Count)
                Sheets(Sheets.Count).Name = category
 
                'on copie l'entete
                Sheets("raw_data").Cells(1, "A").EntireRow.Copy
                Sheets(category).Cells(1, 1).Insert Shift:=xlDown
                Sheets(category).Range("A:CN").Columns.AutoFit
 
                Application.ScreenUpdating = False
            End If
 
            'On parse la feuille raw data
            cursor = 2
            For j = 1 To maxLineRawData
 
                If Trim(Sheets("raw_data").Range("CF" & j).Value) = Trim(modality) Then
                    Sheets("raw_data").Cells(j, "A").EntireRow.Copy
                    Sheets(category).Cells(cursor, 1).Insert Shift:=xlDown
                    cursor = cursor + 1
                End If
 
            Next j
 
            lastCategory = category
 
        Next i
 
    End With
 
End Sub
Un GRAND merci aux personnes qui m'ont aidées
iMaTh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h06.


 
 
 
 
Partenaires

Hébergement Web