Sélection dynamique VBA
Bonjour !
Je suis bloqué sur un dilemme.
Je suis en train de créer un tableau de suivi d'occupation de mon hôtel. Le but est d'extraire un tableau tous les jours et le copier coller dans un tableau récap.
J'ai automatisé la création de la colonne journalière, mais je bloque sur le copier coller des données.
Workbooks.Open Filename:="import.xlsx"
Rows("1:10").Select
Selection.Delete Shift:=xlUp
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
Cells.Select
Selection.UnMerge
Range("C1:C150").Select
Selection.Copy
Workbooks("Pick up GHN - test macro.xlsm").Sheets("GHN").Activate
Range(?).Select'Sélection de cellule réceptrice.'
ActiveSheet.PasteA l'endroit de la sélection de la cellule réceptrice, il faudrait que je puisse cliquer à l'endroit où les données vont se coller. Les cellules changent tous les jours du coup je ne peux pas utiliser la fonction Range().
Est-ce que vous savez comment inclure dans la macro une boite de dialogue demandant de sélectionner une cellule avec un clic et lorsqu'on clic la valeur s'insert dans la macro et elle fini de s’exécuter ?
J’espère que j'ai été clair et que quelqu'un pourra m'aider ! Si besoin je peux apporter des précisions.
Bonne journée et bonne fête à tous
Bonjour,
Pas de dilemme !
A part peut-être l'ouverture du fichier, et encore pas sous cette forme, je ne conserve aucune ligne de ton enregistrement.
Cordialement.
Voila le code complet que j'ai fait pour le moment :
Sub Copier()
ActiveCell.EntireColumn.Select
Selection.Copy
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
Selection.ClearContents
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).Select
ActiveCell = Format(Date, "dd/mm/yy")
Workbooks.Open Filename:="import.xlsx"
Rows("1:10").Select
Selection.Delete Shift:=xlUp
Columns("A:A").Select
Selection.Delete Shift:=xlToLeft
Cells.Select
Selection.UnMerge
Range("C1:C150").Select
Selection.Copy
Workbooks("Pick up GHN - test macro.xlsm").Sheets("GHN").Activate
'Sélection de la cellule réceptrice'
ActiveSheet.Paste
End SubMon doc excel est trop gros pour être uploader du coup j'ai joint une capture d'écran.
Chaque jour est composé de 3 colonnes.
Colonne 1 = donnée à importer. Colonne 2 = Colonne 1 Jour J - colonne 1 J-1. Colonne 3 = Donnée annexe que le marque manuellement.
Par exemple dans la pièce jointe :
Pour RN j'ai fait un copier collé
Pour RO c'est RN - RK
Pour RP c'est des données a saisir manuellement
Chaque mois fini on camoufle les cellules du haut et de gauche pour repartir comme si c'était un tableau à 0.
Re,
Une procédure fiable doit pouvoir s'exécuter de la façon prévue en toutes circonstances (et ne pas s'exécuter si les conditions de sont exécution ne sont pas réunies.
Ce que du code enregistré est incapable de faire, et il apparaît à cet égard comme totalement non fiable !
ActiveCell.EntireColumn.SelectAvec un tel démarrage, si on se gourre dans la sélection de la cellule, ou si la macro a été déclenchée par inadvertance... toutes les surprises sont possibles !
Et ne disons pas que dans une situation donnée les risques sont inexistants, rien n'étant immuable, les probabilités qu'il en apparaisse, non prévus initialement, sont toujours fortes...
J'imagine que si tu dois donner une directive, prenons un exemple ultra-simple, refaire d'urgence la chambre 503, tu vas simplement le dire une fois à qui va le faire ou le répercuter, et ce sera fait. Tu ne vas certainement pas commencer par te précipiter au 5e étage, pénétrer dans la chambre, appeler la personne qui doit intervenir... C'est pourtant ce que tu fais avec ton code enregistré, tu ne cesses de courir, te précipiter dans chaque coin et recoin... c'est évidemment du temps perdu à profusion, et particulièrement inefficace. Si tu programmes, c'est pour pouvoir dire à VBA ce qu'il doit faire, et il le fait, sans que tu bouges le petit doigt !
Autrement dit un code cohérent et ciblant l'opération à réaliser, ne comportera aucun Select ni Activate ni expression similaire, ni les expressions en résultant comme ActiveCell.
Quant à démarrer par une sélection, c'est injustifié dans un dispositif de suivi : le code doit trouver l'emplacement sur lequel intervenir, sans sélection aucune !
Détail au passage, mettre une date : son format sera défini par le format de cellule et non le format défini par Format, fonction qui renvoie du texte. Ce qu'on risque est tout simplement que l'insertion ne soit pas reconnue comme date et insérée en tant que texte. Et si le texte formaté qu'on insère ainsi est reconnu comme date, le format final sera celui du format de cellule si elle en a un ou le format par défaut régional si la cellule était initialement au format Standard.
Le plus sûr était :
.Cells(1, k) = DateAvec date on met la date du jour, en valeur Date et non texte...
En désignant la cellule, on est toujours sûr de l'emplacement, qui ne sera pas soumis à aléas :
k étant la colonne sur laquelle on intervient, déterminée plus haut dans le code !!
Et le point devant Cells réfèrera à la feuille (désignée aussi plus haut dans le code pour qu'on puisse s'y référer explicitement), ce qui ôte toute ambiguïté !!
Workbooks.Open Filename:="import.xlsx"Même imprécision, je ne vois pas le chemin du dossier contenant le fichier...
Je m'interroge aussi sur la signification des suppressions diverses qui suivent et la défusion...
Mais ce qui ressort c'est qu'on copie une plage qui se trouvait donc en D11:D160 avant suppressions.
J 'aurais donc commencé par affecter les valeurs de cette plage à la plage destinataire (qui doit étre tout à fait déterminable dans le code...), éventuellement en passant par un tableau (à voir selon contexte, incomplet ici) ou sans (à ce moment-là une ligne de code, sans copier-coller aucun..., le plus efficace en la matière).
Les suppressions pouvaient venir après, si devant être faites, mais je ne vois pas d'enregistrement ni de fermeture du classeur source de données, ce qui est encore un manque...
J'ai laissé à l'écart le copier-coller initial sur le classeur cible car l'opération me chiffone, une image ne permet pas d'y retrouver ce que tu en dis, et dire quel code conviendrait le mieux nécessite un exemen complet de la feuille...
Cordialement.
Je vais refaire ça au propre sur un nouveau fichier. Quand j'aurai bien reformuler sur un petit fichier que je puisse uploader
Bonjour !
J'ai travaillé sur un nouveau fichier, je les mets en pièce jointe. Les deux fichiers sont à garder dans le même document.
Même imprécision, je ne vois pas le chemin du dossier contenant le fichier...
Normal car c'est un fichier qui est utilisé sur la dropbox, donc le chemin varie en fonction de l'ordinateur utilisé.
Je bloque sur l'importation de 3 cellules dont la position varie en fonction du nombre de jour du mois, quelqu'un sait comment faire ?
Dans le fichier AnalyseOccupation.xlsx c'est la Range("G42:I42"). Mais quand le mois sera à 30J la position des cellules ne sera pas la même...
EDIT : C'est bon j'ai réussi a trouver une solution
Bonsoir,
Je bloque sur l'importation de 3 cellules dont la position varie en fonction du nombre de jour du mois,
Ça, c'est un faux problème...
Il y a des règles de base qui font défaut :
Ton classeur source couvre deux mois, décembre-janvier. Qu'en sera-t-il au fil du temps ?
Et que devient ce classeur chaque jour après transfert des données ?
Le classeur cible va jusqu'en mars... le transfert démarre au 24 décembre : ça ce n'est pas important, une date de démarrage de suivi est toujours arbitraire. Ce qu'il faut savoir c'est comment on continue ? Comment ce classeur va évoluer au fil des jour ?
La procédure à définir aujourd'hui doit pouvoir s'appliquer sans modification aucune dans un mois, dans 6 mois, dans un an, dans 2 ! Il faut donc des règles d'utilisation définies préalablement pour que la proc. puisse trouver tous les éléments dont elle a besoin à partir des seules indications figurant des les deux classeurs.
Et si le classeur doit évoluer au fil du temps, des éléments disparaître, d'autres s'ajouter, elle doit pouvoir le faire automatiquement, sans intervention, en fonction des dates, produire les extensions calendaires, etc.
Sinon on reste dans le bricolage improvisé.
Cordialement.