Probleme erreur 13
Bonjour j'ai un petit soucis pour lequel je ne trouve aucune solution.
je met en place un array dans lequel j'inscris des données.
Dans cet array je souhaite faire un recherche par date.
Dans la boucle je me retrouve avec une erreur de type 13.
Je n'arrive pas à voir d'où viens le problème...
j'appelle la sub qui déclare le tableau livraison_ca()
Dim v As Variant
For v = 0 To UBound(livraison_ca)
date_tableau = Year(livraison_ca(v, 0))
If date_tableau = Year(Date) Then
compteur = compteur + livraison_ca(v, 1) + livraison_ca(v, 2) + livraison_ca(v, 3)
End If
'MsgBox compteur
Next v
...
Bonjour,
En l'absence de Sub et End Sub, je ne vois pas où commence ta procédure ni où elle finit !
Je ne vois aucune déclaration du tableau livraison_ca !
Je ne vois pas non plus d'initialisation de ce tableau !
date_tableau n'apparaît pas non plus déclarée, ni compteur. La seule variable déclarée est v, typée sans justification en Variant pour servir de compteur de boucle...
La ligne sur laquelle survient l'erreur 13 n'est pas précisée !
Vu le type d'erreur, on peut inférer qu'une telle erreur peut être provoquée par l'application de la fonction Year à une donnée qui n'est pas une date (par exemple la valeur Empty n'est pas convertible en date).
Mais vu le nombre d'aléas suseptible d'affecter ce fragment de code, cela peut être tout à fait n'importe quoi !
effectivement les donnée sont peut parlante je reprend tout ca du coup...
Sub sub_ca_general_mois()
'appelle de la sub ca_général
sub_ca_general_ttc
'déclaration des variable
Dim boucle_sur_ca As Integer
Dim boucle_sur_place As Integer
'test de pb
'MsgBox VarType(Year(livraison_ca(boucle_sur_livraison, 0)))
For boucle_sur_livraison = 0 To UBound(livraison_ca)
Next boucle_sur_livraison
'MsgBox compteur
For boucle_sur_place = 0 To UBound(sur_place_ca)
Next boucle_sur_place
For boucle_ar = 0 To UBound(ar_ca)
Next boucle_ar
For boucle_ue = 0 To UBound(ue_ca)
Next boucle_ue
Dim v As Variant
For v = 0 To UBound(livraison_ca)
date_tableau = Year(livraison_ca(v, 0))
If date_tableau = Year(Date) Then
compteur = compteur + livraison_ca(v, 1) + livraison_ca(v, 2) + livraison_ca(v, 3)
End If
'MsgBox date_tableau
Next v
MsgBox compteur
MsgBox date_tableau
MsgBox livraison_ca(3, 0)
End Sub
voici la procédur que j'ai sachant que les tableaux sont dans la procédure sub_ca_general_ttc
bonjour
salut MFerrand
ai-je compris qu'on fait un décompte avec VBA et pas par formule ou TCD ?
oui c'est bien cela...
On n'en sait pas plus, et même encore moins !
Mais avec une façon de coder brouillonne et ne respectant aucune règle de base, obtenir un code qui s'exécute sans erreur relèvera de la loterie !
ok merci quand même ^^
De rien !
'déclaration des tableau
Public livraison_ca()
Public sur_place_ca()
Public ar_ca()
Public ue_ca()
Public ca_livraison As Double
Public ca_sur_place As Double
Public ca_ar As Double
Public ca_ue As Double
Public ca_general_ttc As Variant
'sub déclaration tableau livraison
Sub declaration_tab_livraison()
Dim dern_lign As Integer
Dim dern_col As Integer
dern_lign = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
'déclaration du tableau
ReDim livraison_ca(dern_lign - 5, 6)
'enregistrement des données dans le tableau
For l = 0 To UBound(livraison_ca)
For c = 0 To 6
livraison_ca(l, c) = Sheets(1).Cells(l + 6, c + 1)
livraison_ca(l, c) = Replace(livraison_ca(l, c), ",", ".")
Next c
Next l
End Sub
'declaration tableau sur place
Sub declaration_tab_sur_place()
Dim dern_lign As Integer
Dim dern_col As Integer
dern_lign = Sheets(1).Cells(Rows.Count, 9).End(xlUp).Row
'declaration du tableau
ReDim sur_place_ca(dern_lign - 5, 6)
'enregistrement des donnnées dans le tableau
For l = 0 To UBound(sur_place_ca)
For c = 0 To 6
sur_place_ca(l, c) = Sheets(1).Cells(l + 6, c + 9)
sur_place_ca(l, c) = Replace(sur_place_ca(l, c), ",", ".")
Next c
Next l
End Sub
'déclaration tableau ar
Sub declaration_tab_ar()
Dim dern_lign As Integer
Dim dern_col As Integer
dern_lign = Sheets(1).Cells(Rows.Count, 17).End(xlUp).Row
'déclaration du tableau
ReDim ar_ca(dern_lign - 5, 6)
'enregistrement des donnée dans le tableau
For l = 0 To UBound(ar_ca)
For c = 0 To 6
ar_ca(l, c) = Sheets(1).Cells(l + 6, c + 17)
ar_ca(l, c) = Replace(ar_ca(l, c), ",", ".")
Next c
Next l
End Sub
'déclaration tableau ue
Sub declaration_tab_ue()
Dim dern_lign As Integer
Dim dern_col As Integer
dern_lign = Sheets(1).Cells(Rows.Count, 25).End(xlUp).Row
'declaration du tableau
ReDim ue_ca(dern_lign - 5, 6)
'enregistrement des données dans le tableau
For l = 0 To UBound(ue_ca)
For c = 0 To 6
ue_ca(l, c) = Sheets(1).Cells(l + 6, c + 25)
ue_ca(l, c) = Replace(ue_ca(l, c), ",", ".")
Next c
Next l
End Sub
'appelle de tout les tableau
Sub appelle_tableau_ca()
declaration_tab_livraison
declaration_tab_sur_place
declaration_tab_ar
declaration_tab_ue
End Sub
'calcul du ca par groupe
Sub calcul_ca_livraison()
Dim boucle_ligne As Integer
appelle_tableau_ca
For boucle_ligne = 0 To UBound(livraison_ca)
ca_livraison = ca_livraison + Val(livraison_ca(boucle_ligne, 1)) + Val(livraison_ca(boucle_ligne, 2)) + Val(livraison_ca(boucle_ligne, 3))
Next boucle_ligne
End Sub
Sub calcul_ca_sur_place()
Dim boucle_ligne As Integer
appelle_tableau_ca
For boucle_ligne = 0 To UBound(sur_place_ca)
ca_sur_place = ca_sur_place + Val(sur_place_ca(boucle_ligne, 1)) + Val(sur_place_ca(boucle_ligne, 2)) + Val(sur_place_ca(boucle_ligne, 3))
Next boucle_ligne
End Sub
Sub calcul_ca_ar()
Dim boucle_ligne As Integer
appelle_tableau_ca
For boucle_ligne = 0 To UBound(ar_ca)
ca_ar = ca_ar + Val(ar_ca(boucle_ligne, 1)) + Val(ar_ca(boucle_ligne, 2)) + Val(ar_ca(boucle_ligne, 3))
Next boucle_ligne
End Sub
Sub calcul_ca_ue()
Dim boucle_ligne As Integer
appelle_tableau_ca
For boucle_ligne = 0 To UBound(ue_ca)
ca_ue = ca_ue + Val(ue_ca(boucle_ligne, 1)) + Val(ue_ca(boucle_ligne, 2)) + Val(ue_ca(boucle_ligne, 3))
Next boucle_ligne
End Sub
Sub remise_a_zero_des_variable()
'remise a zero de toute les variables pour éviter leur addition dans le résultat
ca_general_ttc = 0
ca_sur_place = 0
ca_ar = 0
ca_ue = 0
End Sub
Sub sub_ca_general_ttc()
'mise a zero des variable
remise_a_zero_des_variable
'appelle des sub des Ca
calcul_ca_livraison
calcul_ca_sur_place
calcul_ca_ar
calcul_ca_ue
'calcul CA général TTC
ca_general_ttc = ca_sur_place + ca_livraion + ca_ar + ca_ue
End Sub
Sub sub_ca_general_mois()
'appelle de la sub ca_général
sub_ca_general_ttc
'appelle de l'userform userform 4
'textbox1 = mois variable_mois
variable_date = UserForm4.TextBox3
variable_mois = UserForm4.TextBox1
variable_mois = UserForm4.TextBox2
'déclaration des variable
Dim boucle_sur_ca As Integer
Dim boucle_sur_place As Integer
'textbox année
'livraison_ca()
'sur_place_ca()
'ar_ar
'ca_ue_ca
'test de pb
'MsgBox VarType(Year(livraison_ca(boucle_sur_livraison, 0)))
For boucle_sur_livraison = 0 To UBound(livraison_ca)
Next boucle_sur_livraison
'MsgBox compteur
For boucle_sur_place = 0 To UBound(sur_place_ca)
Next boucle_sur_place
For boucle_ar = 0 To UBound(ar_ca)
Next boucle_ar
For boucle_ue = 0 To UBound(ue_ca)
Next boucle_ue
Dim v As Variant
For v = 0 To UBound(livraison_ca)
date_tableau = Year(livraison_ca(v, 0))
If date_tableau = Year(Date) Then
compteur = compteur + livraison_ca(v, 1) + livraison_ca(v, 2) + livraison_ca(v, 3)
End If
'MsgBox date_tableau
Next v
MsgBox compteur
MsgBox date_tableau
MsgBox livraison_ca(3, 0)
End Sub
Il est bon de mettre le code cité sous balise Code, on peut alors le lire facilement, et encore mieux de l'indenter correctement et le mettre sous balises...
Bon ! Il est encore tôt... ! Et je me contente de la première procédure...
Supposons que l'initialisation de dern_lign donne : 10. La ligne 11 sera donc vide (au moins en colonne A).
On redimensionne livraison_ca(dern_lign - 5, 6), soit : livraison_ca(5, 6)
On boucle : For l = 0 To UBound(livraison_ca), soit : For l = 0 To 5
On affecte : livraison_ca(l, c) = Sheets(1).Cells(l + 6, c + 1)
Lorsque l =5 (c = 0), on aura : livraison_ca(5, 0) = Sheets(1).Cells(11, 1)
Mais la cellule A11 est vide ! Valeur de l'élément tableau affecté : Empty.
Pas de date dans cet élément !
Cordialement.
Le plus fou c'est que quand je commence a coder je part avec l'intention d'indenté au mieux puis voila les blocages qui se présente puis je me fais mon petit schmilblique pour essayé de trouver l'erreur en testant les variables une par une voir si leur type et le même ou pas puis c'est la que je me rend compte que mon code ressemble à un tas de feuille morte sous lequel se cache mon problème et la patatra impossible de résoudre la problématique....
juste pour info je met en le fichier en image d'un exemple de tableau en colonne a les élément se font a partir de la ligne 6 soit array(0,0) = sheets(1).cells(6,1).
si ca peut aider.
mon objectif est de pouvoir récupéré des données en fonction de date. jour semaine mois.
J'essaye d'avoir une logique construite mais je pense que je n'ai pas le bon angle d'approche...
Si vous pouviez m'aiguiller sur la construction de la macro... se serait super sympa.
A défaut c'est super sympa de votre part de me consacrer de votre temps...
Je t'ai donné des indications précises relatives à ton erreur 13, tu devrais la surmonter.
Ton code est à peu près illisible, pas indenté, des lignes vides intercalées un peu partout, on ne distingue pas les procédures les unes autres, des commentaires partout aussi, les déclarations de variables éparpillées dans le code exécutable (au lieu d'être déclarées, toutes, et systématiquement en début de procédure). Et si j'ajoute des noms de variables longs, un lot de variables publiques dont je ne vois pas la justification, sauf à supposer qu'en plus tu éparpilles ton code dans divers modules...
Ça fait beaucoup !
Cordialement.
un cours sur l'indentation a me proposer ? ^^
Bonjour à tous,
Pour l'indentation ... regarde ma signature, un bel utilitaire qui te rendra de grands services.
ric
je m'y remet alors dès maintenant.
et je reviens vers vous une fois que c'est fait
merci encore pour ces conseils.
voici ma macro une fois remis au propre.
Sub sub_ca_general_mois()
'déclaration des variable
Dim v As Variant
Dim date_tableau As Integer
'appelle de la sub ca_général'------> on appelle le tableau livraison(ca)
sub_ca_general_ttc
For v = 0 To UBound(livraison_ca)
If Year(livraison_ca(v, 0)) = Year(Date) Then '---------------------------------------------------------> le debogeur affiche l'erreur à ce niveau.
compteur = compteur + livraison_ca(v, 1) + livraison_ca(v, 2) + livraison_ca(v, 3)
End If
'MsgBox date_tableau
Next v
MsgBox compteur
End Sub
Bonjour,
Presque ... si ton code est maintenant indenté dans ton module ... sélectionne-le ... puis édite ton message ...
En haut, il y a des boutons ... le 5e [ </> ] clique dessus, insère ton code entre les deux blocs
Sub usf()
UserForm1.Show
End Sub
... au bas clique sur "Aperçu" ... regarde ... la présentation est bien meilleure.
Quand on présente du code ... c'est la présentation souhaitée par ceux qui vont t'aider.
ric
j'y suis presque ^^
action réaction... avec un peu de retard...
En espérant que l'on réussisse à trouver d'où l'incompatibilité provient....
Sub sub_ca_general_mois()
'déclaration des variable
Dim v As Variant
Dim date_tableau As Integer
'appelle de la sub ca_général'------> on appelle le tableau livraison_ca()
sub_ca_general_ttc
For v = 0 To UBound(livraison_ca)
If Year(livraison_ca(v, 0)) = Year(Date) Then
compteur = compteur + livraison_ca(v, 1) + livraison_ca(v, 2) + livraison_ca(v, 3)
End If
'MsgBox date_tableau
Next v
MsgBox compteur
End Sub