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 :

Depassement de capacité (val())


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Depassement de capacité (val())
    Bonjour
    Voila j'essaye de faire un programme permettant (entre autre) de verifier pour chaque cellule qu'aucun chiffre ne soit "seul" cad qu'il y ait toujours une lettre collé avant ou apres. J'ai fait ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For i = 3 To n - 1
    j = 6
    c = Cells(i, j).value
    m = Len(c)
        For l = 1 To m
            d = Mid(c, l, 1)        
            If IsNumeric(d) = True Then
            e = Val(Mid(c, l))
                If c Like "* " & e & " *" = True Or c Like e & " *" = True Or c Like "* " & e = True Or c Like "* 0" & e = True Then
                Cells(i, j).Select
    (Le code n'est pas complet j'ai mis que le passage qui plante)
    Le probleme c'est quand j'arrive a la cellule contenant "ETG6E 1265" a ce moment la j'ai le message "erreur 6 depassement de capacité" (sur la ligne e = Val(Mid(c, l)) )
    Je pense que ca vient du fait qu'il interprete "6E 1265" comme "6^1265" ou quelque chose comme ca mais je n'ai aucune idée de comment regler ce probleme...
    Si vous avez une idée je bloque completement...
    Merci d'avance

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    sans données et le code complet...

    Si c'est le cas, tu peux simplement y rémedier par un if

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub tototototot()
    x = "6E    5"
    MsgBox (Val(x))
    End Sub
    Depassement capa..

    En effet si tu as un chiffre suivi d'un "E" ou "e" il met un exposant 10

    Donc val("6E 1265") = 6 x 10^1265 = 6 et 1265 zéros....

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    voici 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
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Private Sub verif_err_Click()
     
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Integer
    Dim m As Integer
    Dim n As Integer
    Dim c As String
    Dim d As String
    Dim e As String
     
    k = 1
    n = 2
    Do
    n = n + 1
    Loop Until Cells(n, 1) = ""
     
     
    For i = 3 To n - 1
    j = 6
     
    c = Cells(i, j).Value
     
        If UCase(c) Like UCase("*bat *") = True Or UCase(c) Like UCase("* etg *") = True Or UCase(c) Like UCase("*appt *") = True _
        Or UCase(c) Like UCase("* bis *") = True Or UCase(c) Like UCase("* ter *") = True Then
                Cells(i, j).Select
            With Selection.Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .Color = 255
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
                Rows(i & ":" & i).Select
                Selection.Copy
                Sheets("Feuil2").Activate
                Sheets("Feuil2").Rows(k & ":" & k).Select
                ActiveSheet.Paste
                k = k + 1
                Sheets("Feuil1").Activate
        End If
     
    m = Len(c)
        For l = 1 To m
            d = Mid(c, l, 1)
     
            If IsNumeric(d) = True Then
            e = Val(Mid(c, l))
                If c Like "* " & e & " *" = True Or c Like e & " *" = True Or c Like "* " & e = True Or c Like "* 0" & e = True Then
     
                Cells(i, j).Select
            With Selection.Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .Color = 255
                .TintAndShade = 0
                .PatternTintAndShade = 0
            End With
                Rows(i & ":" & i).Select
                Selection.Copy
                Sheets("Feuil2").Activate
                Sheets("Feuil2").Rows(k & ":" & k).Select
                ActiveSheet.Paste
                k = k + 1
                Sheets("Feuil1").Activate
                End If
            End If
        Next
    Next
     
    MsgBox ("Verification terminée")
     
    End Sub
    oui c'est bien ce qu'il me semblait !
    Comment je pourrait regler ca avec un if ?

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Je ne sais pas le but de ton programme mais tu dois traiter l'exception à cet endroit en virant le e par exemple ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If IsNumeric(d) = True Then
    If UCase(Mid(Mid(c, l), 2, 1)) = "E" Then

  5. #5
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    Voila j'essaye de faire un programme permettant (entre autre) de verifier pour chaque cellule qu'aucun chiffre ne soit "seul" cad qu'il y ait toujours une lettre collé avant ou apres
    C'est typiquement le genre de choses qui se traite très bien avec des expressions rationelles. Si tu ne connais pas, voici un tuto très bien. Tu pourras ainsi alléger et clarifier ton code.

    Sinon pour ton problème particulier sur le "e" tu peux faire un très moche mais néanmoins très efficace "replace" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = Val(Replace(Mid(c, l),"e","x",compare:=1))

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Le probleme c'est que je dois juste verifier ces cellules et pas les modifier...
    Mais la solution de EngueEngue est tres bien sur le principe je vais juste la modifier un peu pour etre sur d'avoir un chiffre apres le E (si c'est une lettre c'est un autre cas...)
    Quant aux expressions regulieres j'ai pas le temps de me plonger dedans ce soir mais merci pour le lien du tuto j'irais y jeter un oeil des que possible Merci beaucoup en tout cas ! Je vous tiens au courant au plus vite

  7. #7
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Pour info le Replace ne modifie pas ta chaine de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Test()
        a = "6E 588"
        v = Val(Replace(a, "e", "x", compare:=1))
        Debug.Print a, v
    End Sub

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    aaaaah ca change tout !
    J'essayerais tout ca demain alors ca sera toujours mieux que ce que j'ai fait...
    pour info :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        If UCase(Mid(Mid(c, l), 2, 1)) Like "E" Then
            If UCase(Mid(Mid(c, l), 3, 1)) Like "1" Or UCase(Mid(Mid(c, l), 3, 1)) Like "2" Or UCase(Mid(Mid(c, l), 3, 1)) Like "3" _
            Or UCase(Mid(Mid(c, l), 3, 1)) Like "4" Or UCase(Mid(Mid(c, l), 3, 1)) Like "5" Or UCase(Mid(Mid(c, l), 3, 1)) Like "6" _
            Or UCase(Mid(Mid(c, l), 3, 1)) Like "7" Or UCase(Mid(Mid(c, l), 3, 1)) Like "8" Or UCase(Mid(Mid(c, l), 3, 1)) Like "9" _
            Or UCase(Mid(Mid(c, l), 3, 1)) Like "0" _
            Or UCase(Mid(Mid(c, l), 3, 2)) Like " 1" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 2" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 3" _
            Or UCase(Mid(Mid(c, l), 3, 2)) Like " 4" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 5" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 6" _
            Or UCase(Mid(Mid(c, l), 3, 2)) Like " 7" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 8" Or UCase(Mid(Mid(c, l), 3, 2)) Like " 9" _
            Or UCase(Mid(Mid(c, l), 3, 2)) Like " 0" Then
    un peu dégueu mais ca marche...
    Merci beaucoup en tout cas !

    Je vais essayer ta solution demain qui m'a l'air plus efficace pour ce que je veux je vous dirais demain ce qu'il en est

  9. #9
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Un petit exemple avec les expressions rationnelles (pour le fun )
    La fonction renvoie vraie si la chaine
    - commence par un numérique suivi d'un ou plusieurs alphanumériques
    - contient un numérique entourés d'alphanumériques
    - finit par un numérique précédé d'un ou plusieurs alphanumériques
    Je ne sais pas si ça correspond exactement à ta demande, mais tu peux jouer à foison avec....

    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
    Function IsChaineOk(ByVal str As String) As Boolean
     
        Dim i As Integer
        Dim pattern As String
        Dim reg As VBScript_RegExp_55.regexp
     
        Set reg = New VBScript_RegExp_55.regexp
        reg.IgnoreCase = True
        reg.Global = True       'cherche toutes les occurences'
        reg.pattern = "^[0-9][A-Z]+|[A-Z]+[0-9][A-Z]+|[A-Z]+[0-9]$"
     
        IsChaineOk = reg.Test(str)
        Set reg = Nothing
     
    End Function
     
     
    Sub Test()
        Debug.Print IsChaineOk("6rr")   'vrai
        Debug.Print IsChaineOk("ff6rr") 'vrai
        Debug.Print IsChaineOk("ff6")   'vrai
        Debug.Print IsChaineOk("f665t") 'faux
        Debug.Print IsChaineOk("f6 t")  'faux
    End Sub

  10. #10
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut depassement de capacité
    Bonjour,

    Je ne pense pas que ce soit la ligne qui pose problème mais plus vraisemblablement K.

    Je ne sais quelle est ton intention mais tu recopies plusieurs fois en feuil2 une cellule donnée. ceci fait que si ton fichier est grand la capacité (nombre de lignes de la feuil2) peut être dépassée.

    En tout cas il ne bloque pas sur un terme genre 4 E 25, surtout si les cellules sont formatées en texte.

    ci joint ton fichier retravaillé. regarde si le résultat est celui attendu.

    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
    52
    53
    54
    55
     
    Private Sub verif() 'attention nom sub modifié  
     
    Dim i As Integer
    Dim j As Integer  'inutile puisque constant
    Dim k As Integer
    Dim l As Integer
    Dim m As Integer
    Dim p As Integer  'était n - modifié afin de ne pas cofondre avec colonne n
    Dim c As String
    Dim d As String
    Dim e As String
     
    k = 1
    'Range("n2").Select
    p = [n2].End(xlDown).Row
     
    For i = 3 To p - 1
        'j = 6
     
        c = Sheets("feuil1").Cells(i, 6).Value
     
        If UCase(c) Like UCase("*bat *") = True Or UCase(c) Like UCase("* etg *") = True Or UCase(c) Like UCase("*appt *") = True _
           Or UCase(c) Like UCase("* bis *") = True Or UCase(c) Like UCase("* ter *") = True Then
     
            With Cells(i, 6).Interior
                .Pattern = xlSolid
                .Color = 255
            End With
            Rows(i & ":" & i).Copy Sheets("Feuil2").Rows(k & ":" & k)
            k = k + 1
        End If
     
        m = Len(c)
        For l = 1 To m
            d = Mid(c, l, 1)
            If IsNumeric(d) = True Then
               e = Val(Mid(c, l))
               If c Like "* " & e & " *" = True Or c Like e & " *" = True Or c Like "* " & e = True Or c Like "* 0" & e = True Then
     
                  With Cells(i, 6).Interior
                    .Pattern = xlSolid
                    .Color = 255
                  End With
                  Rows(i & ":" & i).Copy Sheets("Feuil2").Rows(k & ":" & k)
                  k = k + 1
     
              End If
            End If
       Next
    Next
     
    MsgBox ("Verification terminée")
     
    End Sub
    Cordialement,

  11. #11
    Invité
    Invité(e)
    Par défaut Bonsoir,
    j'ai relevé quelques ineptie dans ton code, ne te culpabilise pas quand on apprend c'est souvent le cas. on apprend plus de ses erreurs.

    tu commence par scanner ton texte ce qui est une bonne chose, tu test si la valeur trouvée est un numérique très bien,tu récupéré la valeur du caractère hors on sait qu'il s'agit d'un numérique val pa besoin!

    ensuite tu pars dans un délire de like???
    deux chose l'une soit tu récupères les numérique soit les caractères.
    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
    Sub Test()
    Const t = "1234AZERTYUI56789"
    Dim Num
    Dim Stri
    Dim I
    Num = ""
    Stri = ""
    For I = 1 To Len(t)
       If IsNumeric(Mid(t, I, 1)) Then
            Num = Num & Mid(t, I, 1)
       Else
            Stri = Stri & Mid(t, I, 1)
       End If
    Next
    Debug.Print Num
    Debug.Print Stri
    End Sub

Discussions similaires

  1. [VBA-E]Depassement de capacité
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 16/05/2006, 16h13
  2. probleme de depassement de capacité
    Par el_quincho dans le forum Access
    Réponses: 3
    Dernier message: 19/04/2006, 14h38
  3. probleme de depassement de capacités
    Par el_quincho dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 11h02
  4. [VB6] Hex(Double) - depassement de capacite
    Par SErhio dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/05/2005, 18h09
  5. depassement de capacité
    Par jpg dans le forum ASP
    Réponses: 2
    Dernier message: 19/08/2004, 19h26

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