pifranl
Messages postés9Date d'inscriptionmercredi 28 février 2007StatutMembreDernière intervention 1 avril 2007
-
1 avril 2007 à 11:37
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 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 ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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
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
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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
pifranl
Messages postés9Date d'inscriptionmercredi 28 février 2007StatutMembreDerniè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
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
pifranl
Messages postés9Date d'inscriptionmercredi 28 février 2007StatutMembreDerniè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.