Créer 2eme colonne + Coller les valeurs d'un tableau virtuel

Bonjour à tous,

Plusieurs problèmes, vous allez vite comprendre que je suis débutant, j'essaie de faire mais je vois que les macros c'est pas inné chez moi x)

Voici donc mes problèmes :

1) J'aimerais copier la celule de la colonne E dans la 2eme colonne dans mon tableau virtuel quand la cellule D y es ajouté en 1ere colonne

2) J'aimerais coller mon tableau virtuel colonne 1 en sheets(a) à la dernière ligne de la colonne 24 correspond à X et la colonne deux sur la meme ligne mais en colonne T.

3) une fois coller les valeurs sont-elles supprimer du tableau ? Si non, comment remettre ce tableau vierge?

Je souhaite continuer la fonction dictionnary pour éviter les doublons comme vous vous doutez

Je vous remercie d'avance.

PS : Toute critique sur mon écriture est la bienvenue, je vais devoir optimiser le programme je pense donc n'hésitez pas

Ne faite pas attention aux variables qui sont des fois inscrites mais pas encore utilisé. Je fais des bouts de macros et ensuite je les imbrique pour n'en faire qu'une

Sub components_assembly()
Dim a As Integer 'a incrementation des pages section
Dim d As Integer 'd incrementation des lignes dans BOM
Dim e As Integer 'd incrementation des lignes d'UQID dans Section
Dim qty_inc As Integer ' incremente pour savoir combien de qty on a
Dim c_qty As Integer 'quantité de uqid a faire
Dim Tableau()

Dim CD As Workbook 'déclare la variable CD (Classeur de Destination)
Set CD = ThisWorkbook 'définit le classeur de destination CD (=ce classeur)
Dim ODMENU As Worksheet 'déclare la variable ODMENU Onglet de destination menu
Set ODMENU = CD.Sheets("MENU") 'définit le classeur de Destination page MENU
Dim ORFBOM As Worksheet 'déclare la variable ORFBOM (Onglet de ReFérence BOM)
Set ORFBOM = Workbooks("DATAS.xlsx").Sheets("BOM") 'définit l'onglet de RéFérence page BOM

d = 2
c_qty = 1
e = 10
a = 2

Set MonDico = CreateObject("Scripting.Dictionary")

If Not IsEmpty(Sheets(a).Cells(11, 24)) Then
While CD.Sheets(a).Cells(e, 24) <> ""
e = e + 1
    While ORFBOM.Cells(d, 3) <> ""
            While ORFBOM.Cells(d, 3) <> "" And ORFBOM.Cells(d, 3) <> CD.Sheets(a).Cells(e, 24)
            d = d + 1
            Wend
                If ORFBOM.Cells(d, 3) = CD.Sheets(a).Cells(e, 24) Then
                    If Not MonDico.Exists(Range("D" & d).Value) Then
                    MonDico.Add Range("D" & d).Value, Range("D" & d).Value
                    ReDim Tableau(1 To MonDico.Count)
                    Tableau(MonDico.Count) = Range("D" & d).Value
                    'Ajout de la valeur " Range ("E" & d).value dans la deuxieme colonne
                    Debug.Print MonDico.Count, Tableau(MonDico.Count)
                    End If
                c_qty = ORFBOM.Cells(d, 5)
                qty_inc = 0
                'While c_qty <> qty_inc
                'e = e + 1
               ' qty_inc = qty_inc + 1
                'ORFBOM.Cells(d, 4).Copy CD.Sheets(a).Cells(e + qty_inc, 24)
                'Range("C" & d).Value = Range("X" & e).Value
                'Wend
                d = d + 1
                End If
            dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
            CD.Sheets(a).Range("dercol").Resize(UBound(Tableau, 2), UBound(Tableau, 1)) = Tableau
    Wend
Wend
End If
'Next

End Sub

Hello !

Tout ça m'al 'air bien intéressant

Mais je suis quelqu'un de simple, hors contexte, j'ai énormément de mal à comprendre. Pourrais-tu fournir un fichier anonymisé ?

En ce qui concerne ta syntaxe, je te conseillerais de regrouper tes déclarations de variables en tête de module (dans la routine ou non, en fonction de la portée que tu souhaites) et de systématiquement mettre l' "Option Explicit" qui te force à déclarer toute variable utilisée.

Bon reflexe de commenter tes lignes de codes, mais tu devrais commenter le pavé un peu plus bas ; pour devoir fréquemment re-voir des routines créées des mois/semaines (ou jours, pour les lendemain difficiles ), on perd vite le fil et quelques commentaires permettent de re-situer directement l'instruction où l'on doit agir.

Pour le reste, comme j'ai dit plus haut, je suis quelqu'un de simple. Me faut un contexte et un visuel

Hello ! (Bon mot pour dire bonjour vu que ce projet est pour mon stage en Angleterre )

Il est intéressant mais il est compliqué pour un premier fichier macros x)

J'ai peur de regrouper les déclarations en tête vu que mes commentaires disparaîtront :/

La fonction explicit , j'ai vu ça mais j'ai pas trop aimé vu que pour le classeur il n'est pas déclarer et je ne sais comment le déclarer sinon toutes mes macros sont déclarer ! Mais j'ai entendu que ça ralentissait la macro, non?

J'utilise tous les jours vu que c'est mon projet de tous les jours jusque la fin de la semaine... :/

Voici mes documents pour simplifier la compréhension d'un gars simple qui comprendra facilement avec ce petit lien

(J'aime les gens simple, ce sont souvent ces personnes qui t'expliquent simplement)

lien --->

Ah l'angleterre, et ces charmantes et avenantes demoiselles..

J'ai peur de regrouper les déclarations en tête vu que mes commentaires disparaîtront :/

Du tout, tu peux garder 1 déclaration par ligne si tu le souhaites, le principe étant de regrouper ces lignes en tête de module.

Comme pour tes integers

La fonction explicit , j'ai vu ça mais j'ai pas trop aimé vu que pour le classeur il n'est pas déclarer et je ne sais comment le déclarer

Si tu parles de l'ActiveWorkbook, nul besoin de le déclarer Quant aux autres, "Dim xxx as Workbook" comme tu l'as fait (Worksheet pour les feuilles). Au passage : ActiveWorkbook = Classeur actif ; ThisWorkbook : Classeur "émettant" la routine.

Mais j'ai entendu que ça ralentissait la macro, non?

Bien au contraire ! Sans déclaration, VB la considère de type variant, et va donc allouer plus de "place" que pour un Integer, un string ou autre. Ce qui est chiant avec l'Option Explicit, c'est que si tu fais des tests intermédiaires, pendant que tu codes, il risque de t'embêter. C'est pourquoi je préfère personnellement le mettre vers la fin de mon dev.

L'avantage supplémentaire de l'Option explicit, c'est que tu ne passeras pas des heures (bon, des minutes) à te prendre la tête à comprendre pourquoi ton code ne marche pas, alors que cette variable "Feuille", tu l'as épelée "Feuillle" lors de l'appel (Eh oui, un homme simple avec des gros doigts)

Par contre, pour optimiser la vitesse d'execution d'une macro, retiens ces 2 lignes (et leurs contraires) magiques :

Application.ScreenUpdating = False 'Desactive la MaJ de l'affichage
Application.Calculation = XlCalculationManual 'Ou un truc comme ça. Desactive le re-calcul auto des cellules

A titre d'exemple, quand j'ai découvert ça il y a quelques mois, une macro qui me prenait une dizaine de minutes est passée à une demi-douzaine de secondes (surtout grâce à la calculation).

Je jette un oeil à ton fichier demain

Oui mais juste du visuel

Ah d'accord, oui je pourrais effectivement c'est juste que je fais des tests tout le temps alors je les regroupe pour savoir ce que j'ai à enlever si ca me plait pas

Je comprend la différence entre les deux termes de workbook mais pas ça x)

Si tu parles de l'ActiveWorkbook, nul besoin de le déclarer Quant aux autres, "Dim xxx as Workbook" comme tu l'as fait (Worksheet pour les feuilles

C'est bien ce qu'il me semblait, tout le monde ne dit pas la vérité sur les forums Je trouvais ça bête de les définir sinon

Ah oui donc en gros, l'option explicit sert en vérif d'une éventuelle erreur? Puis définitivement à la fin de notre projet macro ?

Euh d'accord mais à quoi sert il au juste? Perso, je veux toujours avoir un fichier à jour moi

Pas de problème, je vais également dormir.

Bonne nuit et à demain

C'est bien ce qu'il me semblait, tout le monde ne dit pas la vérité sur les forums Je trouvais ça bête de les définir sinon

Tu as peut-être mal interprété ^^ La plupart du temps, sur des macros impliquant plusieurs classeurs, il est préférable d'affecter activeworkbook à une variable (Set aWb = Activeworkbook), ce qui évite de jongler entre les classeurs pour que le bon soit actif. Bref, dans ce cas là, il faut déclarer la variable (aWb) qui accueille Activeworkbook. MAIS, activeworkbook étant un objet, donc natif à Excel, tu pourrais essayer que tu n'arriverais pas à faire passer un "Dim activeworkbook as workbook".

Ah oui donc en gros, l'option explicit sert en vérif d'une éventuelle erreur? Puis définitivement à la fin de notre projet macro ?

L'option explicit sert à "structurer" ton code, ça t'impose une rigueur qui te sera utile (ou à ton successeur) pour maintenir le code.

Le code fonctionnera bien entendu sans cette option, mais il est préférable de prendre les bonnes habitudes dès le début. C'est comme pour la conduite auto/moto.

Je me suis peut-être mal exprimé sur ce point : le fait "d'activer" cette option en fin de dev (ou en tout cas lorsqu'il est bien avancé) est un choix personnel, lorsqu'il s'agit de petites macros faites à la va-vite. Parfois je jette un bout de code dans un module, pressé par le temps, et le fait qu'une variable ne soit pas déclarée n'a pas forcément d'incidence sur la vitesse d’exécution. Par contre quand j'ai le temps pour faire ma routine, j'"active" directement l'Option. Mais ça reste un choix personnel et quoi qu'il arrive, l'Option Explicit apparaît toujours dans mes codes et je te conseille de la mettre.

En ce qui concerne la verif d'erreur, c'est justement toute l'utilité de l'option : elle impose la rigueur, et du coup, en refusant de se lancer s'il y a une variable non déclarée, elle permet d'éviter les fautes de frappes dans l'appel des variables, entre autres choses, et d'optimiser le code en n'allouant pas plus de place que nécessaire aux variables.

Je me suis tellement fait matraquer par mon IT à ce sujet que quand je ne vois pas cette option, ça me titille

Je sais pas si c'est très clair ; si jamais ça ne l'est pas, n'hésite pas.

Il est préférable d'utiliser activeworkbook plutot que thisworkbook, c'est ça?

option explicit

Oui, mais qu'entend tu par "en fin de développement"? Tu insinues la fin de l'écriture de ta macro ou qu'on peut la mettre en milieu de code? :S

Merci de ton conseil je vais le mettre

T'as fait une école d'informatique du coup? Ce qui explique ton niveau en macros?

Je n'hésiterais pas Je veux bien une petite explication de tes lignes

Application.ScreenUpdating = False 'Desactive la MaJ de l'affichage
Application.Calculation = XlCalculationManual 'Ou un truc comme ça. Desactive le re-calcul auto des cellules

Ah ! Je vais devoir revoir la manière dont j'explique J'étais pas trop en forme hier..mea culpa.

ActiveWorkbook et ThisWorkbook sont différents, comme je l'ai précisé plus haut ; l'exemple du "Set awb" n'était... qu'un exemple.

En gros, retiens :

Classeur 1, émetteur de la macro = ThisWorkBook

Tout classeur actif = Activeworkbook

Oui, mais qu'entend tu par "en fin de développement"?

En fin de développement dans le sens chronologique du terme.

"Spatialement", l''option explicit se place en dehors de toute procédure et de préférence en tête de module. Pour la même raison qu'on ne met pas d'espace avant une virgule : parce que.

Je suis qu'un amateur, niveau macro hein. Pas d'école d'informatique, j'ai débarqué en septembre dernier sans savoir faire une formule SI. Je suis en apprentissage, mais dans un domaine tout autre, et par la force des choses j'ai été amené à bosser sur VBA 7-8 heures par jour. Donc forcément, ça forme...

Concernant ScreenUpdating, fais le test. Ouvre la fenêtre d'execution (Editeur VBA/Affichage/Fenêtre d'execution) et tape l'instruction suivie de False, puis essaie d'agir sur ton classeur.

La calculation automatique, qui est la valeur par défaut, fait que chaque cellule modifiée est automatiquement recalculée ainsi que les cellules qui en découlent - les liens, les formules. Si tu as un =f7+f8 en cellule f6 et que tu modifies cette dernière, il recalculera les trois. Le fait de la mettre en manuelle et de la réactiver en fin de routine permet de tout faire d'un bloc, plutôt que de recalculer à chaque passage sur une cellule.

Jette un oeil la-dessus :

http://www.cpearson.com/excel/optimize.htm

Je pense que c'est surtout moi qui est dur de la feuille

D'accord, si j'ai 3 fichiers a b c ouverts, a étant le fichier où se trouve la macro, comment savoir quel est l'activeworkbook? Thisworkbook sera a, c'est ça?

D'accord, c'est bien ce qu'il me semblait. Je mettrais systématiquement explicit en fin de dvlpt du coup

Ah bon? Que veut dire IT alors? Euh tu ne savais pas faire une formule SI :O Perso, je connais un peu les formules Excel je suis pas un fifou mais je me débrouille quand même mais les macros ça fait une semaine que je me met à fond dedans environ 9heures/jour et je suis content, j'apprend énormément et j'espère que ça me servira plus tard

D'accord je vais essayé mais j'ai pas besoin de mettre true en fin pour voir la différence? De base il est ) true?

Ah d'accord Donc je comprend mieux maintenant c'est plutôt utile !! Ya t'il des risque avec cette calculation automatique?

Je fais ça de ce pas !! Merci d'avance


http://www.cpearson.com/excel/optimize.htm

Merci pour le site, quand j'ai vu que c'était écrit en anglais, j'étais un peu déçu mais il n'y pas de mot compliqué x)

Plein de petites astuces qui permettront d'avoir un bon programme rapide Merci !

https://msdn.microsoft.com/en-us/library/bb220820(v=office.12).aspx ==> Activeworkbook

Oui, ThisWorkbook sera a dans ton exemple.

Tu désactives en début de module (=False), tu réactives en fin de module (=True).

Des risques ? A part ralentir ta macro, non.

Par contre si un bout de ton code se base sur un résultat de la même macro, ça pourra te bloquer.

Exemple

[A1, A2] = 10
[A3].Formula = "=A1*A2" '= 100
Application.calculation = xlcalculationmanual
[A1] = 20
[A4].formula = "=A3*10"
Application.calculation = xlcalculationautomatic

Mets ça dans une sub et fais la tourner manuellement (touche F8), en étant attentif aux valeurs de A3 et A4.

Dans l'exemple, ça va, car les formules sont recalculées à la fin, donc pas de problème.

Maintenant, remplace

[A4].formula = "=A3*10"

par

[A4]= [A3]*10

, et refais tourner la sub .

Et tu verras que ça peut te donner des résultats bien différents de ceux attendus.

Désolé, IT = service info. Ils me surveillent de près

Voila le risque Donc je vais regarder avant de le mettre

D'accord je vais regarder ça

Ah d'accord, excuse moi je connaissais pas cette acronyme :S

As tu regarder mon code? Si non je vais pas tarder à finir ma mis à jour et rendra les codes moins éparpillé, je suis en train de tous les regrouper mais c'est la merde sans le dico pour ce que je veux faire x) Vivement que ce projet soit finit et fonctionne surtout

Je regarderai ce soir en rentrant, si tu as des modif, profites-en


Je regarderai ce soir en rentrant, si tu as des modif, profites-en

Pas de problème, tu sais vers quel heure pour essayer de te donner la dernière version avec une possibilité de te macher un maximum le boulot voir même de le résoudre

https://www.cjoint.com/c/EHzqOyVvRfQ

Voici mon dernier excel pour le moment.

Je pense que le plus approprié est le dictionnaire comme tu verras dans mon code.

Mais j'arrive pas à le faire fonctionner pour l'instant mais j'ai pas dis mon dernier mot Je rentre et je continue.

Ce qui m'intéresserait vraiment c'est d'avoir ce dico en trois colonnes (col1 : sheets("Parts") part_number trouvé grâce au UQID, col 2 UQID de ma recherche, col3 : quantité de ce UQID) et le triés ensuite par les part-number. Peu importe l'ordre des colonnes

Je me galère avec ça donc je préfère pas imaginer ce que va être ma dernière et ultime macro.. Je crois que j'ai intérêt à bien comprendre comment fonctionne les tableaux.

cordialement.

Bonjour,

je n'ai pas tout lu mais je voulais apporter quelques précisions.

Option Explicit t'oblige à déclarer tes variables (dans outils/options de VBE je te conseille de cocher 'déclaration obligatoires des variables, il se mettra automatiquement). ZZ t'a expliqué l'intérêt.

=> Dim ma_variable

Mais pour accélérer le code il faut les typer => Dim ma_variable as Long (non typée elle sera Variant, le 'pire')

Ya t'il des risque avec cette calculation automatique?

Non, mais il y un cas où il faut faire attention, il est logique.

Tu as une cellule avec une formule dont tu as besoin de récupérer le résultat dans ta macro.

Si tu as désactivé le calcul automatique et qu'un de ses antécédent est susceptible d'avoir changé tu récupèreras un résultat erroné.

Dans ce cas il faut le réactiver avant, quitte à le désactiver à nouveau derrière. Ou bien faire un Calculate sur la feuille ou la plage concernée.

eric

Bonjour eric,

Merci pour toutes ces informations.

Je vais cocher la petite case alors

Oui, il m'a donné un exemple que j'ai essayé Et effectivement il faut faire attention ! :/

C'est bien de persévérer, surtout si tu vas être amené à faire de plus en plus de macros !

Continue de te prendre la tête, c'est comme ça qu'on apprend. N'hésite pas à demander de l'aide si tu galères trop, par contre.

Sinon, j'ai jeté un œil à ton code. (enfin, la forme. La fatigue m'empêche de m'intéresser au fond ce soir)

Quelques pistes :

Si tu connais la taille de ton tableau, déclare la directement au début. Les Redim Preserve sont très gourmands : en fait, ils ne font pas qu'ajouter des entrées au tableau, ils le recréent à chaque fois que tu Redim Preserve ;

Pense à réactiver la gestion par défaut des erreurs pour éviter d'être dans le flou. On conseille d'utiliser On error resume next sur les instructions désirées seulement, puis de réactiver via On Error GoTo 0. C'est à appliquer au cas par cas bien sûr. (je parle pour la sub inf_level_master1)

Tu peux simplifier

Workbooks.Open ("C:\Users\Nicky\Desktop\Project 4_Informatisation\EXAMPLE SUR INTERNET\DATA FROM DDM\DATAS.xlsx")
    Set CRF = ActiveWorkbook 'définit le classeur de référence CRF

Par

Set CRF = Workbooks.Open ("C:\Users\Nicky\Desktop\Project 4_Informatisation\EXAMPLE SUR INTERNET\DATA FROM DDM\DATAS.xlsx") 

A part ça, pas grande chose à redire. Quoi que, deux petits, toujours pour la maintenance (surtout pour le successeur) : en tête de module, décrire le fonctionnement de la macro. Quel est le but, la méthodologie, les résultats escomptés, voire les difficultés sur lesquels tu as galéré ; et ne pas hésiter à splitter les différentes sub entre différents modules pour les garder light - sans non plus en mettre une par module. L'effet psychologique est très important

Plutôt pas mal pour une première macro La plupart des points que j'ai souligné n'empêchent en rien l'exécution de la macro, il s'agit soit d'optimisation, soit de "mise en forme". Donc chapeau

EDIT : Oops, j'arrive après la bataille. Bon ben nickel, ravi que tu aies réussi

Bah j'en sais rien mais au moins je n'aurais plus peur

Bah tu viens de mettre le doigt dessus le tableau ! J'ai peur qu'il prenne trop de temps et je ne sais pas trop comment faire pour qu'il enregistre a chaque fois une nouvelle valeur... :/ Je me galere, je teste et rien ...

Je ne connais pas la taille du tableau et je ne peux pas le savoir à moins de faire deux fois la même boucle, inutile quoi!

Je connais cette astuce mais j'en ai aucune idée de quand elle peut me servir.... :/

Merci pour la petite astuce

Merci mais première macro depuis une semaine pratiquement je suis dessus donc elle fonctionne, mais elle n'est pas fini :/

Après la bataille? Rien est finis Tout fait que commencer

nouyman a écrit :

Je connais cette astuce mais j'en ai aucune idée de quand elle peut me servir.... :/

Si c'est celle du classeur, à l'endroit où j'ai pioché l'exemple

Pour le tableau je parlais du tout petit tblindex...Duquel parles-tu ? Je t'avoue ne pas être rentré en profondeur dans la sub

Ah oui, la mais sinon je sais pas, je vérifie juste si mon classeur est ouvert sinon ca fait une erreur

Ah celui ci n'est pas trop compliqué mais cherche la fonction dictionnary. Si tu connais comment ca fonctionne etc... Je serais très content de recevoir cette aide ! D

Rechercher des sujets similaires à "creer 2eme colonne coller valeurs tableau virtuel"