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 :

Problème avec une macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Problème avec une macro
    Bonjour à tous,

    j'ai un problème avec la macro que j'essaie de faire

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
    Sub Notation()
     
    Dim min As Integer, max As Integer
    Dim PE(1), EE(0), SE(1)
    Dim PA(0), EA(1), SA(1)
    Dim i As Integer
     
    Worksheets("Feuil1").Activate
     
    min = 2
    max = 9
     
    EE(0) = "B"
    PE(0) = "C"
    PE(1) = "d"
    SE(0) = "E"
     
    SA(0) = "f"
    EA(0) = "g"
    PA(0) = "h"
    EA(1) = "i"
     
    SE(1) = "j"
    SA(1) = "j"
     
    'Debug.Print Note(i, PE())
     
    For i = min To max
        If Range("a" & i) = "Eau" Then
            Range("k" & i).Value = Note(i, PE())
            Range("l" & i).Value = Note(i, EE())
            Range("m" & i).Value = Note(i, SE())
        ElseIf Cells(i, "a") = "Ass" Then
            Range("k" & i).Value = Note(i, PA())
            Range("l" & i).Value = Note(i, EA())
            Range("m" & i).Value = Note(i, SA())
    Next
     
    End Sub
    ____________________________________________________
    Function Note(lg As Integer, ParamArray Rng() As Variant) As Long
     
    Dim i As Integer, j As Integer, n As Integer
    Dim alpha, pi
    Dim A, Am
     
    'calcul du nombre de cellules
    n = UBound(Rng) + 1
     
    'calcul de l'angle
    pi = 4 * Atn(1)
    alpha = 2 * pi / n
     
    Debug.Print n
     
    'définition de ma matrice M
    Dim M()
    ReDim M(n - 1, n - 1)
     
    For i = 0 To n - 1
        For j = 0 To n - 1
            M(i, j) = 0
        Next
    Next
     
    M(n - 1, 0) = 1
     
    For i = 0 To n - 2
        M(i, i + 1) = 1
    Next
     
    'definition du vecteur X
    Dim X()
    ReDim X(n - 1, 0)
     
    For i = 0 To n - 1
        X(i, 0) = ActiveSheet.Cells(lg, Rng(i).Value)
    Next
     
    'création de la tranposé de X
    Dim TX()
    Call Tvect(X, TX)
     
    'quelques petits calculs
    Dim p1(), p2()
     
    Call PMAT(M(), X(), p1())
    Call PMAT(TX(), p1(), p2())
     
    A = 1 / 2 * Sin(alpha) * p2(0, 0)
    Am = 1 / 2 * Sin(alpha) * 100 ^ 2 * n
     
    Note = A / Am
     
    End Function
    _______________________________________
    Sub PMAT(A(), B(), C())
     
    'calcule le produit des matrices A*B et le met dans la matrice C
     
    Dim i As Integer, j As Integer, k As Integer
    Dim n As Integer, M As Integer, p As Integer
     
    n = UBound(A, 2)
    M = UBound(A, 1)
    p = UBound(B, 2)
     
    ReDim C(M, p)
     
    For i = 0 To M
        For j = 0 To p
            For k = 0 To n
                C(i, j) = C(i, j) + A(i, k) * B(k, j)
            Next
        Next
    Next
     
    End Sub
    _________________________________________
    Sub Tvect(X(), TX())
     
    'calcule le vecteur transposé de X
     
    Dim i As Integer, n As Integer
     
    n = UBound(X, 1)
     
    ReDim TX(0, n)
     
    For i = 0 To n
        TX(0, i) = X(i, 0)
    Next
     
    End Sub
    voici ce que çà me donne:

    "Erreur de compilation : variable ou procédure attendue, et non un module"
    en la première occurence de le fonction "Note" est surlignée dans la procédure "Notation"
    est-ce que quelqu'un voit le problème ????

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 73
    Points
    73
    Par défaut
    bonjour
    a premiere vu et sans tester
    il me semble qu'il manque un end if en fin de sub Notation !


    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
    Sub Notation()
     
    Dim min As Integer, max As Integer
    Dim PE(1), EE(0), SE(1)
    Dim PA(0), EA(1), SA(1)
    Dim i As Integer
     
    Worksheets("Feuil1").Activate
     
    min = 2
    max = 9
     
    EE(0) = "B"
    PE(0) = "C"
    PE(1) = "d"
    SE(0) = "E"
     
    SA(0) = "f"
    EA(0) = "g"
    PA(0) = "h"
    EA(1) = "i"
     
    SE(1) = "j"
    SA(1) = "j"
     
    'Debug.Print Note(i, PE())
     
    For i = min To max
        If Range("a" & i) = "Eau" Then
            Range("k" & i).Value = Note(i, PE())
            Range("l" & i).Value = Note(i, EE())
            Range("m" & i).Value = Note(i, SE())
        ElseIf Cells(i, "a") = "Ass" Then
            Range("k" & i).Value = Note(i, PA())
            Range("l" & i).Value = Note(i, EA())
            Range("m" & i).Value = Note(i, SA())
         end if
    Next
     
    End Sub
    cordialement
    GERARD

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    oupps j'avais pas vu

    mais bon çà ne change pas mon problème, çà buggait avant

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour,

    Moi je suis étonné par ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ElseIf Cells(i, "a") = "Ass"
    qu'est donc censé faire Cells(i,"a") ???

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    ce que je veux faire c'est tester si le contenu de la cellule Ai (colonne A et ligne i) vaut "Ass" (c'est du texte)

  6. #6
    Membre averti Avatar de mordrhim
    Inscrit en
    Avril 2007
    Messages
    270
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 270
    Points : 314
    Points
    314
    Par défaut
    dans ce cas la il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif Range("A" & i) = "***"

  7. #7
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut
    Citation Envoyé par mordrhim Voir le message
    dans ce cas la il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif Range("A" & i) = "***"
    ou


  8. #8
    Membre régulier
    Homme Profil pro
    Contrôleur des Systèmes d'Information
    Inscrit en
    Mars 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Contrôleur des Systèmes d'Information
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2007
    Messages : 72
    Points : 105
    Points
    105
    Par défaut
    A mon avis, c'est plutôt : Cells(IndexLigne, IndexColonne), où :
    IndexLigne et IndexColonne sont des entiers.
    Aussi il faut remplacer "a" par 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ElseIf Cells(i, 1) = "Ass"
    Cordialement

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 73
    Points
    73
    Par défaut
    je te donne ca comme ca
    sans valeurs pour tester j'ai un truc marant
    un message d'erreur qui disparait si j'enleve la ligne vide apres end sub de la sub notation

    cdt
    GERARD

  10. #10
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Hormis les erreurs signalées (End If et Cells(i, 1) ), le code compile et s'exécute.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    j'ai modifié le coup du cells(...) et je l'ai remplacé en range(..). et je me suis rendu compte que c'était un oubli parce que j'avais bien mis le reste

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 55
    Points : 73
    Points
    73
    Par défaut
    suite
    j'ai teste avec des valeurs

    ca semble marcher si on enleve les lignes vides apres chaque end function et end sub ??????
    cdt
    GERARD

  13. #13
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Si tu as copié coller le code du 1er post , c'est normal.
    Nyck0las a mis des _______________________________ pour séparer les fonctions.


  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Lou Pitchoun Voir le message
    Hormis les erreurs signalées (End If et Cells(i, 1) ), le code compile et s'exécute.


    ben moi çà compile pas du tout et pourtant on doit avoir la même chose

  15. #15
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    je suis parti de ton code du 1er message. J'y ai apporté les corrections.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    Sub Notation()
     
    Dim min As Integer, max As Integer
    Dim PE(1), EE(0), SE(1)
    Dim PA(0), EA(1), SA(1)
    Dim i As Integer
     
    Worksheets("Feuil1").Activate
     
    min = 2
    max = 9
     
    EE(0) = "B"
    PE(0) = "C"
    PE(1) = "d"
    SE(0) = "E"
     
    SA(0) = "f"
    EA(0) = "g"
    PA(0) = "h"
    EA(1) = "i"
     
    SE(1) = "j"
    SA(1) = "j"
     
    'Debug.Print Note(i, PE())
     
    For i = min To max
        If Range("a" & i) = "Eau" Then
            Range("k" & i).Value = Note(i, PE())
            Range("l" & i).Value = Note(i, EE())
            Range("m" & i).Value = Note(i, SE())
        ElseIf Cells(i, 1) = "Ass" Then
            Range("k" & i).Value = Note(i, PA())
            Range("l" & i).Value = Note(i, EA())
            Range("m" & i).Value = Note(i, SA())
        End If
    Next
     
    End Sub
     
    Function Note(lg As Integer, ParamArray Rng() As Variant) As Long
     
    Dim i As Integer, j As Integer, n As Integer
    Dim alpha, pi
    Dim A, Am
     
    'calcul du nombre de cellules
    n = UBound(Rng) + 1
     
    'calcul de l'angle
    pi = 4 * Atn(1)
    alpha = 2 * pi / n
     
    Debug.Print n
     
    'définition de ma matrice M
    Dim M()
    ReDim M(n - 1, n - 1)
     
    For i = 0 To n - 1
        For j = 0 To n - 1
            M(i, j) = 0
        Next
    Next
     
    M(n - 1, 0) = 1
     
    For i = 0 To n - 2
        M(i, i + 1) = 1
    Next
     
    'definition du vecteur X
    Dim X()
    ReDim X(n - 1, 0)
     
    For i = 0 To n - 1
        X(i, 0) = ActiveSheet.Cells(lg, Rng(i).Value)
    Next
     
    'création de la tranposé de X
    Dim TX()
    Call Tvect(X, TX)
     
    'quelques petits calculs
    Dim p1(), p2()
     
    Call PMAT(M(), X(), p1())
    Call PMAT(TX(), p1(), p2())
     
    A = 1 / 2 * Sin(alpha) * p2(0, 0)
    Am = 1 / 2 * Sin(alpha) * 100 ^ 2 * n
     
    Note = A / Am
     
    End Function
     
    Sub PMAT(A(), B(), C())
     
    'calcule le produit des matrices A*B et le met dans la matrice C
     
    Dim i As Integer, j As Integer, k As Integer
    Dim n As Integer, M As Integer, p As Integer
     
    n = UBound(A, 2)
    M = UBound(A, 1)
    p = UBound(B, 2)
     
    ReDim C(M, p)
     
    For i = 0 To M
        For j = 0 To p
            For k = 0 To n
                C(i, j) = C(i, j) + A(i, k) * B(k, j)
            Next
        Next
    Next
     
    End Sub
     
    Sub Tvect(X(), TX())
     
    'calcule le vecteur transposé de X
     
    Dim i As Integer, n As Integer
     
    n = UBound(X, 1)
     
    ReDim TX(0, n)
     
    For i = 0 To n
        TX(0, i) = X(i, 0)
    Next
     
    End Sub

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    j'ai modifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To n - 1
        X(i, 0) = ActiveSheet.Cells(lg, Rng(i).Value)
    Next

    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 0 To n - 1
        X(i, 0) = ActiveSheet.Cells(lg, Rng(i)).Value
    Next
    et çà compile !!

    mais par contre j'ai l'impression que le résultat est faux

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    je sais pourquoi j'avais un résultat faux, en fait il faut différencier les cas n=1 et n=2

    par contre il m'est encore apparu un autre problème alors que je testais ce petit prog sur une plus grande échelle et davantage de données.
    En fait je travaille sur des données chiffrées mais il peut arriver que certaines cellules contiennent "-", ce qui signifie qu'il ny' a pas de résultat. El là çà coince dans le programme au niveau de la multiplication des matrices

    la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C(i, j) = C(i, j) + A(i, k) * B(k, j)
    est surlignée et le message d'erreur est:
    "erreur d'exécution 13 : incompatibilité de type"

    what can I do ??

  18. #18
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    1. mettre les balises code : ça permettra aux modos de gagner du temps
    2. tester la valeur de la cellule.
      Si la cellule <> "-" alors calcul fin si



  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2007
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    existe-t-il un test pour savoir si un élément n'est pas un nombre ??

    car en fait, le contenu de ma cellule peut etre :
    - un nombre
    - un caractète "-"
    - un texte "SO"
    - vide
    - #valeur

  20. #20
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Tu as la fonction IsNumeric

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If IsNumeric(variable) Then
            MsgBox "numérique"
            Else
                MsgBox "not numérique"
        End If

Discussions similaires

  1. [XL-2003] problème avec une macro décimale
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 25/11/2010, 10h34
  2. [XL-2007] problème avec une macro TCD
    Par wsanchez dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/06/2009, 21h05
  3. problème avec une macro
    Par jeanjack dans le forum Débuter
    Réponses: 2
    Dernier message: 21/04/2009, 09h32
  4. Problème avec une macro impression
    Par Border_xls dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/11/2007, 15h18
  5. Problème avec une macro faisant apel à un tableau Excell
    Par valouche dans le forum Macros et VBA Excel
    Réponses: 52
    Dernier message: 19/06/2007, 12h38

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