Incompatibilité de type sur un calcul de somme...
Dernière réponse : dans Programmation
bonjour,
Suite a un changement dans un des programmes VBA que j'avais conjointement ;is au point avec zeb, j'ai une erreur.
j'ai mis ci dessous la déclaration des variables puis la partie calculatiore qui bloque (erreur 13 il me semble: incompatibilité de type)
Le debogueur bloque sur le calcul de la somme.
j'ai déja essayé de modifier le type de variable et d'enlever le Cdec, mais rien n'y fait, ca bloque qd meme !!!
je veux que la somme prenne en compte des décimaux avec 2 chiffres apres la virgule d'ou la déclaration en variant de sums
pour l'arrondi, je sais comment faire(round(...,2))
si qqn peut m'aider ...
Suite a un changement dans un des programmes VBA que j'avais conjointement ;is au point avec zeb, j'ai une erreur.
j'ai mis ci dessous la déclaration des variables puis la partie calculatiore qui bloque (erreur 13 il me semble: incompatibilité de type)
Le debogueur bloque sur le calcul de la somme.
j'ai déja essayé de modifier le type de variable et d'enlever le Cdec, mais rien n'y fait, ca bloque qd meme !!!
je veux que la somme prenne en compte des décimaux avec 2 chiffres apres la virgule d'ou la déclaration en variant de sums
pour l'arrondi, je sais comment faire(round(...,2))
si qqn peut m'aider ...
Dim ws_source As Worksheet
Dim ws_credit As Worksheet
Dim ws_debit As Worksheet
Dim ws_result As Worksheet
Dim date_ref As Date
Dim dc_colname As String
Dim date_colname As String
Dim amount_colname As String
Dim is_credit_debit As Boolean
Dim name As String
Dim switch As Boolean
Dim dc_type As dc_enum
Dim row_source As Range
Dim row_target(Debit To Credit) As Range
Dim date_(1 To 4) As Date
Dim i As Integer
Dim j As Integer
Dim j0 As Integer
Dim i0 As Integer
Dim sums(Debit To Credit, 1 To 5) As variant
Dim ops(Debit To Credit, 1 To 5) As Long
Dim c_count As Long
Dim d_count As Long
Set ws_source = Worksheets("Sheet1")
Set ws_credit = Worksheets("Credit")
Set ws_debit = Worksheets("Debit")
Set ws_result = Worksheets("Result")
Set row_target(Credit) = ws_credit.Rows(2)
Set row_target(Debit) = ws_debit.Rows(2)
c_count = 0
d_count = 0
[...]
For i = 1 To 4
date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
Next
For Each row_source In ws_source.Rows
is_credit_debit = True
Select Case IsNumeric(ws_source.Cells(, amount_colname).Value)
Case Is >= 0: dc_type = Credit: c_count = c_count + 1
Case Is < 0: dc_type = Debit: d_count = d_count + 1
Case Else: is_credit_debit = False
End Select
If is_credit_debit = True Then
row_source.Copy row_target(dc_type)
i0 = 5
For i = 4 To 1 Step -1
If IsDate(row_target(dc_type).Cells(, date_colname).Value) >= date_(i) Then
i0 = i
End If
Next
ops(dc_type, i0) = ops(dc_type, i0) + 1
sums(dc_type, i0) = sums(dc_type, i0) + Cdec(row_target(dc_type).Cells(, amount_colname).Value)
Set row_target(dc_type) = row_target(dc_type).Offset(1)
End If
Next
Autres pages sur : incompatibilite type calcul somme
Lassé par la pub ? Créez un compte
Meilleure solution
Salut Oozenot,
Pourquoi mettre tes sommes en Variant ?
Mets les en Single ou en Double !
Et utilise CSng() ou CDbl() pour faire tes conversions éventuelles.
Dis-donc, t'es sûr que ce n'est pas plutôt en ligne 53 que tu as un problème d'incompatibilité de type ?
Tu y compares IsDate() qui renvoie un Boolean, avec ton tableau date_() qui contient des dates
Pourquoi mettre tes sommes en Variant ?
Mets les en Single ou en Double !
Et utilise CSng() ou CDbl() pour faire tes conversions éventuelles.
Dis-donc, t'es sûr que ce n'est pas plutôt en ligne 53 que tu as un problème d'incompatibilité de type ?
Tu y compares IsDate() qui renvoie un Boolean, avec ton tableau date_() qui contient des dates
oups, c'était pas ISdate mais Cdate que je voulais mettre... je sais meme pas pourquoi ca m'a pas sauter aux yeux !!!
j'ai enlever cette erreur tout simplement.
J'ai appliquer les changements mais.. erreur 13 "type mismatch" sur la somme.
(le debogeur n'a jamais stoppé sur isdate !!)
pour l'utilisation du variant et bien dans l'aide d'excel j'avais lu que Cdec() s'utilisait avec des variants..
EDIT: j'ai du mal lire, ils disent que c'est avec nimporte quel type numeric .
voila... toujours le meme probleme..
j'ai enlever cette erreur tout simplement.
J'ai appliquer les changements mais.. erreur 13 "type mismatch" sur la somme.
(le debogeur n'a jamais stoppé sur isdate !!)
pour l'utilisation du variant et bien dans l'aide d'excel j'avais lu que Cdec() s'utilisait avec des variants..
EDIT: j'ai du mal lire, ils disent que c'est avec nimporte quel type numeric .
voila... toujours le meme probleme..
Tu as le problème en entrée de procédure ou juste au moment de l'exécution de cette ligne ?
Justement, c'est tellement merdique qu'il faut utiliser des Variants. D'où la bonne idée de ne pas en utiliser.
Mais avant de vérifier
Ca dit quoi ?
Justement, c'est tellement merdique qu'il faut utiliser des Variants. D'où la bonne idée de ne pas en utiliser.
Mais avant de vérifier
sums(dc_type, i0) = sums(dc_type, i0) + Cdec(row_target(dc_type).Cells(, amount_colname).Value)
il faut vérifier :sums(dc_type, i0)
row_target(dc_type).Cells(, amount_colname)
row_target(dc_type).Cells(, amount_colname).Value
Cdec(row_target(dc_type).Cells(, amount_colname).Value)
row_target(dc_type).Cells(, amount_colname)
row_target(dc_type).Cells(, amount_colname).Value
Cdec(row_target(dc_type).Cells(, amount_colname).Value)
Ca dit quoi ?
alors ca dit...
pour celui là
il ne veux même pas en entendre parler... erreur de compilation
la même
pour ces 2 là, une fois que je supprime les 2 lignes supérieures :
erreur 438, méthode ou propriété non supportée par cet objet... (c'est vraiment de la merde VBA)
et erreur 13, incompatibilité de type pour le dernier !
youhou, VBA capte rien !
bon, va falloir faire les choses autrement...
pour celui là
sums(dc_type, i0)
il ne veux même pas en entendre parler... erreur de compilation
row_target(dc_type).Cells(, amount_colname)
la même
pour ces 2 là, une fois que je supprime les 2 lignes supérieures :
row_target(dc_type).Cells(, amount_colname).Value
erreur 438, méthode ou propriété non supportée par cet objet... (c'est vraiment de la merde VBA)
Cdec(row_target(dc_type).Cells(, amount_colname).Value)
et erreur 13, incompatibilité de type pour le dernier !
youhou, VBA capte rien !
bon, va falloir faire les choses autrement...
Eh, mais qu'est-ce que tu fais ?
S'il faut que tu vérifies sums(dc_type, i0), par exemple, il ne faut pas le laisser tout seul sur une ligne !
Il faut en regarder le contenu. C'est l'art du débogage, le côté obscur de la Force du programmeur.
Allez, bonne lecture : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
Alors ?
S'il faut que tu vérifies sums(dc_type, i0), par exemple, il ne faut pas le laisser tout seul sur une ligne !
Il faut en regarder le contenu. C'est l'art du débogage, le côté obscur de la Force du programmeur.
Allez, bonne lecture : http://www.presence-pc.com/forum/ppc/Programmation/tuto...
Alors ?
ah, je pensait que c'était une erreur de syntaxe au début d'ou le fait d'afficher les lignes tel quel.
Mais apres avoir ajouter un espion (enfin 2) je crois que le probleme viens du fait que ma premiere ligne n'est pas une date. du coup l'expression avec row_target prend la valeur de mon intitulé et la boucle s'execute... alors qu'elle devrait pas..et donc, dur pour la somme de faire une somme de string et encore plus de convertir un string en double
je vais rajoter un test pour vérifier que c'est une date et on va voir ce que ca donne...
je ne pensait pas du tout que l'erreur venait de la !!! ca parrait basique...
Mais apres avoir ajouter un espion (enfin 2) je crois que le probleme viens du fait que ma premiere ligne n'est pas une date. du coup l'expression avec row_target prend la valeur de mon intitulé et la boucle s'execute... alors qu'elle devrait pas..et donc, dur pour la somme de faire une somme de string et encore plus de convertir un string en double
je vais rajoter un test pour vérifier que c'est une date et on va voir ce que ca donne...
je ne pensait pas du tout que l'erreur venait de la !!! ca parrait basique...
bon, ben ce n'est pas le seul probleme apparement. j'ai essayer de faire en sorte qu'il evite la premiere ligne mais... il ne veut pas !
je sais aussi qu'il me copie la premiere ligne (intitulé) 2 fois dans la feuille crédit.. incompréhensible..
je sais aussi qu'il me copie la premiere ligne (intitulé) 2 fois dans la feuille crédit.. incompréhensible..
UserForm3.TextBox1.Value = ""
UserForm3.TextBox2.Value = ""
UserForm3.TextBox3.Value = ""
UserForm3.TextBox4.Value = ""
UserForm3.Show
If Not IsDate(UserForm3.TextBox1.Value) Then
MsgBox "You haven't written in the right format"
Exit Sub
End If
date_colname = UCase(UserForm3.TextBox2.Value) ' definied variable from userform entries
amount_colname = UCase(UserForm3.TextBox3.Value)
date_ref = UserForm3.TextBox1.Value
name = UserForm3.TextBox4.Value
MsgBox " You've entered the name :" & name & vbCr & _
"You've entered the value date :" & date_ref & vbCr & _
"You've entered Date column :" & date_colname & vbCr & _
"You've entered Amount column :" & amount_colname, vbOKOnly
For i = 1 To 4
date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
Next
For Each row_source In ws_source.Rows
Select Case IsNumeric(ws_source.Cells(, amount_colname).Value) = True
Case Is >= 0: dc_type = Credit: c_count = c_count + 1: is_credit_debit = True
Case Is < 0: dc_type = Debit: d_count = d_count + 1: is_credit_debit = True
Case Else: is_credit_debit = False
End Select
If is_credit_debit = True Then
row_source.Copy row_target(dc_type)
i0 = 5
For i = 4 To 1 Step -1
If row_target(dc_type).Cells(, date_colname).Value >= date_(i) Then
i0 = i
MsgBox "" & row_target(0).Cells(, date_colname).Value & vbCr & _
"" & row_target(1).Cells(, date_colname).Value
End If
Next
ops(dc_type, i0) = ops(dc_type, i0) + 1
sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(, amount_colname).Value)
Set row_target(dc_type) = row_target(dc_type).Offset(1)
End If
Next
MsgBox "Credit: " & c_count & vbCr & _
"Debit: " & d_count & vbCr & _
"Total : " & c_count + d_count, , "Trouvés"
For dc_type = Debit To Credit
rn = 6
For i = 5 To 1 Step -1
ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i), 2)
ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i)
rn = rn + 1
Next
Next
mdr !!! oui c'est un peu ca !
j'ai rajouter un bouleen pour les dates. par contre je n'ai toujours pas résolu l'histoire des 2 copies de l'intitulé dans la feuille crédit.
EDIT : mauvaise nouvelle, il bloque sur le i0 =5... ca ne finira jamais
j'ai rajouter un bouleen pour les dates. par contre je n'ai toujours pas résolu l'histoire des 2 copies de l'intitulé dans la feuille crédit.
For Each row_source In ws_source.Rows
Select Case IsNumeric(ws_source.Cells(, amount_colname).Value) = True
Case Is >= 0: dc_type = Credit: c_count = c_count + 1: is_credit_debit = True
Case Is < 0: dc_type = Debit: d_count = d_count + 1: is_credit_debit = True
Case Else: is_credit_debit = False
End Select
If is_credit_debit = True Then
row_source.Copy row_target(dc_type)
i0 = 5
For i = 4 To 1 Step -1
If IsDate(row_target(dc_type).Cells(, date_colname).Value) = True And row_target(dc_type).Cells(, date_colname).Value >= date_(i) Then
switch = True
i0 = i
Else: switch = False
End If
Next
If switch = True Then
ops(dc_type, i0) = ops(dc_type, i0) + 1
sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(, amount_colname).Value)
End If
Set row_target(dc_type) = row_target(dc_type).Offset(1)
End If
Next
EDIT : mauvaise nouvelle, il bloque sur le i0 =5... ca ne finira jamais
oui, j'ai mis un point d'arret que je deplace au fur et a mesure comme dans le tuto avec des espions et des msgbox pour surveiller les valeurs
pour le test select je le fais sur la valeur de la cellule de la colonne amount_colname t de la ligne en cours sachant qu'il faut qu'elle soit au format numérique
pour le test select je le fais sur la valeur de la cellule de la colonne amount_colname t de la ligne en cours sachant qu'il faut qu'elle soit au format numérique
re,
J'ai changé la méthode pour le select case et aussi la maniere de faire la boucle For. j'ai mes bonnes copies dans mes bonnes feuilles.
il me reste a régler le fait que la somme ne s'affiche pas comme il faut.
J'ai changé la méthode pour le select case et aussi la maniere de faire la boucle For. j'ai mes bonnes copies dans mes bonnes feuilles.
For i = 1 To 4
date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
Next
last_row = ws_source.Range("B1:B65536").End(xlDown).Row
MsgBox "" & last_row
For t = 2 To last_row
is_credit_debit = True
Select Case ws_source.Cells(t, amount_colname).Value
Case Is >= 0: dc_type = Credit: c_count = c_count + 1
Case Is < 0: dc_type = Debit: d_count = d_count + 1
Case Else: is_credit_debit = False
End Select
If is_credit_debit Then
ws_source.Rows(t).Copy row_target(dc_type)
i0 = 5
For i = 4 To 1 Step -1
If IsDate(row_target(dc_type).Cells(t, date_colname).Value) = True And row_target(dc_type).Cells(t, date_colname).Value >= date_(i) Then
i0 = i
End If
Next
ops(dc_type, i0) = ops(dc_type, i0) + 1
sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(t, amount_colname).Value)
Set row_target(dc_type) = row_target(dc_type).Offset(1)
End If
Next
MsgBox "Credit: " & c_count & vbCr & _
"Debit: " & d_count & vbCr & _
"Total : " & c_count + d_count, , "Trouvés"
For dc_type = Debit To Credit
rn = 6
For i0 = 4 To 1 Step -1
ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i0), 2)
ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i0)
rn = rn + 1
Next
Next
il me reste a régler le fait que la somme ne s'affiche pas comme il faut.
probleme résolu
au plaisir !
au plaisir !
Dim ws_source As Worksheet
Dim ws_credit As Worksheet
Dim ws_debit As Worksheet
Dim ws_result As Worksheet
Dim date_ref As Date
Dim dc_colname As String
Dim date_colname As String
Dim amount_colname As String
Dim is_credit_debit As Boolean
Dim name As String
Dim switch As Boolean
Dim last_row As Integer
Dim dc_type As dc_enum
Dim t As Integer
Dim row_target(Debit To Credit) As Range
Dim date_(1 To 4) As Date
Dim i As Integer
Dim i0 As Integer
Dim sums(Debit To Credit, 1 To 5) As Double
Dim ops(Debit To Credit, 1 To 5) As Long
Dim c_count As Long
Dim d_count As Long
Set ws_source = Worksheets("Sheet1")
Set ws_credit = Worksheets("Credit")
Set ws_debit = Worksheets("Debit")
Set ws_result = Worksheets("Result")
Set row_target(Credit) = ws_credit.Rows(2)
Set row_target(Debit) = ws_debit.Rows(2)
c_count = 0
d_count = 0
ws_source.Rows(1).Copy ws_debit.Rows(1)
ws_source.Rows(1).Copy ws_credit.Rows(1)
ws_source.Cells.AutoFilter
ws_source.Cells.EntireColumn.AutoFit
UserForm3.TextBox1.Value = ""
UserForm3.TextBox2.Value = ""
UserForm3.TextBox3.Value = ""
UserForm3.TextBox4.Value = ""
UserForm3.Show
If Not IsDate(UserForm3.TextBox1.Value) Then
MsgBox "You haven't written in the right format"
Exit Sub
End If
date_colname = UCase(UserForm3.TextBox2.Value) ' definied variable from userform entries
amount_colname = UCase(UserForm3.TextBox3.Value)
date_ref = UserForm3.TextBox1.Value
name = UserForm3.TextBox4.Value
MsgBox " You've entered the name :" & name & vbCr & _
"You've entered the value date :" & date_ref & vbCr & _
"You've entered Date column :" & date_colname & vbCr & _
"You've entered Amount column :" & amount_colname, vbOKOnly
For i = 1 To 4
date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
Next
last_row = ws_source.Range("B1:B65536").End(xlDown).Row
MsgBox "" & last_row
For t = 2 To last_row
is_credit_debit = True
Select Case ws_source.Cells(t, amount_colname).Value
Case Is >= 0: dc_type = Credit: c_count = c_count + 1
Case Is < 0: dc_type = Debit: d_count = d_count + 1
Case Else: is_credit_debit = False
End Select
If is_credit_debit Then
ws_source.Rows(t).Copy row_target(dc_type)
i0 = 5
For i = 4 To 1 Step -1
If IsDate(row_target(dc_type).Cells(t, date_colname).Value) And row_target(dc_type).Cells(t, date_colname).Value >= date_(i) Then
i0 = i
End If
Next
ops(dc_type, i0) = ops(dc_type, i0) + 1
sums(dc_type, i0) = sums(dc_type, i0) + CDbl(ws_source.Cells(t, amount_colname).Value)
Set row_target(dc_type) = row_target(dc_type).Offset(1)
End If
Next
MsgBox "" & sums(1, 3)
MsgBox "Credit: " & c_count & vbCr & _
"Debit: " & d_count & vbCr & _
"Total : " & c_count + d_count, , "Trouvés"
For dc_type = Debit To Credit
rn = 6
For i0 = 5 To 1 Step -1
ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i0), 2)
ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i0)
rn = rn + 1
Next
Next
'---=== affichage ===---
ws_credit.Cells(, date_colname).NumberFormat = "d/m/yyyy"
ws_debit.Cells(, date_colname).NumberFormat = "d/m/yyyy"
ws_credit.Cells.AutoFilter
ws_credit.Cells.EntireColumn.AutoFit
ws_debit.Cells.AutoFilter
ws_debit.Cells.EntireColumn.AutoFit
ws_result.Cells(1, 7).Value = date_ref
ws_result.Cells(1, 8).Value = " CIF Analysis"
ws_result.Cells(1, 3).Value = name
ws_result.Cells(6, 7).Value = "> 360 days :"
ws_result.Cells(7, 7).Value = "271 - 360 days :"
ws_result.Cells(8, 7).Value = "181 - 270 days :"
ws_result.Cells(9, 7).Value = "91 - 180 days :"
ws_result.Cells(10, 7).Value = "< 90 days :"
ws_result.Cells(6, 1).Value = "> 360 days :"
ws_result.Cells(7, 1).Value = "271 - 360 days :"
ws_result.Cells(8, 1).Value = "181 - 270 days :"
ws_result.Cells(9, 1).Value = "91 - 180 days :"
ws_result.Cells(10, 1).Value = "< 90 days :"
' impression suivant l'analyse faite avc switch = operateur booleen
demand = MsgBox("Go to the print preview ?", vbYesNo)
If demand = vbYes Then
UserForm5.Show
ws_credit.PrintPreview
ws_debit.PrintPreview
ws_source.PrintPreview
Else: ws_result.Select
End If
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :