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 IntegerLong ?

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 ou Dim 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 ) , cependant je privilégie malgré tout Long en général car Integer est bien trop limité

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 ou Dim 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 :

https://docs.microsoft.com/en-us/previous-versions/office/developer/office2000/aa164506(v=office.10)?redirectedfrom=MSDN

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 :

image

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.

Rechercher des sujets similaires à "erreur calcul derniere ligne tableau"