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 :

Indice hors de selection sur VBA ?


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Indice hors de selection sur VBA ?
    Novice en VBA je rencontre une erreur qui semblerait assez classique mais a laquelle je ne trouve pas de solution. Dans mon code, a chaque assignation de variable lorsque je compile, je me retrouve ac le message d erreur: "SUBSCRIPT OUT OF RANGE".

    Mon code est celui-ci:

    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
    '-----------------------------------------------------------------------------
    ' Keyboarding of the initial conditions
    '-----------------------------------------------------------------------------
     
    deltaz = L / NS
    deltat = TT / NT
     
    ' At time zero
    For z = 0 To NS
           C(z, 0) = C0
           temp(z, 0) = temp0
    Next z
     
    'At other time
     
    For t = 1 To TT
     
        '--------------------------------------------------------------------------    
    ' Initial assumptions for the space cycle
        '--------------------------------------------------------------------------    
        C(0, t) = 0.9999 * C(0, t - 1)      'initial assumption is that C at position 0 is slightly lower from the previous instant
        temp(0, t) = 1.001 * temp(0, t - 1) 'initial assumption is that T at position 0 is slightly higher from the previous instant
     
        '--------------------------------------------------------------------------    
    ' First boundary conditions
        '--------------------------------------------------------------------------    
        C(1, t) = C(0, t) + deltaz * KM * (Ke * C(0, t) - Cga) / D
        temp(1, t) = temp(0, t) - deltaz * kh * (tempa - temp(0, t)) / h - lambdav * KM * deltaz * (C(0, t) - Cga) / kh
     
     
        '--------------------------------------------------------------------------    
    ' Keyboarding of the recurring formulas
        '--------------------------------------------------------------------------    For z = 2 To NS
        C(z, t) = deltaz ^ 2 / (D * deltat) * [C(z-1,t)-C(z-1,t-1)] + D / D * [2 * C(z-1, t) - C(z-2, t)]  'D/D because here this quotient is a constant but not in the next case
        temp(z, t) = deltaz ^ 2 / alpha * [(temp(z-1,t)-temp(z-1, t-1))/deltat-M /cp] + 2 * temp(z - 1, t) - temp(z - 2, t)
        Next z
     
        '--------------------------------------------------------------------------    
    ' Verify second boundary conditions
        '--------------------------------------------------------------------------    
        VC = 0
        VT = 0
     
        If (C(NS, t) - C(NS - 1, t)) / C(NS, t) > ERROR Then
            VC = 1
            C(0, t) = 0.9999 * C(0, t)
            'and we establish a new value for C(o,t)
        End If
     
        If (temp(NS, t) - temp(NS - 1, t)) / temp(NS, t) > ERROR Then
            VT = 1
            temp(0, t) = 1.001 * temp(0, t - 1)
            'and we establish a new value for temp(0, t)
        End If
     
        If VC + VT = 0 Then
        Resume
        'Else: GoTo Line66
        End If
     
    Next t
     
    End Sub
    C est donc a chaque C=... ou temp=... que le debuggeur me dit que l indice n appartient pas a la selection. Je ne comprends pas le probleme. Si l'un de vous pouvait m'aider cela me serait extremement utile.

    D'autre part, dans ma derniere boucle If, la commande else GoTo Line66 n a pas l'air de marcher de cette facon. Quelqu'un connait il la synthaxe correcte?

    Merci d avance a tous

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Comment et ou sont déclaré les variables C et Temp?

    A noter que si la déclaration ne stipule pas le nombre de dimension, il faudra redimensionner la variable à chaque ajout de d'une dimension


    D'autre part, dans ma derniere boucle If, la commande else GoTo Line66 n a pas l'air de marcher de cette facon. Quelqu'un connait il la synthaxe correcte?
    Ou se trouve Line66, je ne le trouve pas dans ton code

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Tout d'abord merci de votre reponse. Je n'ai pas recopie la declaration de mes variables mais je les ai declarees de cette maniere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim C() As Double                'C - Concentration of water in the food in g water / g total (water + solid) = f(t,z), ze < z < L
    Dim temp() As Double             'temp - Temperature of the wet food sample = f(t,z), ze < z < L
    Il va donc falloir que jutilise la commande Redim?

    Line66 est le numero de la ligne correspondant a ma boucle sur la variable t de 1 a TT:

    Je voudrais que ma ligne de code Else: GoTo Line66 me renvoie a la ligne For t = 1 To TT en fait

    Merci

    Jai rajoute les 2 lignes de code suivantes pour dimensionner mes tableaux C et temp mais l erreur persiste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ReDim C(NS, NT)
    ReDim temp(NS, NT)

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Il va donc falloir que jutilise la commande Redim?
    oui, il va falloir utiliser redim (exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim c() As Double
    Dim i As Integer
     
    For i = 0 To 10
        ReDim Preserve c(i + 1)
        c(i) = i
    Next i

    Line66 est le numero de la ligne correspondant a ma boucle sur la variable t de 1 a TT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Line66 : 
    For t = 1 To TT

  5. #5
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Tu as initialisé tes 2 tableaux jusqu'à NS puis NT sur la seconde dimension et tu les parcours jusqu'à NS puis TT.
    Citation Envoyé par dexterchief Voir le message
    Jai ReDim C(NS, NT)
    ReDim temp(NS, NT)
    Autre chose : les indices des tableaux commencent à 1 en VBA.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Jai utilise Option Base0 en en tete de mon code justement
    Jai egalement corrige le NT au lieu du TT et c est bon l erreur a disparu!

    Apres de multiples autres erreurs, je rebute sur une:

    Jai une incompatibilite de type a la ligne de calcul de ma concentration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C(z, t) = deltaz ^ 2 / (D * deltat) * [C(z-1,t)-C(z-1,t-1)] + D / D * [2 * C(z-1, t) - C(z-2, t)]  'D/D because here this quotient is a constant but not in the next case
    Mes declarations de variables sont celles ci:

    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
    Dim t As Double                  't - time (as a variable and as a discrete parameter)
    Dim z As Double                  'z - distance to the microwave source (as a variable and as a discrete parameter)
    Dim zf As Double                 'zf - distance of the evaporation front to the microwave source
    Dim C() As Double                'C - Concentration of water in the food in g water / g total (water + solid) = f(t,z), ze < z < L
    Const C0 As Double = 0.6         'C0 - Initial concentration of water in the food (constant)
    Const temp0 As Double = 0.6      'temp0 - Initial temperature of food (constant)
    Dim deltat As Double             'deltat - Increment of time considered
    Const D As Single = 2            'D – Diffusivity of liquid water in the food, constant in the drying in the ambiant air
    Dim deltaz As Double             'deltaz - Increment of space considered
    Dim temp() As Double             'temp - Temperature of the wet food sample = f(t,z), ze < z < L
    Const cp As Single = 100         'cp - specific heat of the food, constant
    Const alpha As Single = 1        'alpha- thermal diffusivity of the food, constant
    Const M As Double = 0            'M - Energy generated by the microwaves in a given position in the food per kg (not per m3),
                                     'M=0 in this case
    Const L As Single = 0.05         'L - Length of the food sample, constant
    Const TT As Single = 600         'TT - length of time modelled
    Const tempa As Single = 293      'tempa - Temperature of the surrounding air, constant
    Const NS As Single = 1000        'Ns - Number of spaces considered
    Const NT As Single = 1000        'Ns - Number of time considered
    Const ERROR As Single = 0.0001   'ERROR - Percentage of error acceptable
    Const KM As Single = 0.02        'KM - Convective mass transfer coefficient at the food surface, constant
    Const Ke As Double = 0.1         'Ke - Equilibrium constant between the concentration of liquid water in food in contact
                                     'with air and the water vapour concentration in that air (Cg = Ke C at equilibrium), constant
    Const Cga As Double = 0.6        'Cga - concentration of water vapour in the surrounding air (corresponding to Ha), constant?
    Const kh As Double = 0.01        'kh - Thermal/heat conductivity of the food, constant
    Dim h As Double                  'h -
    Const lambdav As Double = 100    'lambdav - latent heat of water, constant
    Dim VC As Boolean, VT As Boolean 'VC,VT - Boolean to test the first assumptions
    Jai d'abord pense que cela pouvait venir de la variable D qui etait declaree en Single mais cela ne change rien.
    Je ne dois pas declarer ma variable C() en double? Je ne comprends pas en quoi j essaie de convertir la variable C() en un autre type?

    Merci de votre aide precieuse

  7. #7
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Quelles sont les valeurs de tes nombres?
    C(z, t) = deltaz ^ 2 / (D * deltat) * [C(z-1,t)-C(z-1,t-1)] + D / D * [2 * C(z-1, t) - C(z-2, t)]
    correspond à "double^2" / "Double" * "Double" + "Constante" * "Double"
    Est-ce que cela peut poser un problème ajouter des Doubles au carré => Doubles et des doubles?
    Peut-être en revanche, s'il y a un dépassement de capacité pour les valeurs auquel cas les multiplications et divisions entre elles de ces nombres peuvent donner un résultat erroné.

  8. #8
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Pourquoi utiliser Evaluate dans ta formule ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C(z, t) = deltaz ^ 2 / (D * deltat) * [C(z-1,t)-C(z-1,t-1)] + D / D * [2 * C(z-1, t) - C(z-2, t)]
    Ne serait-ce pas plutôt comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C = deltaz ^ 2 / (D * deltat) * (C(z - 1, t) - C(z - 1, t - 1)) + D / D * (2 * C(z - 1, t) - C(z - 2, t))
    Hervé.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Effectivement c'etait l usage de la fonction evaluate qui posait probleme, avec les parentheses tout va bien!

    Merci Herve

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Salut.

    Citation Envoyé par carden752 Voir le message
    ...
    Autre chose : les indices des tableaux commencent à 1 en VBA.
    Attention, ce que tu dis n'est pas exact.

    Par défaut, le premier indice d'un tableau est 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Dim Tableau(2) ' revient à coder: Dim Tableau(0 to 2)
      Tableau(0) = "Martine"
      Tableau(1) = "Pierre"
      Tableau(2) = "Manon"

    Pour que l'indice commence à 1, il faut le spécifier explicitement, soit lors de la déclaration du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Dim Tableau(1 to 3)
      Tableau(1) = "Martine"
      Tableau(2) = "Pierre"
      Tableau(3) = "Manon"
    soit par une option en début de module (avant toute procédure ou fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Base 1
     
    Sub test()
      Dim Tableau(3)
      Tableau(1) = "Martine"
      Tableau(2) = "Pierre"
      Tableau(3) = "Manon"
     
    End Sub
    Dans les tableaux à une dimension, la valeur entre parenthèse détermine l'indice le plus élevé du tableau, donc avec
    ou en ne précisant rien
    crée un tableau permettant l'entrée de 3 valeurs (0 à 2), alors qu'avec
    crée un tableau permettant l'entrée de 2 valeurs (1 à 2).

    Par contre, un tableau créé sur base d'une plage de cellules commence à 1 (même avec option base 0). Ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Dim tableau
     
      tableau = Range("A1:A3")
    crée un tableau dont les indices vont de 1 à 3.


    Voir le tuto de Ormonth et celui de SilkyRoad pour plus de détails.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour tout le monde, je n'ai plus d'erreur dans mon programme mais il me manque le nom de la fonction qui me permettrait de faire en sorte que VBA retranscrive les valeurs des tableaux de mes fonctions C et Temp dans le classeur excel.

    Quelqu un pourrait il me donner le nom de la fonction que je recherche, je ne la trouve pas.

    Merci

    Je voudrais en fait exporter mon tableau de valeurs C a 2 dimensions z et t dans le classeur excel.

    Je n ai pas trouve de fonction qui semble faire cela... Est que avec une instruction de ce genre la, je suis sur la bonne voie ou pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For y = LBound(C) To UBound(C)
       Range("A" & y).Formula = C(y)
    Next y
    Deja le probleme est que cette instruction est faite pour un vecteur, comment la transformer pour l adapter a un tableau a 2 dimensions?

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 905
    Points
    55 905
    Billets dans le blog
    131
    Par défaut
    Tu dois affecter la variable array à une plage de mêmes dimensions.

    Si ton tableau commence à l'indice 1, tu utiliseras le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(1, 1), Cells(UBound(Tableau, 1), UBound(Tableau, 2))) = Tableau
    Sinon, tu dois ajouter 1 aux valeurs renvoyées par Ubound puisque cette fonction renvoie l'indice le plus élevé du tableau (et non le nombre d'éléments de la dimension), et tu utiliseras donc le code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(1, 1), Cells(UBound(Tableau, 1) + 1, UBound(Tableau, 2) + 1)) = Tableau
    L'idée est énoncée au point VIII-B-2-c. En ligne optimisé du tutoriel de Ormonth.

  13. #13
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonsoir,

    Je n'ai pas pris la peine de lire en détail toute la discussion, mais quand tu veux coller un tableau dans une feuille tu peux faire comme ça (c'est un exemple très simpliste mais ça peut permettre de comprendre). Attention à faire correspondre la plage avec les dimensions du tableau :
    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
     
    Sub xx()
     
        Dim Tbl(1 To 2, 1 To 10)
     
        Tbl(1, 1) = 1
        Tbl(1, 2) = 2
        Tbl(1, 3) = 3
        Tbl(1, 4) = 4
        Tbl(1, 5) = 5
        Tbl(1, 6) = 6
        Tbl(1, 7) = 7
        Tbl(1, 8) = 8
        Tbl(1, 9) = 9
        Tbl(1, 10) = 10
        Tbl(2, 1) = 10
        Tbl(2, 2) = 20
        Tbl(2, 3) = 30
        Tbl(2, 4) = 40
        Tbl(2, 5) = 50
        Tbl(2, 6) = 60
        Tbl(2, 7) = 70
        Tbl(2, 8) = 80
        Tbl(2, 9) = 90
        Tbl(2, 10) = 100
     
        Range(Cells(1, 1), Cells(UBound(Tbl, 1), UBound(Tbl, 2))) = Tbl
     
    End Sub
    Hervé.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/12/2014, 15h39
  2. [AC-2007] indice selection sur création etat
    Par xav285 dans le forum IHM
    Réponses: 5
    Dernier message: 05/03/2011, 14h18
  3. executer des requetes de selection sur access à partie de VBA
    Par benpinta dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2007, 14h04
  4. requête de selection sur VBA?
    Par jessy212 dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 28/08/2006, 10h58
  5. Hors série PCTEAM sur Direct 3D
    Par Shakram dans le forum DirectX
    Réponses: 1
    Dernier message: 12/10/2002, 16h34

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