Se connecter avec
S'enregistrer | Connectez-vous

Incompatibilité de type sur un calcul de somme...

Dernière réponse : dans Programmation
Expert 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 ...

  1. Dim ws_source As Worksheet
  2. Dim ws_credit As Worksheet
  3. Dim ws_debit As Worksheet
  4. Dim ws_result As Worksheet
  5. Dim date_ref As Date
  6. Dim dc_colname As String
  7. Dim date_colname As String
  8. Dim amount_colname As String
  9. Dim is_credit_debit As Boolean
  10. Dim name As String
  11. Dim switch As Boolean
  12.  
  13. Dim dc_type As dc_enum
  14. Dim row_source As Range
  15. Dim row_target(Debit To Credit) As Range
  16. Dim date_(1 To 4) As Date
  17. Dim i As Integer
  18. Dim j As Integer
  19. Dim j0 As Integer
  20. Dim i0 As Integer
  21. Dim sums(Debit To Credit, 1 To 5) As variant
  22. Dim ops(Debit To Credit, 1 To 5) As Long
  23.  
  24. Dim c_count As Long
  25. Dim d_count As Long
  26.  
  27. Set ws_source = Worksheets("Sheet1")
  28. Set ws_credit = Worksheets("Credit")
  29. Set ws_debit = Worksheets("Debit")
  30. Set ws_result = Worksheets("Result")
  31.  
  32. Set row_target(Credit) = ws_credit.Rows(2)
  33. Set row_target(Debit) = ws_debit.Rows(2)
  34.  
  35. c_count = 0
  36. d_count = 0
  37. [...]
  38. For i = 1 To 4
  39. date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
  40. Next
  41. For Each row_source In ws_source.Rows
  42. is_credit_debit = True
  43. Select Case IsNumeric(ws_source.Cells(, amount_colname).Value)
  44. Case Is >= 0: dc_type = Credit: c_count = c_count + 1
  45. Case Is < 0: dc_type = Debit: d_count = d_count + 1
  46. Case Else: is_credit_debit = False
  47. End Select
  48.  
  49. If is_credit_debit = True Then
  50. row_source.Copy row_target(dc_type)
  51. i0 = 5
  52. For i = 4 To 1 Step -1
  53. If IsDate(row_target(dc_type).Cells(, date_colname).Value) >= date_(i) Then
  54. i0 = i
  55. End If
  56. Next
  57. ops(dc_type, i0) = ops(dc_type, i0) + 1
  58. sums(dc_type, i0) = sums(dc_type, i0) + Cdec(row_target(dc_type).Cells(, amount_colname).Value)
  59. Set row_target(dc_type) = row_target(dc_type).Offset(1)
  60. End If
  61. Next
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Arrête de mettre des = True partout, c'est inutile. Un truc déjà vrai n'a pas besoin d'être recomparé à Vrai :pt1cable: 

Ligne 3, c'est du grand n'importe quoi ! Tu fais le Select sur quoi ?
A revoir !

Tu as bien mis un point d'arrêt et tu exécutes ton code pas à pas comme dans le tuto ?
Expert Programmation

Salut Oozenot, :hello: 

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 :pt1cable: 
Expert Programmation

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 !!) :heink: 

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 . :whistle: 

voila... toujours le meme probleme..
Expert Programmation

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. :o 

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)


Ca dit quoi ?
Expert Programmation

alors ca dit...
pour celui là
  1. sums(dc_type, i0)

il ne veux même pas en entendre parler... erreur de compilation
  1. row_target(dc_type).Cells(, amount_colname)

la même

pour ces 2 là, une fois que je supprime les 2 lignes supérieures :
  1. 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)

  1. 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... :( 
Expert Programmation

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...
Expert Programmation

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.. :??: 
  1. UserForm3.TextBox1.Value = ""
  2. UserForm3.TextBox2.Value = ""
  3. UserForm3.TextBox3.Value = ""
  4. UserForm3.TextBox4.Value = ""
  5. UserForm3.Show
  6. If Not IsDate(UserForm3.TextBox1.Value) Then
  7. MsgBox "You haven't written in the right format"
  8. Exit Sub
  9. End If
  10.  
  11. date_colname = UCase(UserForm3.TextBox2.Value) ' definied variable from userform entries
  12. amount_colname = UCase(UserForm3.TextBox3.Value)
  13. date_ref = UserForm3.TextBox1.Value
  14. name = UserForm3.TextBox4.Value
  15.  
  16. MsgBox " You've entered the name :" & name & vbCr & _
  17. "You've entered the value date :" & date_ref & vbCr & _
  18. "You've entered Date column :" & date_colname & vbCr & _
  19. "You've entered Amount column :" & amount_colname, vbOKOnly
  20.  
  21. For i = 1 To 4
  22. date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
  23. Next
  24. For Each row_source In ws_source.Rows
  25.  
  26. Select Case IsNumeric(ws_source.Cells(, amount_colname).Value) = True
  27. Case Is >= 0: dc_type = Credit: c_count = c_count + 1: is_credit_debit = True
  28. Case Is < 0: dc_type = Debit: d_count = d_count + 1: is_credit_debit = True
  29. Case Else: is_credit_debit = False
  30. End Select
  31.  
  32. If is_credit_debit = True Then
  33. row_source.Copy row_target(dc_type)
  34. i0 = 5
  35. For i = 4 To 1 Step -1
  36. If row_target(dc_type).Cells(, date_colname).Value >= date_(i) Then
  37. i0 = i
  38. MsgBox "" & row_target(0).Cells(, date_colname).Value & vbCr & _
  39. "" & row_target(1).Cells(, date_colname).Value
  40. End If
  41. Next
  42. ops(dc_type, i0) = ops(dc_type, i0) + 1
  43. sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(, amount_colname).Value)
  44. Set row_target(dc_type) = row_target(dc_type).Offset(1)
  45. End If
  46. Next
  47.  
  48.  
  49. MsgBox "Credit: " & c_count & vbCr & _
  50. "Debit: " & d_count & vbCr & _
  51. "Total : " & c_count + d_count, , "Trouvés"
  52.  
  53. For dc_type = Debit To Credit
  54. rn = 6
  55. For i = 5 To 1 Step -1
  56. ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i), 2)
  57. ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i)
  58. rn = rn + 1
  59. Next
  60. Next
Expert Programmation

______________________
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Never trust user input
______________________
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯


Tu te l'imprimes et tu te le mets au dessus de ton écran !
:o 

:lol: 
Expert Programmation

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.

  1. For Each row_source In ws_source.Rows
  2.  
  3. Select Case IsNumeric(ws_source.Cells(, amount_colname).Value) = True
  4. Case Is >= 0: dc_type = Credit: c_count = c_count + 1: is_credit_debit = True
  5. Case Is < 0: dc_type = Debit: d_count = d_count + 1: is_credit_debit = True
  6. Case Else: is_credit_debit = False
  7. End Select
  8.  
  9. If is_credit_debit = True Then
  10. row_source.Copy row_target(dc_type)
  11. i0 = 5
  12. For i = 4 To 1 Step -1
  13. If IsDate(row_target(dc_type).Cells(, date_colname).Value) = True And row_target(dc_type).Cells(, date_colname).Value >= date_(i) Then
  14. switch = True
  15. i0 = i
  16. Else: switch = False
  17. End If
  18. Next
  19. If switch = True Then
  20. ops(dc_type, i0) = ops(dc_type, i0) + 1
  21. sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(, amount_colname).Value)
  22. End If
  23. Set row_target(dc_type) = row_target(dc_type).Offset(1)
  24. End If
  25. Next

EDIT : mauvaise nouvelle, il bloque sur le i0 =5... ca ne finira jamais :heink: 
Expert Programmation

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

Expert Programmation

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.

  1. For i = 1 To 4
  2. date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
  3. Next
  4. last_row = ws_source.Range("B1:B65536").End(xlDown).Row
  5. MsgBox "" & last_row
  6. For t = 2 To last_row
  7. is_credit_debit = True
  8. Select Case ws_source.Cells(t, amount_colname).Value
  9. Case Is >= 0: dc_type = Credit: c_count = c_count + 1
  10. Case Is < 0: dc_type = Debit: d_count = d_count + 1
  11. Case Else: is_credit_debit = False
  12. End Select
  13.  
  14. If is_credit_debit Then
  15. ws_source.Rows(t).Copy row_target(dc_type)
  16. i0 = 5
  17. For i = 4 To 1 Step -1
  18. 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
  19. i0 = i
  20. End If
  21. Next
  22. ops(dc_type, i0) = ops(dc_type, i0) + 1
  23. sums(dc_type, i0) = sums(dc_type, i0) + CDbl(row_target(dc_type).Cells(t, amount_colname).Value)
  24. Set row_target(dc_type) = row_target(dc_type).Offset(1)
  25. End If
  26. Next
  27.  
  28. MsgBox "Credit: " & c_count & vbCr & _
  29. "Debit: " & d_count & vbCr & _
  30. "Total : " & c_count + d_count, , "Trouvés"
  31.  
  32. For dc_type = Debit To Credit
  33. rn = 6
  34. For i0 = 4 To 1 Step -1
  35. ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i0), 2)
  36. ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i0)
  37. rn = rn + 1
  38. Next
  39. Next

il me reste a régler le fait que la somme ne s'affiche pas comme il faut.
Expert Programmation

probleme résolu

au plaisir !

  1. Dim ws_source As Worksheet
  2. Dim ws_credit As Worksheet
  3. Dim ws_debit As Worksheet
  4. Dim ws_result As Worksheet
  5. Dim date_ref As Date
  6. Dim dc_colname As String
  7. Dim date_colname As String
  8. Dim amount_colname As String
  9. Dim is_credit_debit As Boolean
  10. Dim name As String
  11. Dim switch As Boolean
  12. Dim last_row As Integer
  13.  
  14. Dim dc_type As dc_enum
  15. Dim t As Integer
  16. Dim row_target(Debit To Credit) As Range
  17. Dim date_(1 To 4) As Date
  18. Dim i As Integer
  19. Dim i0 As Integer
  20. Dim sums(Debit To Credit, 1 To 5) As Double
  21. Dim ops(Debit To Credit, 1 To 5) As Long
  22.  
  23. Dim c_count As Long
  24. Dim d_count As Long
  25.  
  26. Set ws_source = Worksheets("Sheet1")
  27. Set ws_credit = Worksheets("Credit")
  28. Set ws_debit = Worksheets("Debit")
  29. Set ws_result = Worksheets("Result")
  30.  
  31. Set row_target(Credit) = ws_credit.Rows(2)
  32. Set row_target(Debit) = ws_debit.Rows(2)
  33.  
  34. c_count = 0
  35. d_count = 0
  36.  
  37. ws_source.Rows(1).Copy ws_debit.Rows(1)
  38. ws_source.Rows(1).Copy ws_credit.Rows(1)
  39. ws_source.Cells.AutoFilter
  40. ws_source.Cells.EntireColumn.AutoFit
  41.  
  42. UserForm3.TextBox1.Value = ""
  43. UserForm3.TextBox2.Value = ""
  44. UserForm3.TextBox3.Value = ""
  45. UserForm3.TextBox4.Value = ""
  46. UserForm3.Show
  47.  
  48. If Not IsDate(UserForm3.TextBox1.Value) Then
  49. MsgBox "You haven't written in the right format"
  50. Exit Sub
  51. End If
  52.  
  53. date_colname = UCase(UserForm3.TextBox2.Value) ' definied variable from userform entries
  54. amount_colname = UCase(UserForm3.TextBox3.Value)
  55. date_ref = UserForm3.TextBox1.Value
  56. name = UserForm3.TextBox4.Value
  57.  
  58. MsgBox " You've entered the name :" & name & vbCr & _
  59. "You've entered the value date :" & date_ref & vbCr & _
  60. "You've entered Date column :" & date_colname & vbCr & _
  61. "You've entered Amount column :" & amount_colname, vbOKOnly
  62.  
  63. For i = 1 To 4
  64. date_(i) = DateAdd("d", -i * 90, date_ref) ' date calculation
  65. Next
  66. last_row = ws_source.Range("B1:B65536").End(xlDown).Row
  67. MsgBox "" & last_row
  68. For t = 2 To last_row
  69. is_credit_debit = True
  70. Select Case ws_source.Cells(t, amount_colname).Value
  71. Case Is >= 0: dc_type = Credit: c_count = c_count + 1
  72. Case Is < 0: dc_type = Debit: d_count = d_count + 1
  73. Case Else: is_credit_debit = False
  74. End Select
  75.  
  76. If is_credit_debit Then
  77. ws_source.Rows(t).Copy row_target(dc_type)
  78. i0 = 5
  79. For i = 4 To 1 Step -1
  80. If IsDate(row_target(dc_type).Cells(t, date_colname).Value) And row_target(dc_type).Cells(t, date_colname).Value >= date_(i) Then
  81. i0 = i
  82. End If
  83. Next
  84. ops(dc_type, i0) = ops(dc_type, i0) + 1
  85. sums(dc_type, i0) = sums(dc_type, i0) + CDbl(ws_source.Cells(t, amount_colname).Value)
  86. Set row_target(dc_type) = row_target(dc_type).Offset(1)
  87. End If
  88. Next
  89. MsgBox "" & sums(1, 3)
  90. MsgBox "Credit: " & c_count & vbCr & _
  91. "Debit: " & d_count & vbCr & _
  92. "Total : " & c_count + d_count, , "Trouvés"
  93.  
  94. For dc_type = Debit To Credit
  95. rn = 6
  96. For i0 = 5 To 1 Step -1
  97. ws_result.Cells(rn, IIf(dc_type = Debit, 5, 11)).Value = Round(sums(dc_type, i0), 2)
  98. ws_result.Cells(rn, IIf(dc_type = Debit, 4, 10)).Value = ops(dc_type, i0)
  99. rn = rn + 1
  100. Next
  101. Next
  102. '---=== affichage ===---
  103. ws_credit.Cells(, date_colname).NumberFormat = "d/m/yyyy"
  104. ws_debit.Cells(, date_colname).NumberFormat = "d/m/yyyy"
  105. ws_credit.Cells.AutoFilter
  106. ws_credit.Cells.EntireColumn.AutoFit
  107. ws_debit.Cells.AutoFilter
  108. ws_debit.Cells.EntireColumn.AutoFit
  109.  
  110. ws_result.Cells(1, 7).Value = date_ref
  111. ws_result.Cells(1, 8).Value = " CIF Analysis"
  112. ws_result.Cells(1, 3).Value = name
  113.  
  114. ws_result.Cells(6, 7).Value = "> 360 days :"
  115. ws_result.Cells(7, 7).Value = "271 - 360 days :"
  116. ws_result.Cells(8, 7).Value = "181 - 270 days :"
  117. ws_result.Cells(9, 7).Value = "91 - 180 days :"
  118. ws_result.Cells(10, 7).Value = "< 90 days :"
  119.  
  120. ws_result.Cells(6, 1).Value = "> 360 days :"
  121. ws_result.Cells(7, 1).Value = "271 - 360 days :"
  122. ws_result.Cells(8, 1).Value = "181 - 270 days :"
  123. ws_result.Cells(9, 1).Value = "91 - 180 days :"
  124. ws_result.Cells(10, 1).Value = "< 90 days :"
  125.  
  126.  
  127. ' impression suivant l'analyse faite avc switch = operateur booleen
  128.  
  129. demand = MsgBox("Go to the print preview ?", vbYesNo)
  130.  
  131. If demand = vbYes Then
  132. UserForm5.Show
  133. ws_credit.PrintPreview
  134. ws_debit.PrintPreview
  135. ws_source.PrintPreview
  136. Else: ws_result.Select
  137. End If


Lassé par la pub ? Créez un compte