Erreur sur calcul de la dernière ligne d'un tableau
Bonjour à tous !
Je travaille actuellement sur une macro dont le but est de déterminer un taux de retard.
Je m'explique :
J'importe, depuis un fichier txt, une base de données contenant les en-cours clients en fonction du gestionnaire comptable. Le but est de sommer tout ces en-cours par gestionnaire et, en fonction de l'en-cours total (correspondant aux échu + à échoir), déterminer le taux de retard (échu/total)
La bécane tourne pas trop mal, mais je rencontre un problème... Je calcule la dernière ligne du tableau afin d'éviter de bouffer de la mémoire inutilement, cependant cela me renvoie un code d'erreur 438 "Propriété ou méthode non gérée par cet objet"...
Je ne comprends pas pourquoi, sachant que dans un autre module de cette macro, je calcule également la dernière ligne d'un autre tableau...
Et de même dans une autre macro que j'ai faite également, dont j'ai également besoin de chercher la dernière ligne du tableau, pas de problème ça fonctionne !
Et en écrivant ce message je viens de tilter : Là où ça fonctionne, il s'agit du Wbk où je lance la macro. Là où ça ne fonctionne pas, il s'agit de Wbk que je vais chercher... Est-ce lié ?
Je vous joins le code (la ligne en erreur est la ligne de commentaire)
Option Explicit
Dim Import As Workbook
Dim derlig As Range
Sub OuvertureBalAgee()
Workbooks.OpenText Filename:="MonDossier", StartRow:=1, _
DataType:=xlDelimited, TextQualifier:=xlNone, ConsecutiveDelimiter _
:=False, Semicolon:=True, DecimalSeparator:="."
Set Import = ActiveWorkbook
With Import
.Activate
'derlig = .Cells(Application.Rows.Count, 1).End(xlUp).Row
.Range("A1:Y" & derlig).Copy Sheets("Base de données").Range("A1")
Application.DisplayAlerts = False
Import.Close
End With
End Sub
Et j'en profite pour vous mettre le deuxième code où ça pêche pour le calcul de la dernière ligne :
Option Explicit
Public Mt_Retard As Double
Public Mt_Fac_Litige As Double
Public Mt_Litige As Double
Public Mt_Encours As Double
Public derniere_ligne As Variant
Public EcritLitiges As Workbook
Public derliglit As Long
Public MaPlage As Range
Dim i As Variant
Dim k As Variant
Sub Calculs()
With EcritLitiges
.Activate
'derliglit = .Cells(Application.Rows.Count, 1).End(xlUp).Row
Worksheets(1).Name = "Etat des écritures en litige"
End With
With Workbooks("Taux retard V-1")
.Activate
With Sheets("Base de données")
.Activate
derniere_ligne = .Cells(Application.Rows.Count, 1).End(xlUp).Row
Mt_Retard = 0
Mt_Fac_Litige = 0
Mt_Litige = 0
Mt_Encours = 0
For i = 2 To derniere_ligne
Set MaPlage = .Range("T" & i & ":Z" & i)
.Cells(i, 27) = Application.WorksheetFunction.Sum(MaPlage)
.Cells(i, 29) = Application.WorksheetFunction.SumIf(EcritLitiges.Sheets("Etat des écritures en litige").Range("B2:T" & derniere_ligne), .Cells(i, 4), EcritLitiges.Sheets("Etat des écritures en litige").Range("T2:T" & derniere_ligne))
.Cells(i, 28) = Application.WorksheetFunction.SumIf(EcritLitiges.Sheets("Etat des écritures en litige").Range("B2:S" & derniere_ligne), .Cells(i, 4), EcritLitiges.Sheets("Etat des écritures en litige").Range("S2:S" & derniere_ligne))
.Cells(i, 30) = .Cells(i, 27) - .Cells(i, 29)
If .Cells(i, 9) = "101" Then
Mt_Retard = Mt_Retard + .Cells(i, 27).Value
Mt_Fac_Litige = Mt_Fac_Litige + .Cells(i, 28).Value
Mt_Litige = Mt_Litige + .Cells(i, 29).Value
Mt_Encours = Mt_Encours + .Cells(i, 18).Value
Else
If IsEmpty(.Cells(i, 9)) = True Then
.Cells(i, 9) = "ND"
End If
End If
Next
End With
End With
EcritLitiges.Save
EcritLitiges.Close
With Sheets("101")
For k = 2 To 14
If .Cells(1, k - 1) <> Date Then
.Cells(1, k) = Date
.Cells(2, k) = Mt_Encours
.Cells(3, k) = Mt_Retard
.Cells(4, k) = Mt_Fac_Litige
.Cells(5, k) = Mt_Litige
.Cells(6, k) = Mt_Retard - Mt_Litige
.Cells(7, k) = (.Cells(6, 2) / .Cells(2, 2))
.Cells(7, k).NumberFormat = "#,##0.00%"
Else
If k = 14 Then
.Range("B2:N7").ClearContents
.Cells(1, 2) = Date
.Cells(2, 2) = Mt_Encours
.Cells(3, 2) = Mt_Retard
.Cells(4, 2) = Mt_Fac_Litige
.Cells(5, 2) = Mt_Litige
.Cells(6, 2) = Mt_Retard - Mt_Litige
.Cells(7, 2) = .Cells(6, 2) * (1 / .Cells(2, 2))
.Cells(7, 2).NumberFormat = "#,##0.00%"
Else
If .Cells(2, k - 2) <> "" Then
Exit For
End If
End If
End If
Next
End With
Mt_Retard = 0
Mt_Fac_Litige = 0
Mt_Litige = 0
Mt_Encours = 0
N'hésitez pas s'il manque des choses, je ne suis pas familier des forums...
MR
Personne ne peut répondre à ma demande?...
Bonjour Mycka, le forum,
derlig = .Cells(Application.Rows.Count, 1).End(xlUp).Row
Il te faut peut-être préciser sur quelle feuille tu agis ?
Cordialement,
Bonjour Mycka, le forum,
derlig = .Cells(Application.Rows.Count, 1).End(xlUp).Row
Il te faut peut-être préciser sur quelle feuille tu agis ?
Cordialement,
Bonjour xorsankukai,
Merci tout d''abord pour ta réponse.
Malheureusement, je viens de tester (effectivement c'est un bête oubli...) mais ça ne fonctionne toujours pas, j'ai maintenant une erreur 91 du type "Variable objet ou variable de bloc With non définie", or j'ai pourtant bien défini toutes mes variables...
Bonjour Mycka, le forum,
derlig = .Cells(Application.Rows.Count, 1).End(xlUp).Row
Il te faut peut-être préciser sur quelle feuille tu agis ?
Cordialement,
Bonjour xorsankukai,
Merci tout d''abord pour ta réponse.
Malheureusement, je viens de tester (effectivement c'est un bête oubli...) mais ça ne fonctionne toujours pas, j'ai maintenant une erreur 91 du type "Variable objet ou variable de bloc With non définie", or j'ai pourtant bien défini toutes mes variables...
Re,
Dim derlig As Range
Ne serait-ce pas plutôt Integer où Long ?
Cordialement,
Bonjour xorsankukai,
exact ! ➯ Dim derlig As Long
ou Dim derlig&
mais pour un n° de ligne, éviter le type Integer car maxi = 32 767
➯ plantage si ligne > 32767
dhany
J'avais essayé Long mais sans succès, mais Integer ne m'était pas venu à l'idée... Et là ça fonctionne (J'avoue me sentir un peu bête)
Merci beaucoup !
Bonjour Mycka,
relis mon post précédent car je l'ai complété.
tu as Excel 2013 ; n° ligne maxi : 1 048 576
➯ si n° ligne > 32 767 : plantage !
dhany
Bonjour xorsankukai,
exact ! ➯
Dim derlig As Long
ouDim derlig&
mais pour un n° de ligne, éviter le type Integer car maxi = 32 767
➯ plantage si ligne > 32767
dhany
Effectivement, mais mes tableaux dépassent très rarement les 10000 lignes (malheureusement nous n'avons pas autant de clients
par contre, le type Integer est tout à fait approprié pour un n° de colonne :
colonne maxi : XFD ; n° colonne correspondant : 16 384
ça tient sans problème dans la plage numérique d'un Integer : -32 768 à 32 767
Dim col As Integer
ou Dim col%
dhany
par contre, le type Integer est tout à fait approprié pour un n° de colonne :
colonne maxi : XFD ; n° colonne correspondant : 16 384
ça tient sans problème dans la plage numérique d'un Integer : -32 768 à 32 767
Dim col As Integer
ouDim col%
dhany
Ca par contre je l'ignorais, c'est toujours bon à savoir !
@Mycka
réponse à ton post précédent de 15:20
attention à ces 2 pièges, car ils sont possibles même si tu n'utilises que les 10000 premières lignes de la feuille :
1) .Cells(Application.Rows.Count, 1).End(xlUp).Row
: Rows.Count = 1 048 576
2) si ton code utilise ActiveCell.Row
: plantage si n° ligne active > 32 767
ajout : on s'est croisés, mais j'ai lu ton post précédent.
si tu as besoin d'autre chose, je repasse le relais
à notre ami xorsankukai.
dhany
Bonjour,
Pour info :
Traditionnellement, les programmeurs VBA ont utilisé des entiers pour contenir de petits nombres, parce qu'ils nécessitaient moins de mémoire. Dans les versions récentes, cependant, VBA convertit toutes les valeurs Integer pour taper Long, même si elles sont déclarées comme type Integer. Il n'y a donc plus d'avantage sur les performances à utiliser les variables Integer ; en fait, les variables longues peuvent être légèrement plus rapides parce que VBA n'a pas à les convertir.
Bonjour,
traduction en français :

je cite cette phrase : « En fait, les variables longues peuvent être légèrement plus rapides car VBA n'a pas à les convertir. »
mais ça, c'est si une variable de type Integer est utilisée dans une expression où un Long est utilisé :
conversion automatique selon le type le plus étendu de l'expression (étendu = plage numérique la plus large).
dhany
Re,
Pour résumer, il est inutile de déclarer une variable en Integer, la déclarer en Long !
Sauf pour les cas indiqués dans le lien.
Cdlt.