Erreur range une fois sur deux

Bonjour,

J'ai réalisé une macro dans SolidWorks, elle a pour but d'ouvrir un fichier Excel et de compléter ce document avec des informations du plan. Or voilà mon problème une fois sur deux (et je dis bien une fois sur deux) j'ai une erreur. Je ne peux pas vous mettre en lien tout mon code pour des problèmes des longueurs mais surtout de confidentialité, je mets donc uniquement le bloc with qui pause problème.

With xlApp

        .Visible = True
        'on compte le nombre de lignes et de colonnes insérées
        Derlig = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
        Dercol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        .ActiveWorkbook.Worksheets("Nom_pieces_uniquement").Activate

                'on crée un tableau sur la plage de cellule où se trouvent les données
'ERREUR SUR LA LIGNE SUIVANTE
                .ActiveWorkbook.ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1), Cells(Derlig, Dercol)), , xlYes).Name = "Tableau33"
                Range(Cells(1, 1), Cells(Derlig, Dercol)).Select
                .ActiveWorkbook.ActiveSheet.ListObjects("Tableau33").TableStyle = "TableStyleLight1"
 End with

J'ai pu m'apercevoir que dans le gestionnaire des tâches l'application Excel restait ouverte alors qu'à la fin du programme je lui demande bien de fermer le classeur puis de quitter l'application et enfin je vide toutes mes variables. Lorsque je ferme ce qu'il y a dans le gestionnaire des tâches, j'ai souvent un autre rpoblème lié au serveur.

Merci d'avance pour votre aide

Bonne après midi

Bonjour,

Essayez ce code pour voir :

With xlApp
    .Visible = True
    with .ActiveWorkbook.Worksheets("Nom_pieces_uniquement")
        with .ListObjects.Add(source:=.Range("A1").currentregion), xllistobjecthasheaders:=xlYes, tablestylename:="TableStyleLight1")
            .Name = "PIECES"
        end with
    end with
End with

Sinon, je conseille de :

- cibler le classeur par son nom, à la place de activeworkbook, si celui-ci a déjà été sauvé car ça évite toute mauvaise surprise (ex : workbooks("monclasseur.xlsx")). Et si le classeur en question est le classeur exécutant le code, alors utiliser thisworkbook

- nommer les feuilles simplement, ex : "Pieces" ou "NomsPieces"

- nommer les tableaux structurés de façon claire, ex : "PIECES"

Cdlt,

Bonjour 3GB,

Merci pour ton aide tu m'as fait découvrir "currentregion" qui me fait gagner deux lignes de code.

Par contre la parade n'a pas fonctionné et j'ai toujours le message d'erreur.

J'ai bien pensé à travailler avec le nom du classeur mais pour une question de simplicité j'espérais pouvoir garder mon fonctionnement de départ en enregistrant à la fin des modifications (je vais adapter le code en espérant que ça pourra résoudre le problème).

En ce qui concerne le nom des feuilles c'est à la demande des utilisateurs, et je sais que les noms de tableaux m'avaient également posés des problèmes dans des précédents développements je vais changer ça, mais ça ne n'empêchera pas l'erreur actuelle.

Bonne soirée

Bonjour,

quel message d'erreur exactement ?
Quel ligne avec Range en erreur ?
Que valent Derlig et Dercol au moment de l'erreur ?
Pas de . devant Range, c'est voulu ?

et enfin je vide toutes mes variables

tu fais bien Set xlApp = Nothing avant de tout fermer pour nettoyer proprement ?

eric

image

C'est cette erreur qui apparaît mais avec le "." devant le range cette erreur se déplace plus loin dans le code ! (sinon la ligne qui était concernée était signalée dans le code...) , bref une partie du problème de résolue. Ce matin j'essaye d'écourter les noms des feuilles et des tableaux. Puis ensuite d'utiliser thisworkbook peut être ça peut résoudre mes problèmes. Et oui je vide toutes mes variables vraiment toutes.

With .ActiveWorkbook.Worksheets("Nom_pieces_uniquement").ListObjects("TAB").Sort

            'on tri les lignes dans l'ordre décroissant de la colonne "tri"
            'à présent l'erreur se situe ici mais mettre un point devant le range me renvoi une erreur différente.
            .SortFields.Add Key:=Range("TAB[tri]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply

        End With
image

Bonjour,

on ne met pas thisworkbook au hasard.
thisworkbook est le classeur avec cette macro, ActiveWorkbook est le classeur actif (qui peut être autre...)

Essaie avec :=Range("TAB[tri]").Value
Sinon essaie en mettant la valeur dans une variable intermédiaire.
Et c'est quoi "TAB[tri]" ?
eric

 With .Workbooks(nomfich & ".xlsx").Worksheets("Nom_pieces_uniquement").ListObjects("TAB").Sort

            'on tri les lignes dans l'ordre décroissant de la colonne "tri"
            'ERREUR SUR CETTE LIGNE
            .SortFields.Add Key:=Range("TAB[tri]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply

        End With

TAB désigne le nom d'un tableau et tri le nom d'une colonne de ce tableau, .Value ne fonctionne donc pas sur ce range.

Cette commande me permet de trier les lignes d'un tableau à partir de valeurs dans la colonne tri et de manière décroissante, peut être existe t'il une autre méthode que je ne connais pas.

Bonjour à tous,

Pouvez-vous essayer ce code :

 With .Workbooks(nomfich & ".xlsx").Worksheets("Nom_pieces_uniquement")
     with .ListObjects("TAB").Sort
        .sortfields.clear
        .SortFields.Add Key:=Range("TAB[tri]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    end with
End With

En général, on réinitialise le filtre avant d'ajouter des champs.

Il faut bien que la colonne tri de votre tableau existe et soit orthographiée à l'identique.

Si ça bloque toujours, essayez en remplaçant ainsi la ligne (on précise la feuille à laquelle appartient la plage définie en champ de tri) :

.SortFields.Add Key:=Worksheets("Nom_pieces_uniquement").Range("TAB[tri]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

Sinon, il existe une autre méthode qui consiste à trier sur la feuille en ciblant la range à trier avec la méthode setrange de l'objet sort mais ça reste moins bien je pense.

Cdlt,

.SortFields.Add Key:=xlApp.Workbooks(nomfich & ".xlsx").Worksheets("Nom_pieces_uniquement").Range("TAB[tri]"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

J'ai modifié la ligne comme ceci et ça fonctionne, je n'aurai pas pensé que c'était utile comme on répète les éléments du with.

L'erreur c'est une nouvelle fois déplacée mais c'est bon je pense que j'ai compris à chaque fois il faut que je déclare classeur-feuille-range

With .Workbooks(nomfich & ".xlsx").Worksheets("Nom_pieces_uniquement")

            'on supprime la colonne "tri"
            .Range("TAB[tri]").Select
            'ERREUR SUR LA LIGNE SUIVANTE
            Selection.ListObject.ListColumns(11).Delete

End With
image

En fait, le with précédent portait sur l'objet .sort et plus sur la feuille "nom...". La plupart du temps, il n'est pas nécessaire de préciser la feuille (et le classeur) à nouveau. Je ne sais pas pourquoi mais il faut le faire lorsqu'on utilise certaines worksheetfunction ou, et ça semble plus logique, quand on a plusieurs classeurs ouverts.

Pour ce nouvel extrait, on peut faire comme ceci en supposant que la colonne 11 soit bien la colonne tri :

With .Workbooks(nomfich & ".xlsx").Worksheets("Nom_pieces_uniquement")
    .ListObjects("TAB").ListColumns("tri").Delete
End With

Ici, le bloc with n'est plus vraiment utile d'ailleurs.

Cdlt,

Bonjour,

D'accord je comprends mieux. J'ai fini de tout réparer à présent tout fonctionne et tout le temps. Merci beaucoup pour votre aide.

Je pense que la déclaration est obligatoire comme je code à partir de SolidWorks.

Encore merci
Bonne journée

Rechercher des sujets similaires à "erreur range fois deux"