Partager via

Utiliser feuil excel comme formulaire et copié les valeurs vers une autre

Anonyme
2018-01-11T13:15:01+00:00

Bonjour

J’utilise feuil "caisse " comme un formulaire pour saisir des montants et après je les archiver dans un autre feuil " table " et je vide le formulaire 

au début j'ai commencé par ce code 

============================================================== 

Sub TEST()

'les cellules de la colonne b

Sheets("table").Range("a1").End(xlDown).Offset(1, 0) = Sheets("caisse").Range("b1").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 1) = Sheets("caisse").Range("b2").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 2) = Sheets("caisse").Range("b4").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 3) = Sheets("caisse").Range("b5").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 4) = Sheets("caisse").Range("b7").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 5) = Sheets("caisse").Range("b8").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 6) = Sheets("caisse").Range("b11").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 7) = Sheets("caisse").Range("b12").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 8) = Sheets("caisse").Range("b13").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 9) = Sheets("caisse").Range("b14").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 10) = Sheets("caisse").Range("b16").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 11) = Sheets("caisse").Range("b21").Value

'les cellules de la colonne c

Sheets("table").Range("a1").End(xlDown).Offset(0, 12) = Sheets("caisse").Range("c5").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 13) = Sheets("caisse").Range("c9").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 14) = Sheets("caisse").Range("c11").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 15) = Sheets("caisse").Range("c12").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 16) = Sheets("caisse").Range("c13").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 18) = Sheets("caisse").Range("c16").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 19) = Sheets("caisse").Range("c21").Value

'les cellules de la colonne d

Sheets("table").Range("a1").End(xlDown).Offset(0, 20) = Sheets("caisse").Range("d4").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 21) = Sheets("caisse").Range("d11").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 22) = Sheets("caisse").Range("d15").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 23) = Sheets("caisse").Range("d18").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 24) = Sheets("caisse").Range("d19").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 25) = Sheets("caisse").Range("d20").Value

Sheets("table").Range("a1").End(xlDown).Offset(0, 26) = Sheets("caisse").Range("d21").Value

Sheets("caisse").Range("B2, b4:b10, b12:b20").ClearContents

End Sub

==============================================================================

mais j'ai trouvé deux problèmes

1- le code est très long et surtout si j'ajoute une deuxième ou troisième formulaire 

2- les cellules "B11" "C11" "D11" contiennent une formule matricielle et le code ne copier pas leurres valeurs et voici la formule

==============================================================================

{=INDEX(TABLE!G1:G39948;MAX((TABLE!B1:B39948=B2)*LIGNE(TABLE!G1:G39948)))}

==============================================================================

Apres j'ai essayé cette méthode

j'ai affecte tous les valeurs dans une seul ligne c-a-d E1=B1 F1=B2 G1=B4 H1=B5 jusqu’à AD1=D21 et en suite copier tous la plage de E1:AD1 vers feuil Table

==================================================================================

Sub Macro2()

Range("E1:AD1").Copy

Sheets("TABLE").Range("a1").End(xlDown).Offset(1, 0).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Sheets("TABLE").Columns("A:A").NumberFormat = "m/d/yyyy"

Application.CutCopyMode = False

Sheets("caisse").Range("B2, b4:b10, b12:b20").ClearContents

End Sub

=========================================================================================

SVP aidez moi de trouvez un code pratique et rapide en excution parce que au fin d’année je me trouve avec une 10000 ligne dans la feuil TABLE

merci beaucoup

Microsoft 365 et Office | Excel | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

  1. Lz365 38,191 Points de réputation Modérateur bénévole
    2018-01-15T10:05:43+00:00

    @iliesilies

    si je souhaite ajouté d'autre formulaire c-a-d d'autre feuil ex POSTE BANQUE AGENCE

    est ce que chaque formulaire sa table c-a-d

    caisse enregistré dans ==>table1

    poste enregistré dans==>table2

    banque enregistré dans==>table3

    agence enregistré dans==>table4

    ou bien tous dans une seuil table

    Je ne peux pas répondre à cette question à ta place puisque je ne sais pas ce que tu veux faire avec ton application et surtout quelles données tu as besoin de consolider (ou pas) en fin d'année.

    Ceci dit je dirai que ce serait plus clair & logique d'enregistrer des informations qui sont visiblement de nature différentes dans des tableaux différents. Donc, si c'était moi, j'archiverai dans des tableaux différents (quelque chose comme ça). 

    j'ai ajouté ce code pour transféré d'autre plage vers feuil grand livre

    est ce que ce code est pratique

    ======================================================

    T = Sheets("CAISSE").Range("L5:U21").Value

    With Sheets("GRAND LIVRE")

        dl = .Range("A65000").End(xlUp).Row + 1

        .Cells(dl, 1).Resize(UBound(T, 1), UBound(T, 2)) = T

    End With

    ======================================================

    J'ai procédé différemment dans la Sub CopyGrandLivreValToArchive puisque j'utilise un Tableau pour stocker les valeurs à archiver. Ce qui me gêne dans ton approche c'est que certaines références sont codées "en dur" (Range("L5:U21") et Range("A65000"))

    1 personne a trouvé cette réponse utile.
    0 commentaires Aucun commentaire

Réponse acceptée par l’auteur de la question

  1. Lz365 38,191 Points de réputation Modérateur bénévole
    2018-01-13T11:48:15+00:00

    @iliesilies

    Voir l'exemple (3.4 Mo) qui sur un PC pas top performant prend env. 1s pour copier les données du formulaire (+ nettoyage) dans le tableau d'archive (> 15000 lignes).

    • L'archive est un Tableau
    • 1 seul cal. du N° de ligne. Ne se fait que si B2 contient une valeur. J'ai utilisé la fonction AGREGAT (Excel >/= 2010) dans une variable nommée
    • Pour les Anciens soldes l'INDEX ne s'exécute que si le N° de ligne est <> 0, sinon c'est 0

    Si c'était moi je ferai différemment pour :

    • N° de ligne : je chercherai la Date la plus élevée qui correspond au Journal (BDQ, CLX...). Parce que si par erreur la date entrée en B1 est < à une date déjà archivée pour le même Journal, le solde récupéré par INDEX risque fort de ne pas être le bon. Si ça fait sens pour toi, dans la variable nommée "lgnSolde" remplace l'AGREGAT actuel par :

    AGREGAT(14;4;((tblArchive[JOURNAL]=$B$2)*ESTNUM(MAX(tblArchive[Date])))*(LIGNE(tblArchive)-LIGNE(tblArchive[#En-têtes]));1)

    • Nettoyage du formulaire (fin VBA) : plutôt que Range("B2, b4:b10, b12:b20...").ClearContents je protégerai de la feuille Caisse (ça évite aussi d'effacer des formules par erreur) et je ferai une boucle du style :

    For Each c In sh.[rngForm]

        If c.Locked = False Then c.ClearContents

    Next c

    0 commentaires Aucun commentaire

10 réponses supplémentaires

  1. Anonyme
    2018-01-13T12:18:59+00:00

    mille merci c'est la perfection

    Svp a base  de ton exemple je souhaite ajouté d'autre formulaire avec d'autres questions svp donnée moi un peux de temps.

    0 commentaires Aucun commentaire
  2. Anonyme
    2018-01-12T22:28:05+00:00

    merci pour votre réponse

    voici le fichier plus détaillé 

    https://drive.google.com/file/d/1ZI0RxIT1m5OwV2yvIzMimRMRqj\_o1zMv/view?usp=sharing

    0 commentaires Aucun commentaire
  3. Lz365 38,191 Points de réputation Modérateur bénévole
    2018-01-12T19:01:46+00:00

    @iliesilies,

    Si problème toujours d'actualité je veux bien y jeter un coup d'œil. Qlq questions au préalable. Tu dis :

    1. "en fin d’année je me trouve avec une 10000 lignes dans la feuil TABLE" et dans ta formule matricielle je lis 39948 ( c'est > aux 10000 lignes en fin d'année). Peux-tu expliquer stp ?
    2. "les cellules "B11" "C11" "D11" contiennent une formule matricielle" mais tu n'en décrits qu'une. Est-ce que les 2 autres font exactement la même chose ? Sur la même plage de données dans Table ?
    3. "le code est très long et surtout si j'ajoute une deuxième ou troisième formulaire". Ces 2ième et 3ième formulaires sont sur la feuille caisse ?
    4. Utilises-tu des Sub du style Worksheet_SelectionChange, Worksheet_Change... (ou autre) ?

    + si tu pouvais mettre ton fichier en partage sur OneDrive, Google drive... et mettre le lien vers celui-ci dans ta réponse, ça faciliterai beaucoup les choses

    0 commentaires Aucun commentaire