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 16/08/2011, 17h50   #1
Invité de passage
 
Homme
Inscription : août 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 8
Points : 2
Points : 2
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 :
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
dexterchief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 17h58   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 885
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 885
Points : 7 151
Points : 7 151
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


Citation:
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
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 18h07   #3
Invité de passage
 
Homme
Inscription : août 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 8
Points : 2
Points : 2
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 :
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 :
1
2
ReDim C(NS, NT)
ReDim temp(NS, NT)
dexterchief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 18h21   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 885
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 885
Points : 7 151
Points : 7 151
Citation:
Il va donc falloir que jutilise la commande Redim?
oui, il va falloir utiliser redim (exemple)
Code :
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

Citation:
Line66 est le numero de la ligne correspondant a ma boucle sur la variable t de 1 a TT:
Code :
1
2
Line66 : 
For t = 1 To TT
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 18h27   #5
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
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.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 18h44   #6
Invité de passage
 
Homme
Inscription : août 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 8
Points : 2
Points : 2
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 :
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 :
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
dexterchief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 19h26   #7
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 984
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 984
Points : 1 592
Points : 1 592
Envoyer un message via MSN à carden752
Bonjour,

Quelles sont les valeurs de tes nombres?
Citation:
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é.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 07h35   #8
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,

Pourquoi utiliser Evaluate dans ta formule ?
Code :
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 :
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é.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 13h49   #9
Invité de passage
 
Homme
Inscription : août 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 8
Points : 2
Points : 2
Bonjour,

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

Merci Herve
dexterchief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 20h03   #10
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
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 :
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 :
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 :
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 :
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.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/08/2011, 16h43   #11
Invité de passage
 
Homme
Inscription : août 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 8
Points : 2
Points : 2
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 :
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?
dexterchief est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 20h37   #12
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
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 :
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 :
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.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 20h38   #13
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
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 :
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é.
Theze 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 06h42.


 
 
 
 
Partenaires

Hébergement Web