IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Dépassement de capacité dans une recherche de tableau [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 8
    Par défaut Dépassement de capacité dans une recherche de tableau
    Bonjour.

    Voici mon problème, j'ai un dépassement de capacité lorsque je veux afficher une recherche dans un tableau. Je ne comprends pas pourquoi, et après avoir regardé sur plusieurs forums changer les integer en double ne change rien.

    J'ai fait la recherche dans un tableau en suivant le tutoriel suivant, et en l'adaptant :


    Et j'ai essayé d'optimiser mon code en suivant ce tutoriel ci :


    Mais rien n'y fait, au bout d'une vingtaine de lignes a peu pres, le message "dépassement de capacité" apparait.
    Il n'y a pourtant que 1000 lignes environ dans le tabeau où je recherche des mots.

    Voici les fonctions utilisées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
     
    Sub Chercher()
    Dim tab_mots() As String
    Dim compteur As Byte
    Dim ligne As Integer: Dim ligne_ext As Integer
    Dim valider As Boolean
    Dim nom As String: Dim cle As String
    Dim redacteur As String: Dim valideur As String
    Dim chaine As String
    Dim i As Byte
     
    Call TurnOffStuff
     
    purger
     
    tab_mots = Split(Range("C4").Value, " ")
     
    ligne = 4: ligne_ext = 8
     
    While Sheets("Suivi DOC").Cells(ligne, 1).Value <> ""
        valider = True
     
        nom = Sheets("Suivi DOC").Cells(ligne, 3).Value
        redacteur = Sheets("Suivi DOC").Cells(ligne, 7).Value
        valideur = Sheets("Suivi DOC").Cells(ligne, 8).Value
        cle = Sheets("Suivi DOC").Cells(ligne, 10).Value
     
        chaine = nom & "-" & redacteur & "-" & valideur & "-" & cle
     
        For compteur = 0 To UBound(tab_mots())
            If (InStr(1, sansAccent(chaine), sansAccent(tab_mots(compteur)), vbTextCompare) = 0) Then
                valider = False
                Exit For
            End If
     
        Next compteur
     
        If (valider = True) Then
            For i = 2 To 15
                Cells(ligne_ext, i).Value = Sheets("Suivi DOC").Cells(ligne, i - 1).Value
            Next i
     
            ligne_ext = ligne_ext + 1
        End If
     
        ligne = ligne + 1
    Wend
    Call TurnOnStuff
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Sub purger()
    Dim ligne As Integer
    Dim colonne As Byte
     
    ligne = 8
     
    While (Cells(ligne, 2).Value <> "")
        For colonne = 2 To 15
            Cells(ligne, colonne).Value = ""
        Next colonne
        ligne = ligne + 1
    Wend
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Function sansAccent(chaine As String) As String
        Dim ch_avec As String
        Dim ch_sans As String
        Dim tampon As String
        Dim i As Byte
        Dim position As Byte
     
        ch_avec = "ÉÈÊËÔéèêëàçùôûïî"
        ch_sans = "EEEEOeeeeacuouii"
        tampon = chaine
     
        For i = 1 To Len(tampon)
            position = InStr(ch_avec, Mid(tampon, i, 1))
            If position > 0 Then
                Mid(tampon, i, 1) = Mid(ch_sans, position, 1)
            End If
        Next i
     
            sansAccent = tampon
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub TurnOffStuff()
     
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.EnableEvents = False
     
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub TurnOnStuff()
     
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    Application.EnableEvents = True
     
     
    End Sub
    Je ne vois vraiment pas comment résoudre ce problème.

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    bonjour

    tu as essayer en
    de mon coté lorsque je déclare des colonnes ou des lignes, je mets toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim col ou ligne as long
    voir ce lien
    https://docs.microsoft.com/fr-fr/dot...long-data-type

    david

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 8
    Par défaut
    Bonjour.

    Merci de votre message.
    Oui j'ai essayé, et aussi de modifier tous les integer, mais le problème persiste.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    776
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 776
    Par défaut
    dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Sub purger()
    Dim ligne As Integer
    Dim colonne As Byte
     
    ligne = 8
     
    While (Cells(ligne, 2).Value <> "")
        For colonne = 2 To 15
            Cells(ligne, colonne).Value = ""
        Next colonne
        ligne = ligne + 1
    Wend
     
    End Sub
    ou s'arrete le compteur de la ligne ?
    a priori, tu ajoutes 1 jusqu'à la fin de ton tableau et donc ensuite il plante
    il faut également limiter à un nombre de ligne max en fonction de la taille de ton tableau (ligne et colonne)
    enfin si j'ai bien compris...

    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Sub purger()
    Dim ligne As Integer
    Dim colonne As Byte
    dim FinLigne as long
     
    'déclaration de la ligne
    FinLigne = Cells(Rows.Count, 1).End(xlUp).Row
     
    for i = 8 to FinLigne
     
    While (Cells(i, 2).Value <> "")
        For colonne = 2 To 15
            Cells(i, colonne).Value = ""
        Next colonne
    Wend
     
    end if
     
    End Sub

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 8
    Par défaut
    Le compteur de la ligne s'arrête au dernier mot clé rentré par l'utilisateur, d'après le tutoriel

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Mais rien n'y fait, au bout d'une vingtaine de lignes a peu pres, le message "dépassement de capacité" apparait.
    Sur quel ligne le code bloque ?
    Quels sont les variables présentes sur cette ligne et quelles sont leur valeur au moment de l'erreur ? (si ce n'est pas déjà fait, tu peut afficher la fenêtre des variables locales dans l'onglet affichage de l'éditeur vba

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Salut

    Plusieurs choses

    • Tu devrais (si ça n'est pas le cas) mettre tes données dans un Tableau Structuré, ça facilite grandement la gestion des données dans le code, ainsi que la maintenance de celui-ci
    • Sur quelle ligne VBE s'arrête-t-il lorsqu'il y a ce "dépassement de capacité"?
    • Attention dans "SansAccent", tu utilise un byte pour la position... si un caractère accentué est placé au delà du 255ème caractères dans ta chaine... tu l'as ton "dépassement de capacité"


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 8
    Par défaut
    Bonjour à tous.

    Tout d'abord, merci pour vos réponses.

    Changer le sub purge ne changeait rien au résultat.

    suivant les conseils de Qwazerty, j'ai recherché et remplacé les "bytes" par des "integer", et d'un coup, ma recherche a fonctionnée.

    VBE, justement, ne s'arrêtait pas sur une ligne en particulier lors du message d'erreur, ce qui est assez gênant pour comprendre la source du problème.

    J'aimerais aussi savoir a quoi correspond un Tableau Structuré, car je suis novice en VBA et aimerait clarifier ou optimiser mon code le mieux possible.

    Encore merci pour votre aide !!

  9. #9
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par totallynotabot Voir le message
    J'aimerais aussi savoir a quoi correspond un Tableau Structuré, car je suis novice en VBA et aimerait clarifier ou optimiser mon code le mieux possible.
    Par ici:https://fauconnier.developpez.com/tu...ux-structures/
    Mais c'est pas du VBA c'est du Excel, c'est une bonne manière de structuré tes données pour avoir un traitement plus efficace

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 109
    Par défaut
    Salut
    Citation Envoyé par totallynotabot Voir le message
    suivant les conseils de Qwazerty, j'ai recherché et remplacé les "bytes" par des "integer", et d'un coup, ma recherche a fonctionnée.
    Une partie des Byte étaient utilisés à bon escient, par exemple pour boucler sur les colonne de 2 à 15... pas de soucis puisque la valeur ne dépassera jamais 255. Le problème était donc probablement bien lié au byte utilisé pour modifier les caractère de chaine, le soucis aurait été résolue de la même manière en ne remplaçant que celui-ci par un integer, ou par un long si tu as des textes qui peuvent dépasser 65536 caractères... sinon tu vas avoir un dépassement de capacité si un caractère accentué se trouve au delà du 65536ème caractère.
    Je sais que tout celà peut paraitre abscons mais il est important de déterminer à l'avance sur quel type de données tu vas travailler et de dimensionner tes variable en fonction. Utiliser systématiquement un long parce qu'on ne sais pas trop quelle valeurs sera travailler... peut aussi poser des problème si les valeurs sont décimales.
    C'est comme utiliser systématiquement un Variant parce qu'on ne saurait pas exactement ce qu'on va mettre dedans...

    Citation Envoyé par totallynotabot Voir le message
    VBE, justement, ne s'arrêtait pas sur une ligne en particulier lors du message d'erreur, ce qui est assez gênant pour comprendre la source du problème.
    Ça c'est un problème de réglage dans VBE Menu Outil, Options : sans doute ici, dans la section "récupération d'erreurs"
    Nom : 2020-01-29_183825.png
Affichages : 1467
Taille : 16,5 Ko


    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre éprouvé
    Homme Profil pro
    Fortune teller
    Inscrit en
    Octobre 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Fortune teller

    Informations forums :
    Inscription : Octobre 2007
    Messages : 110
    Par défaut Dépassement de capacité
    ça peut être dû au dépassement de la taille d'un Array ou variable tableau.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dépassement de capacité dans une base de données
    Par platon1 dans le forum Assembleur
    Réponses: 5
    Dernier message: 09/09/2011, 15h01
  2. recherche dans une cellule de tableau word
    Par jeantrucmuche dans le forum VBA Word
    Réponses: 1
    Dernier message: 01/08/2007, 17h52
  3. Faire défiler un texte dans une cellule de tableau
    Par Furius dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 01/12/2005, 17h06
  4. [MySQL] Degré de pertinence dans une recherche sql
    Par Invité(e) dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/11/2005, 09h59
  5. Problème de casse dans une recherche
    Par lipao17 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/07/2005, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo