F
Flo.
Guest
Bonjour,
J'ai réalisé une application sur Excel que je voudrais optimiser. Pour cela je souhaite utiliser les tableaux VBA au lieux des feuilles utilisées comme tableaux. J'ai réalisé le code suivant :
Le problème c'est que lorsque je l'utilise, il ne rentre pas toutes les valeurs dans la plage demandé sur excel mais seulement la valeur contenue dans la première case mémoire de mon tableau (Tab_Tmp_Dsp(0)).
J'ai cherché sur internet et n'ai pas trouvé ce qu'il se passe. J'ai trouvé des pages pour optimiser dans laquelle il disait que l'utilisation des feuilles était plus longue que celle d'un tableau VBA (Acclration du code VBA).
Quelqu'un serait il me dire d'où vient mon problème?
Merci d'avance
J'ai réalisé une application sur Excel que je voudrais optimiser. Pour cela je souhaite utiliser les tableaux VBA au lieux des feuilles utilisées comme tableaux. J'ai réalisé le code suivant :
Code:
Option Base 0
' Déclaration des variables locales
Dim Mini_ech As Single, D_sp_ech As Double
Dim Mini_adm As Single, D_sp_adm As Double, Ep As Single
Dim Colonne As Integer, Ligne As Integer, Colonne_adm As Integer, Ligne_adm As Integer
Dim Collision_Soupape(89, 150) As Single
[COLOR="Red"]Dim Tab_Tmp_Dsp(40) As Single, Tab_Tmp_Dsp_5S(40) As String[/COLOR]
Dim dy As Single, dx As Single, Ligne_Soup As Integer, Ligne_Dss As Integer
Dim dx_ech As Single, dy_ech As Single, Depe As Single, teta_reel_ech As Single, Dsp_int_ech As Single
Dim dx_adm As Single, dy_adm As Single, Depa As Single, teta_reel_adm As Single, Dsp_int_adm As Single
Dim dx_adm_5S As Single, dy_adm_5S As Single, Depa_5S As Single, teta_reel_adm_5S As Single, Dsp_int_adm_5S As Single
Dim alpha As Single, Ex As Single, Ez As Single
Dim x_ech As Single, x_adm As Single, z_ech As Single, z_adm As Single
Dim Ligne_Min_adm As Integer, Ligne_Min_ech As Integer, Nb_Lignes_alpha As Integer
Dim Min As Single, Alpha_min As Single, Alpha_max As Single, Beta As Single, Ex_ell As Single
Sub Collision...()
Application.ScreenUpdating = False
With Worksheets("Calculs")
' Importation des valeurs dans le classeur
Depe = .Range("Depe").Value
Depa = .Range("Depa").Value
Ep = .Range("Ep").Value
teta_echappement = Application.WorksheetFunction.Radians(.Range("teta_e").Value)
teta_admission = Application.WorksheetFunction.Radians(.Range("teta_a").Value)
For i = 3 To 43
dx_ech = .Cells(i, 11).Value + Depe * Sin(teta_echappement) - Ep
dy_ech = .Cells(i, 12).Value - (.Cells(i, 8).Value + Depe * Cos(teta_echappement))
Dsp_int_ech = Sqr(dx_ech ^ 2 + dy_ech ^ 2)
If dx_ech < 0 And dy_ech > 0 Then
If Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech)) > teta_echappement Then
teta_reel_ech = Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech)) - teta_echappement
D_sp_ech = Dsp_int_ech * Cos(teta_reel_ech)
Else
teta_reel_ech = teta_echappement - Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech))
D_sp_ech = Dsp_int_ech * Cos(teta_reel_ech)
End If
ElseIf dx_ech > 0 And dy_ech < 0 Then
If Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech)) > teta_echappement Then
teta_reel_ech = Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech)) - teta_echappement
D_sp_ech = -Dsp_int_ech * Cos(teta_reel_ech)
Else
teta_reel_ech = teta_echappement - Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech))
D_sp_ech = -Dsp_int_ech * Cos(teta_reel_ech)
End If
ElseIf dx_ech > 0 And dy_ech > 0 Then
If Application.WorksheetFunction.Acos(Abs(dx_ech / Dsp_int_ech)) > teta_echappement Then
teta_reel_ech = teta_echappement + Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech))
D_sp_ech = Dsp_int_ech * Cos(teta_reel_ech)
Else
teta_reel_ech = Pi / 2 - teta_echappement + Application.WorksheetFunction.Acos(Abs(dx_ech / Dsp_int_ech))
D_sp_ech = -Dsp_int_ech * Cos(teta_reel_ech)
End If
ElseIf dx_ech < 0 And dy_ech < 0 Then
If Application.WorksheetFunction.Acos(Abs(dx_ech / Dsp_int_ech)) > teta_echappement Then
teta_reel_ech = teta_echappement + Application.WorksheetFunction.Acos(Abs(dy_ech / Dsp_int_ech))
D_sp_ech = -Dsp_int_ech * Cos(teta_reel_ech)
Else
teta_reel_ech = Pi / 2 - teta_echappement + Application.WorksheetFunction.Acos(Abs(dx_ech / Dsp_int_ech))
D_sp_ech = Dsp_int_ech * Cos(teta_reel_ech)
End If
End If
Tab_Tmp_Dsp(i - 3) = D_sp_ech
Next i
[COLOR="red"]Worksheets("Récapitulatif_Collisions").Range("Res_Dsp_ech").Value = Tab_Tmp_Dsp[/COLOR]
Worksheets("Calage_Resume").Range("Min_Dsp_ech").Value = Application.WorksheetFunction.Min(Tab_Tmp_Dsp)
For i = 3 To 43
dx_adm = .Cells(i, 9).Value - Depa * Sin(teta_admission) - Ep
dy_adm = .Cells(i, 10).Value - (.Cells(i, 8).Value + Depa * Cos(teta_admission))
Dsp_int_adm = Sqr(dx_adm ^ 2 + dy_adm ^ 2)
If dx_adm < 0 And dy_adm > 0 Then
' Cadran 4 Partie 2
If Application.WorksheetFunction.Acos(Abs(dx_adm / Dsp_int_adm)) > teta_admission Then
teta_reel_adm = teta_admission + Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm))
D_sp_adm = Dsp_int_adm * Cos(teta_reel_adm)
' Cadran 4 Partie 1
Else
teta_reel_adm = Pi / 2 - teta_admission + Application.WorksheetFunction.Acos(Abs(dx_adm / Dsp_int_adm))
D_sp_adm = -Dsp_int_adm * Cos(teta_reel_adm)
End If
ElseIf dx_adm > 0 And dy_adm < 0 Then
' Cadran 2 Partie 1
If Application.WorksheetFunction.Acos(Abs(dx_adm / Dsp_int_adm)) > teta_admission Then
teta_reel_adm = teta_admission + Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm))
D_sp_adm = -Dsp_int_adm * Cos(teta_reel_adm)
' Cadran 2 Partie 2
Else
teta_reel_adm = Pi / 2 - teta_admission + Application.WorksheetFunction.Acos(Abs(dx_adm / Dsp_int_adm))
D_sp_adm = Dsp_int_adm * Cos(teta_reel_adm)
End If
ElseIf dx_adm > 0 And dy_adm > 0 Then
' Cadran 3 Partie 1
If Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm)) > teta_admission Then
teta_reel_adm = Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm)) - teta_admission
D_sp_adm = Dsp_int_adm * Cos(teta_reel_adm)
' Cadran 3 Partie 2
Else
teta_reel_adm = teta_admission - Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm))
D_sp_adm = Dsp_int_adm * Cos(teta_reel_adm)
End If
ElseIf dx_adm < 0 And dy_adm < 0 Then
' Cadran 1 Partie 1
If Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm)) > teta_admission Then
teta_reel_adm = Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm)) - teta_admission
D_sp_adm = -Dsp_int_adm * Cos(teta_reel_adm)
' Cadran 1 Partie 2
Else
teta_reel_adm = teta_admission - Application.WorksheetFunction.Acos(Abs(dy_adm / Dsp_int_adm))
D_sp_adm = -Dsp_int_adm * Cos(teta_reel_adm)
End If
End If
Tab_Tmp_Dsp(i - 3) = D_sp_adm
Next i
Worksheets("Récapitulatif_Collisions").Range("Res_Dsp_adm").Value = Tab_Tmp_Dsp
Worksheets("Calage_Resume").Range("Min_Dsp_adm").Value = Application.WorksheetFunction.Min(Tab_Tmp_Dsp)
If Five_Valves = True Then
Depa_5S = .Range("Depa_5S").Value
teta_admission_5S = Application.WorksheetFunction.Radians(.Range("teta_a_5S").Value)
For i = 3 To 43
dx_adm_5S = .Cells(i, 13).Value - Depa_5S * Sin(teta_admission_5S) - Ep
dy_adm_5S = .Cells(i, 14).Value - _
(.Cells(i, 8).Value + Depa_5S * Cos(teta_admission_5S))
Dsp_int_adm_5S = Sqr(dx_adm_5S ^ 2 + dy_adm_5S ^ 2)
If dx_adm_5S < 0 And dy_adm_5S > 0 Then
If Application.WorksheetFunction.Acos(Abs(dx_adm_5S / Dsp_int_adm_5S)) > teta_admission_5S Then
teta_reel_adm_5S = teta_admission_5S + Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
Else
teta_reel_adm_5S = Pi / 2 - teta_admission_5S + _
Application.WorksheetFunction.Acos(Abs(dx_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = -Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
End If
ElseIf dx_adm_5S > 0 And dy_adm_5S < 0 Then
If Application.WorksheetFunction.Acos(Abs(dx_adm_5S / Dsp_int_adm_5S)) > teta_admission_5S Then
teta_reel_adm_5S = teta_admission_5S + Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = -Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
Else
teta_reel_adm_5S = Pi / 2 - teta_admission_5S + _
Application.WorksheetFunction.Acos(Abs(dx_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
End If
ElseIf dx_adm_5S > 0 And dy_adm_5S > 0 Then
If Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S)) > teta_admission_5S Then
teta_reel_adm_5S = Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S)) - teta_admission_5S
D_sp_adm_5S = Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
Else
teta_reel_adm_5S = teta_admission_5S - Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
End If
ElseIf dx_adm_5S < 0 And dy_adm_5S < 0 Then
If Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S)) > teta_admission_5S Then
teta_reel_adm_5S = Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S)) - teta_admission_5S
D_sp_adm_5S = -Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
Else
teta_reel_adm_5S = teta_admission_5S - Application.WorksheetFunction.Acos(Abs(dy_adm_5S / Dsp_int_adm_5S))
D_sp_adm_5S = -Dsp_int_adm_5S * Cos(teta_reel_adm_5S)
End If
End If
Tab_Tmp_Dsp(i - 3) = D_sp_adm_5S
Next i
Worksheets("Récapitulatif_Collisions").Range("Res_Dsp_adm_5S").Value = Tab_Tmp_Dsp
Worksheets("Calage_Resume").Range("Min_Dsp_adm_5S").Value = Application.WorksheetFunction.Min(Tab_Tmp_Dsp)
Else
For i = 0 To 40
Tab_Tmp_Dsp_5S(i) = "N.R"
Next i
Worksheets("Récapitulatif_Collisions").Range("Res_Dsp_adm_5S") = Tab_Tmp_Dsp_5S
Worksheets("Calage_Resume").Range("Min_Dsp_adm_5S").Value = "N.R"
End If
End With
End Sub
Le problème c'est que lorsque je l'utilise, il ne rentre pas toutes les valeurs dans la plage demandé sur excel mais seulement la valeur contenue dans la première case mémoire de mon tableau (Tab_Tmp_Dsp(0)).
J'ai cherché sur internet et n'ai pas trouvé ce qu'il se passe. J'ai trouvé des pages pour optimiser dans laquelle il disait que l'utilisation des feuilles était plus longue que celle d'un tableau VBA (Acclration du code VBA).
Quelqu'un serait il me dire d'où vient mon problème?
Merci d'avance
Dernière modification par un modérateur: