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
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
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
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
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
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
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
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 :
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é
Ah d'accord
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
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 ?
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
D'accord
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
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é
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
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
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 !