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 ! Il peut donc y avoir n'importe quoi avant et après.

Je ne vois aucune déclaration du tableau livraison_ca ! On ne sait donc pas s'il est déclaré, ni le cas échéant s'il est déclaré en tant que tableau, ni éventuellement de quel type...

Je ne vois pas non plus d'initialisation de ce tableau ! Ça fait déjà beaucoup de choses qui font défaut !

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... et

On n'en sait pas plus, et même encore moins ! Puisqu'on ne sait même plus dans quelle procédure se produit l'erreur !

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 ! Tu peux difficilement avoir une réponse en retour sur des informations que tu refuses de fournir !

'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...

tableau

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.

smart indenter

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 ^^ je reprend et reviens ...

action réaction... avec un peu de retard... mais on lache rien plus on travail plus on progresse... BIG MERCI pour tout ces conseils bien utile.

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
Rechercher des sujets similaires à "probleme erreur"