Erreur 400 - Copie de cellule dans un tableau

Bonjour,

J'ai essayer plein de chose mais j'ai toujours l'erreur 400 qui revient et je ne comprends pas d'où ça vient, malgré mes recherches...

Mon problème est que j'ai une feuille "Accueil" où il faut remplir des cellules.

Et je voudrais copier ces cellules, via mon bouton, dans la dernière ligne vide d'un tableau qui se situe sur une autre feuille.

Je pense que le souci est que pour créer ces feuilles j'ai déjà un code (dupliquer) avec un inputbox qui permet de les copier/coller depuis ma feuille "bordereau" et de renommer automatique la feuille ainsi qu'il renomme la tableau qui est dessus. je sais pas si c'est bien clair... je vous mets le fichier mon problème est sur la macro "EnregistrerDepense"

Merci d'avance de vous pencher sur mon problème !

Bonjour,

  • ton erreur 400 provient d'un micamac dans les noms de zones et de la position de la macro que tu as mises dans l'onglet accueil ...
  • mais il n'y a pas que cela, car ensuite le xlup va pointer en-dessous des sous-totaux de ton tableau

je vais regarder plus en détail cet apm comment résoudre au moins ces 2 points

Ah ok, c'est vrai que je me suis fait la réflexion qu'après si ça avait une importance la position de la macro...

Merci pour tes lumières, j'attends donc ton retour!

Merci beaucoup pour ton aide !

Pour le choix de la ligne :

ceci te donnera ligne = 2 car le calcul se fait sur la feuille accueil même si tu as activé une autre feuille

Sub EnregistrerDepense()

Dim Ligne As Long

    Worksheets(Range("Choix_bordereau").Value).Activate
    Ligne = Range("A" & Rows.Count).End(xlUp).Row + 1
MsgBox Ligne
End Sub

alors que ceci te donnera ligne = 28 qui pointe sur la bonne feuille, mais ce n'est pas non plus la bonne valeur car elle se situe en dessous de sous-total

Sub EnregistrerDepense()

Dim Ligne As Long

    Worksheets(Range("Choix_bordereau").Value).Activate
    Worksheets(Range("Choix_bordereau").Value).Range("A" & Rows.Count).End(xlUp).Row + 1
MsgBox Ligne
End Sub

et si tu mets xldown à partir de A9

Ligne = Worksheets(Range("Choix_bordereau").Value).Range("A9").End(xlDown).Row + 1

ce sera toujours 28 car même si ton tableau semble vide il ne l'est pas vraiment. Tout au moins les cellules contiennent un tableau (vide)

Venons-en maintenant au schmilblick qui produit erreur 400. C'est ici

Cells(Ligne, Range("Tab_recap_date").Column) = Sheets("Accueil").Range("C13").Value

il faut doublement préciser la feuille ...

Sub EnregistrerDepense()

Dim Ligne As Long

    Worksheets(Range("Choix_bordereau").Value).Activate
    Ligne = Worksheets(Range("Choix_bordereau").Value).Range("A9").End(xlDown).Row + 1
    Worksheets(Range("Choix_bordereau").Value).Cells(Ligne, Worksheets(Range("Choix_bordereau").Value).Range("Tab_recap_date").Column) = Sheets("Accueil").Range("C13").Value

End Sub

ou de façon plus concise

Sub EnregistrerDepense()

Dim Ligne As Long

With Worksheets(Range("Choix_bordereau").Value)
    Ligne = .Range("A9").End(xlDown).Row + 1
    .Cells(Ligne, .Range("Tab_recap_date").Column) = Range("C13").Value
End With

End Sub

pour autant la ligne n'est pas correcte ... c'est une autre histoire que je vais regarder. Question : est-ce que tu acceptes que ton tableau soit avec le juste nombre de lignes ?

Hey merci !

comment ça le juste nombre de ligne ?

Je pense qu'il aura toujours le même nombre de lignes...

Voici ce qu'il faudrait faire ...mais cela réduit le nombre de lignes au juste nécessaire comme tu peux le voir ...

lors de la duplication, remettre le tableau à vierge avec If Not .ListObjects(1).DataBodyRange Is Nothing Then .ListObjects(1).DataBodyRange.Delete

Sub dupliquer()

    Dim NomBordereau As String

    NomBordereau = InputBox("Titre du bordereau")

    If NomBordereau = "" Then
        Exit Sub
    End If

    Sheets("Bordereau").Range("Zone_saisie").ClearContents
    Sheets("Bordereau").Copy after:=Sheets(Sheets.Count)

    ActiveSheet.Name = NomBordereau
    ActiveSheet.Range("Titre").Value = NomBordereau

    With ActiveSheet
        .Name = NomBordereau
        .ListObjects(1).Name = "Tab_recap_" & NomBordereau
        If Not .ListObjects(1).DataBodyRange Is Nothing Then .ListObjects(1).DataBodyRange.Delete
    End With

    Sheets("Accueil").Select

End Sub
lors de l'enregistrement, ajouter une ligne au tableau
Sub EnregistrerDepense()

Dim Ligne As Long

With Worksheets(Range("Choix_bordereau").Value).ListObjects(1)
    .ListRows.Add
    Ligne = .ListRows.Count
    .DataBodyRange.Cells(Ligne, 1) = Range("C13").Value
End With

End Sub

mais je peux aussi garder ton tableau et rechercher la première ligne vierge

ceci te plaira davantage !

Sub EnregistrerDepense()

Dim Ligne As Long, i As Long

With Worksheets(Range("Choix_bordereau").Value).ListObjects(1)
    Ligne = 0
    For i = 1 To .ListRows.Count
        If .DataBodyRange.Cells(i, 1) = "" Then Ligne = i: Exit For
    Next
    ' ajout ligne si besoin
    If Ligne = 0 Then .ListRows.Add: Ligne = .ListRows.Count
    .DataBodyRange.Cells(Ligne, 1) = Range("C13").Value
End With

End Sub

Ah merci beaucoup ça a l'air top !!

Je vais essayer de continuer !

Merci beaucoup d'avoir pris tout ce temps pour m'aider !!

A ta disposition pour poursuivre si besoin.

Tu pourras aussi sans doute simplifier à un moment les zones nommées qui sont très nombreuses ...

Et pourquoi ne pas avoir un seul onglet et ensuite un filtre pour édition ? ... enfin ce serait casser ta belle construction !

Ouais mais le truc c'est qu'il peut être modifié au fur et a mesure...

C'est pour ça que je voulais avoir les onglets, mais effectivement je voulais mettre un espèce d'archivage pour ne pas être "pollué" par les onglets qui ne servent plus...

Mais c'est possible que je revienne par ici pour de l'aide :D

J'suis encore très novice avec tout ça !

Si le sujet principal est résolu pour toi (code 400), tu peux fermer c fil d discussion en cliquant sur V

Rechercher des sujets similaires à "erreur 400 copie tableau"