Problème avec un "call"

Résolu
pifranl Messages postés 9 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 avril 2007 - 1 avril 2007 à 11:37
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 1 avril 2007 à 13:43
Bonjour,


Je sollicite votre aide car j'ai un problème que je n'arrive pas du tout à comprendre.
J'ai un programme général dans lequel je voudrais récuperer les resultats RDd et Deltad,(voir ci-dessous)
j'utilise donc un sous programme, c'est a dire que je vais chercher avec la fonction call l'expression
de RDd et Deltad que je mets respectivement dans A et B (A et B étant déclarés en String). J'aimerai pouvoir
ensuite utiliser Aet B dans mon programme général mais VB m'indique un problème avec les Byref et
je ne comprends pas pourquoi. Pouvez-vous m'aider.




'Programme général
Dim A, B As String
.............
Call dynamique(A,B)
MsgBox("A=" & A)


 


'Module de calcul en dynamique
Sub dynamique(ByVal RDd As String, ByRef Deltad As String)
.......
'après de nombreux calculs,je mets dans RDd et Deltad ceci:
RDd= RD(1,1) & "+" & RD(2,1)
Deltad=Delta(1,1)+Delta(2,1)


En fait j'aimerai afficher avec le msgbox l'expression de RDd
Ai-je fais une erreur ?


Merci.

8 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
1 avril 2007 à 13:32
Pas mieux

resultante ne peut pas etre passer par référence car son type ne correspond pas au type attendu par la fonction dynamique.

Attention aux déclarations de variables en VB6, c'est un vieux pervert sur ce point.
resultante doit etre explicitement déclaré comme string comme le dit Violent ken

Le mieux pour eviter ce genre d'erreur est de ne mettre qu'une seule déclaration par ligne, même si ça devient très vite très lourd comme code.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
1 avril 2007 à 13:38
Violent Ken
"Pas mieux
resultante ne peut pas etre passer par référence car son type ne correspond pas au type attendu par la fonction dynamique."
 ==> Bah oui, c'est pour çà que je conseille de changer la déclaration des variables... et ensuite çà marche sans problèmes.

DONC voilà le code correct (bien sur faudra changer le path du fichier *.xls) :

Private Sub form_load()
Dim resultante As String, moment As String
Call dynamique(resultante, moment)
MsgBox (resultante)
End Sub<hr />

'Module de calcul en dynamique
Sub dynamique(ByRef RDd As String, ByRef Deltad As String)
Dim m, Inertie(3, 3), i, j As Integer
Dim Delta(3, 1) As String
Dim a1(3), a2(3), a3(3) As String
Dim AG(3, 1), VAR(3, 1), VGSR(3, 1), Sigma(3, 1), VASR(3, 1), tor_cinema(3, 2), c_in(3, 1), RD(3, 1) As String

Dim sheet_1 As Object
Dim exldoc_1 As Object
Dim exlapp_1 As Object

Set exlapp_1 = CreateObject("excel.application")
   Set exldoc_1 = exlapp_1.workbooks.Open("c:\test.xls")
   Set sheet_1 = exlapp_1.ActiveWorkbook.ActiveSheet

'Mise en mémoire des données cinématiques,cinétiques et dynamiques

m = sheet_1.Application.ActiveSheet.cells(5, 10).Value

For i = 1 To 3
tor_cinema(i, 2) = sheet_1.Application.ActiveSheet.cells(i + 5, 3).Value
tor_cinema(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 5, 6).Value
VGSR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 23, 3).Value
VAR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 18, 6).Value
Next i

'Mise en mémoire de la matrice d'inertie

For j = 1 To 2
 For i = 1 To 3
 Inertie(i, j) = sheet_1.Application.ActiveSheet.cells(i + 11, j + 1).Value
 Next i
Next j
   
'Mise en mémoire du vecteur AG et VASR

For i = 1 To 3
AG(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 10, 6).Value
Next i
For i = 1 To 3
VASR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 18, 3).Value
Next i
   
'Torseur cinétique

For i = 1 To 3

If IsNumeric(tor_cinema(1, 1)) Then
a1(i) = Inertie(i, 1) * Val(tor_cinema(1, 1))
Else
a1(i) = Inertie(i, 1) & "*" & Val(tor_cinema(1, 1))
End If
If IsNumeric(tor_cinema(2, 1)) Then
a2(i) = Inertie(i, 2) * Val(tor_cinema(2, 1))
Else
a2(i) = Inertie(i, 2) & "*" & Val(tor_cinema(2, 1))
End If
If IsNumeric(tor_cinema(1, 1)) Then
a3(i) = Inertie(i, 3) * Val(tor_cinema(3, 1))
Else
a3(i) = Inertie(i, 3) & "*" & Val(tor_cinema(3, 1))
End If

'c_in(i, 1) = Inertie(i, 1) * tor_cinema(1, 1) + Inertie(i, 2) * tor_cinema(2, 1) + Inertie(i, 3) * tor_cinema(3, 1)

c_in(i, 1) = Val(a1(i)) & "+" & Val(a2(i)) & "+" & Val(a3(i))

Next i

Sigma(1, 1) = "(" & Val(m) & "*((" & AG(2, 1) & "*" & VASR(3, 1) & ") - (" & AG(3, 1) & "*" & VASR(2, 1) & ") + " & c_in(1, 1)
Sigma(2, 1) = "(" & Val(m) & "*((" & AG(3, 1) & "*" & VASR(1, 1) & ") - (" & AG(1, 1) & "*" & VASR(3, 1) & ") + " & c_in(2, 1)
Sigma(3, 1) = "(" & Val(m) & "*((" & AG(1, 1) & "*" & VASR(2, 1) & ") - (" & AG(2, 1) & "*" & VASR(1, 1) & ") + " & c_in(3, 1)

'torseur dynamique

For i = 1 To 3
If IsNumeric(tor_cinema(i, 2)) Then
RD(i, 1) = "(d/dt)*[" & Val(m) * Val(tor_cinema(i, 2)) & "]"
Else
RD(i, 1) = "(d/dt)*[" & Val(m) & "*" & tor_cinema(i, 2) & "]"
End If
Next i

Delta(1, 1) = "d/dt[" & Sigma(1, 1) & "] + (" & Val(m) & "*" & VAR(2, 1) & "*" & VGSR(3, 1) & ") - (" & VAR(3, 1) & "*" & VGSR(2, 1) & ")"
Delta(2, 1) = "d/dt[" & Sigma(2, 1) & "] + (" & Val(m) & "*" & VAR(3, 1) & "*" & VGSR(1, 1) & ") - (" & VAR(1, 1) & "*" & VGSR(3, 1) & ")"
Delta(3, 1) = "d/dt[" & Sigma(3, 1) & "] + (" & Val(m) & "*" & VAR(1, 1) & "*" & VGSR(2, 1) & ") - (" & VAR(2, 1) & "*" & VGSR(1, 1) & ")"
Set exlapp_1 = Nothing
Set exldoc_1 = Nothing
Set sheet_1 = Nothing
RDd = RD(1, 1) & "!" & RD(2, 1) & "@" & RD(3, 1)
Deltad = Delta(1, 1) & "!" & Delta(2, 1) & "@" & Delta(3, 1)
End Sub<hr />

, ----
By Renfield

@+

Hex Editor VB
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
1 avril 2007 à 12:00
As-tu essayer avec ceci ???

Sub dynamique(ByRef RDd As String, ByRef Deltad As String)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
1 avril 2007 à 12:02
Violent Ken
Salut, en VB6:

Option Explicit

Public Sub Dynamique(ByRef RDd As String, ByRef Deltad As String)
   RDd = "RDd"
   Deltad = "Deltad"
End Sub<hr />
Private Sub Form_Load()
Dim A As String
Dim B As String
   Call Dynamique(A, B)
   MsgBox A, vbInformation, B
End Sub , ----
By Renfield

@+
Hex Editor VB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pifranl Messages postés 9 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 avril 2007
1 avril 2007 à 12:15
Bon, j'ai essayé les deux solutions et j'ai toujours le même problème. En fait, pour éviter de me lancer dans des explications trop floues, voila plutot la partie de mon programme qui ne fonctionne pas :
(j'espère que vous aurez le courage de jeter un coup d'oeil)

sub...
Dim resultante, moment as string
Call dynamique(resultante, moment)
MsgBox (resultante)
End Sub


'Module de calcul en dynamique
Sub dynamique(ByRef RDd As String, ByRef Deltad As String)
Dim m, Inertie(3, 3), i, j As Integer
Dim Delta(3, 1) As String
Dim a1(3), a2(3), a3(3) As String
Dim AG(3, 1), VAR(3, 1), VGSR(3, 1), Sigma(3, 1), VASR(3, 1), tor_cinema(3, 2), c_in(3, 1), RD(3, 1) As String


Dim sheet_1 As Object
Dim exldoc_1 As Object
Dim exlapp_1 As Object


Set exlapp_1 = CreateObject("excel.application")
    Set exldoc_1 = exlapp_1.workbooks.Open("D:\Pierre-François\ecole\ENSAM\Projet_Informatique\TP fin de seance\Programme\excel\dynamique")
    Set sheet_1 = exlapp_1.ActiveWorkbook.ActiveSheet


'Mise en mémoire des données cinématiques,cinétiques et dynamiques


m = sheet_1.Application.ActiveSheet.cells(5, 10).Value


For i = 1 To 3
tor_cinema(i, 2) = sheet_1.Application.ActiveSheet.cells(i + 5, 3).Value
tor_cinema(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 5, 6).Value
VGSR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 23, 3).Value
VAR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 18, 6).Value
Next i


'Mise en mémoire de la matrice d'inertie


For j = 1 To 2
  For i = 1 To 3
  Inertie(i, j) = sheet_1.Application.ActiveSheet.cells(i + 11, j + 1).Value
  Next i
Next j
   
'Mise en mémoire du vecteur AG et VASR


For i = 1 To 3
AG(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 10, 6).Value
Next i
For i = 1 To 3
VASR(i, 1) = sheet_1.Application.ActiveSheet.cells(i + 18, 3).Value
Next i
   
'Torseur cinétique


For i = 1 To 3


If IsNumeric(tor_cinema(1, 1)) Then
a1(i) = Inertie(i, 1) * Val(tor_cinema(1, 1))
Else
a1(i) = Inertie(i, 1) & "*" & Val(tor_cinema(1, 1))
End If
If IsNumeric(tor_cinema(2, 1)) Then
a2(i) = Inertie(i, 2) * Val(tor_cinema(2, 1))
Else
a2(i) = Inertie(i, 2) & "*" & Val(tor_cinema(2, 1))
End If
If IsNumeric(tor_cinema(1, 1)) Then
a3(i) = Inertie(i, 3) * Val(tor_cinema(3, 1))
Else
a3(i) = Inertie(i, 3) & "*" & Val(tor_cinema(3, 1))
End If


'c_in(i, 1) = Inertie(i, 1) * tor_cinema(1, 1) + Inertie(i, 2) * tor_cinema(2, 1) + Inertie(i, 3) * tor_cinema(3, 1)


c_in(i, 1) = Val(a1(i)) & "+" & Val(a2(i)) & "+" & Val(a3(i))


Next i


Sigma(1, 1) = "(" & Val(m) & "*((" & AG(2, 1) & "*" & VASR(3, 1) & ") - (" & AG(3, 1) & "*" & VASR(2, 1) & ") + " & c_in(1, 1)
Sigma(2, 1) = "(" & Val(m) & "*((" & AG(3, 1) & "*" & VASR(1, 1) & ") - (" & AG(1, 1) & "*" & VASR(3, 1) & ") + " & c_in(2, 1)
Sigma(3, 1) = "(" & Val(m) & "*((" & AG(1, 1) & "*" & VASR(2, 1) & ") - (" & AG(2, 1) & "*" & VASR(1, 1) & ") + " & c_in(3, 1)


'torseur dynamique


For i = 1 To 3
If IsNumeric(tor_cinema(i, 2)) Then
RD(i, 1) = "(d/dt)*[" & Val(m) * Val(tor_cinema(i, 2)) & "]"
Else
RD(i, 1) = "(d/dt)*[" & Val(m) & "*" & tor_cinema(i, 2) & "]"
End If
Next i

Delta(1, 1) = "d/dt[" & Sigma(1, 1) & "] + (" & Val(m) & "*" & VAR(2, 1) & "*" & VGSR(3, 1) & ") - (" & VAR(3, 1) & "*" & VGSR(2, 1) & ")"
Delta(2, 1) = "d/dt[" & Sigma(2, 1) & "] + (" & Val(m) & "*" & VAR(3, 1) & "*" & VGSR(1, 1) & ") - (" & VAR(1, 1) & "*" & VGSR(3, 1) & ")"
Delta(3, 1) = "d/dt[" & Sigma(3, 1) & "] + (" & Val(m) & "*" & VAR(1, 1) & "*" & VGSR(2, 1) & ") - (" & VAR(2, 1) & "*" & VGSR(1, 1) & ")"
Set exlapp_1 = Nothing
Set exldoc_1 = Nothing
Set sheet_1 = Nothing
RDd = RD(1, 1) & "!" & RD(2, 1) & "@" & RD(3, 1)
Deltad = Delta(1, 1) & "!" & Delta(2, 1) & "@" & Delta(3, 1)
End Sub

MERCI BEAUCOUP POUR VOTRE AIDE
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
1 avril 2007 à 12:19
Violent Ken
Ok !

Dim resultante, moment As String

ne déclare QUE moment en string, et resultante en variant...

Donc il faut faire Dim resultante As String, moment As String

@+

Hex Editor VB
0
pifranl Messages postés 9 Date d'inscription mercredi 28 février 2007 Statut Membre Dernière intervention 1 avril 2007
1 avril 2007 à 13:41
Ca marche !!!!!!!
Franchement merci beaucoup à tous les deux, j'aurai vraiment pas mis en cause les déclarations tout seul.
Bon week end et merci encore.
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
1 avril 2007 à 13:43
Violent Ken

Mais de rien ;)
@+ et bon week-end également







Hex Editor VB
0
Rejoignez-nous