Listrows.add erreur 1004

Bonjour à tous,

Après de nombreuses tentatives, je n'arrive pas résoudre mon problème. Lorsque la macro arrive sur la ligne "Set oLigneDestination" j'ai l'erreur 1004 qui apparait: Nous ne pouvons effectuer cette action car cela impliquerait le déplacement de cellules d'un tableau de votre feuille de calcul.

Je me doute que le problème vient du fait qu'en dessous de mon tableau dans lequel j'applique le "Listrows.add", j'ai un autre tableau deux lignes plus bas. En effet sans avoir de tableau sous ce tableau, la macro fonctionne parfaitement. Pour palier au problème j'ai créé une variante du code dessous pour qu'une ligne soit insérée par la macro avant d'appliquer le listrows.add. La ligne s'insère bien mais le problème persiste avec le même code erreur. Idem en ajoutant AlwaysInsert:=True après le .add

J'espère que vous saurez m'aider par ce que là pour le coup je sèche complet!

ps: je débute plus ou moins en vba ou du moins j'ai encore beaucoup de choses à apprendre

Sub Ajoute_Ligne(Contenu As String, onomTableau As ListObject)
    ' Ajoute les informations de la LigneSource dans le tableau de destination

    Dim PositionLigneDestination As Long
    Dim oLigneDestination As ListRow

    Set oLigneDestination = onomTableau.ListRows.Add

    PositionLigneDestination = oLigneDestination.Index + 1

    onomTableau.Range.Cells(PositionLigneDestination, onomTableau.ListColumns(1).Index) = Contenu

    Set oLigneDestination = Nothing
End Sub

Merci !

Bonjour

Remplace

     Set oLigneDestination = onomTableau.ListRows.Add

    PositionLigneDestination = oLigneDestination.Index + 1
    onomTableau.Range.Cells(PositionLigneDestination, onomTableau.ListColumns(1).Index) = Contenu
    Set oLigneDestination = Nothing

par

Dim oLigneDestination  as long
 oLigneDestination =onomTableau.ListRows.Add.Index
 onomTableau.DataBodyRange.Columns(1).Rows(oLigneDestination) = Contenu
 

Edit : erreur corrigée

Bonjour 78chris,

Après vérification, le problème persiste avec le même code erreur et est vraiment ciblé sur la ligne .add

Salut tout le monde,

essaie comme ca

 Sub Ajoute_Ligne(Contenu As String, onomTableau As ListObject)
    ' Ajoute les informations de la LigneSource dans le tableau de destination

    Dim PositionLigneDestination As Long
    Dim oLigneDestination As ListRow

    Set oLigneDestination = onomTableau.ListRows.Add(AlwaysInsert:=True)

    PositionLigneDestination = oLigneDestination.Index + 1

    onomTableau.Range.Cells(PositionLigneDestination, onomTableau.ListColumns(1).Index) = Contenu

    Set oLigneDestination = Nothing
End Sub

Sinon il faut voir si la feuille est protegee, si oui il faut utiliser unprotect.

@+++

Bonjour m3ellem1,

Exactement le même problème.

PS: Je n'ai aucune protection sur le classeur.

On peut voir un fichier test?

Bonjour à tous,

Est-ce que l'on peut connaître la version d'Excel utilisée ... Incluant 32 ou 64 bits...?

ric

Alors j'utilise Excel 2019 sur un ordi 64 bits.

Selon vous, la présence d'un tableau sous le tableau d'import ne devrait pas poser de problème avec le .add?

Il va m'être difficile de mettre à dispo le fichier source dans un premier temps puisque c'est un fichier pro je dois donc le retravailler.

Merci

RE

J'ai testé mon code avec 2 tableaux l'un sous l'autre sans problème.

Le second tableau s'arrête à quelle ligne ?

Bonjour à tous,

Alors j'utilise Excel 2019 sur un ordi 64 bits. ...

Je serai surpris que le Windows ne soit pas en 64 bits.

Ce que je demandais : "Est-ce que cette version d'Excel 2019 est une version 32 ou 64 bits ?"

Quoi qu'il en soit ... j'ai testé ton code sur "Excel 365 fr 32 bits" et "Excel 365 fr 64 bits".

Dans les deux cas, ça fonctionne bien.

Sans un bout de fichier représentatif sur lequel le souci s'avère ... c'est difficile ...

ric

Re

@ric

La version que j'utilise est une 32 bits après vérification. Je comprends qu'avec un simple extrait de code ce soit difficile de cerner le problème. J'espère pouvoir retravailler le fichier d'ici demain pour vous le mettre à dispo.

@78chris

Le 1er tableau commence en ligne 23 et est vide

Le 2ème tableau commence en ligne 28 et est également vide

Je vais essayer demain de faire tourner le fichier sur une autre machine avec excel 2013 pour voir si j'ai le même résultat...

RE

Vide mais bien défini jusqu'à la ligne 29 seulement ?

Peux-tu joindre ton fichier (ou juste cet onglet de ton fichier )

Bonjour à tous,

Après de nombreux essais de codes différents, je ne crois plus à un problème de code.

J'ai essayé mon fichier sur excel 2013. J'ai eu la même erreur avec une désignation légèrement différente. De mémoire, l'erreur disait que je n'étais pas autorisé a déplacer des cellules de tableaux.

J'ai donc recrée à l'instant un fichier excel complet pour tester si ce problème était spécifique à mon fichier initial mais le problème persiste! N'aurais-je pas un mauvais paramétrage d'excel?

Vous trouverez donc joint le bout de fichier recréé avec l'extrait de code. Est-ce suffisant?

Pour vous mettre un peu dans le contexte, je développe un code me permettant d'importer les caractéristiques d'un autre classeur afin d'en manipuler les données. Mon idée est bien évidemment d'éditer un code capable de s'adapter à tous les classeurs excel ou presque.

Dans un premier temps je déclare l'adresse du fichier source (1er tableau), puis la feuille source (2ème tableau), puis le tableau source dans lequel se trouvent les données à importer (3ème tableau).

Ensuite, j'enclenche ma macro d'import qui renseigne dans le 4ème tableau l'ensemble des titres des colonnes du tableau source.

C'est dans cette macro d'import que se trouve le code posant problème du fait de la présence d'un 5ème tableau en dessous. Pour rappel si le 5ème tableau est supprimé le code fonctionne parfaitement...

Merci pour votre aide en tout cas.

14test.xlsm (19.04 Ko)

RE

Tu ne peux pas avoir des tableaux plus larges sous le tableau auquel tu veux ajouter des lignes car cela ne décalant que la colonne A, le tableau suivant sur 2 colonnes ne peux bouger

La superposition de tableaux n'est pas conseillée de façon générale mais si tu le fais, il faut que les tableaux situés dessous soient de même largeur ou plus étroits

Re,

Je n'avais pas connaissance de ce point. Ceci dit après explication cela parait logique... et je suppose qu'il n'existe pas de code simple ou autre manière de procéder afin de contourner le problème?!

RE

Que ce soit manuellement ou par code cela n'est pas possible

Je ne vois pas trop l'intérêt opérationnel de superposer des tableaux évolutifs...

Pourquoi ne pas les juxtaposer ?

Bonjour,

Pourquoi ne pas les juxtaposer ?

Je trouve que c'est un drôle de conseil à donner à un novice !

Les tableaux structurés ça se met sur 2 feuilles différentes . Point. (sauf si ce sont des tableaux de paramètres)

On a déjà mis 10 ans à savoir que ça existait : Dans 2O ans on en reparlera...

Enfin c'est juste mon opinion, hein. C'est pour ça que la partage !

Bonne journée

A+

RE

De façon générale, je conseille aussi de ne pas mettre sur un même onglet des tableaux opérationnels mais vu ce que contient l'exemple, on ne sait quel est la contexte et le nature des tableaux...

Bonjour,

Avec un peu de retard, j'ai finalement opté pour une solution d'insertion de ligne et de redimensionnement du tableau pour palier à l'erreur. Effectivement je n'ai pas pour habitude de superposer les tableaux mais dans mon cas je n'ai pas le choix.

Néanmoins je me retrouve à présent face à un problème pour importer les données dans mon tableau ou du moins les données ne s'importent pas correctement.

Voici donc le code que j'ai créé, aucune erreur n'apparait mais l'import ne se fait pas dans les bonnes lignes de mon tableau de destination, voir même à l'extérieur du tableau. Après de nombreux essais, je n'arrive pas à trouver la solution... j'ai encore du pain sur la planche pour comprendre le fonctionnement des objets!

Constantes:

Global oFeuilleSource As Worksheet
Global oFeuilleDestination As Worksheet
Global oTableauDestination As ListObject
Global oTableauSource As ListObject

Extrait Macro principale:

For Each Ligne In oTableauSource.DataBodyRange.Rows
    If oTableauSource.ListColumns("Je07 à produire GF").Range(Ligne.Row) = "x" And oTableauSource.ListColumns("Etat du document").Range(Ligne.Row) = "Prévu" Then

         Set oLigneSource = oTableauSource.ListRows.Item(Ligne.Row)

         PositionLigneSource = oLigneSource.Index

         Set oTableauDestination = getTableau(oFeuilleDestination, "Données")

         Insert_Ligne oTableauDestination

         Condition_Import PositionLigneSource, oTableauDestination

         End If
Next

Macro secondaires :

Sub Insert_Ligne(oTableauDestination As ListObject)

    Dim DerLigneTableau As Integer
    Dim j As Integer

    If oTableauDestination.DataBodyRange Is Nothing Then
        j = 1
    Else: j = oTableauDestination.ListRows.Count
    End If

    DerLigneTableau = oTableauDestination.Range.Row + j

    With oFeuilleDestination
        .Rows(DerLigneTableau + 1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        'Redimensionnement tableau

        oTableauDestination.Resize 

        oTableauDestination.Range.Resize(oTableauDestination.Range.Rows.Count + 1, oTableauDestination.Range.Columns.Count)

    End With

End Sub
Sub Condition_Import(PositionLigneSource As Long, oTableauDestination As ListObject)

    Dim PositionLigneDestination As Long

    PositionLigneDestination = oTableauDestination.ListColumns(1).Range.Find("", SearchDirection:=xlNext).Row

    With oTableauDestination
        .DataBodyRange(PositionLigneDestination, oTableauDestination.ListColumns("PORTEUR").Index) = oTableauSource.DataBodyRange(PositionLigneSource, oTableauSource.ListColumns("Porteur (rédaction)").Index).Value
        .DataBodyRange(PositionLigneDestination, oTableauDestination.ListColumns("DOCUMENT").Index) = oTableauSource.DataBodyRange(PositionLigneSource, oTableauSource.ListColumns("Désignation du Document").Index)

    End With

    Set oLigneDestination = Nothing

End Sub
Rechercher des sujets similaires à "listrows add erreur 1004"