Evenement après un coller
Résolu/Fermé
Kuartz
Messages postés
852
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
20 juil. 2016 à 13:50
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 4 août 2016 à 08:51
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 4 août 2016 à 08:51
A voir également:
- Croix chretienne copier coller
- Copier coller pdf - Guide
- Historique copier-coller android - Guide
- Croix chrétienne emoji copier coller - Forum Opera
- Arobase copier coller - Forum Clavier
- Dessin sms copier coller zizi ✓ - Forum Réseaux sociaux
3 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 754
26 juil. 2016 à 11:15
26 juil. 2016 à 11:15
Bonjour,
On peux pour faire cela, utiliser le bouton de commande Annuler de la barre d'outils "standard". Celui-ci contient une liste des dernières actions effectuées par l'utilisateur.
On regarde si la dernière action est un coller et on lance le cas échéant.
Attention toutefois à arrêter puis relancer le gestionnaire des événements de l'application sous peine d'erreur.
Comme ceci, cela devrait te convenir :
Dans le Module Objet ThisWorkbook
A Noter : ce code aurait pu se trouver dans le module de la feuille ou coller si cette feuille est unique... Il suffit pour cela d'utiliser l'événement Change de cette feuille.
Dans un module standard : la macro à lancer
Ne te reste qu'à remplacer le MsgBox par la modification du contenu du presse-papier...
On peux pour faire cela, utiliser le bouton de commande Annuler de la barre d'outils "standard". Celui-ci contient une liste des dernières actions effectuées par l'utilisateur.
On regarde si la dernière action est un coller et on lance le cas échéant.
Attention toutefois à arrêter puis relancer le gestionnaire des événements de l'application sous peine d'erreur.
Comme ceci, cela devrait te convenir :
Dans le Module Objet ThisWorkbook
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim C As String, I As Long With Application.CommandBars("Standard") I = .FindControl(ID:=128).Index C = .Controls(I).List(1) End With If C = "Coller" Then Macro1 End Sub
A Noter : ce code aurait pu se trouver dans le module de la feuille ou coller si cette feuille est unique... Il suffit pour cela d'utiliser l'événement Change de cette feuille.
Dans un module standard : la macro à lancer
Option Explicit Sub Macro1() Dim Presse_Papier As String 'on annule le coller With Application .EnableEvents = False .Undo .EnableEvents = True End With 'on récupère le contenu du presse-papier Presse_Papier = GetPressPapier 'Modification des colonnes MsgBox Presse_Papier End Sub Function GetPressPapier() As String 'http://excel.developpez.com/faq/?page=PressePapier#RecupPressePapier 'nécessite d'activer la référence "Microsoft Forms 2.0 Object Library." With New dataObject .GetFromClipboard GetPressPapier = .GetText(1) End With End Function
Ne te reste qu'à remplacer le MsgBox par la modification du contenu du presse-papier...
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 754
2 août 2016 à 08:19
2 août 2016 à 08:19
Bonjour,
Le souci rencontré tiens dans le fait que tu copies, soit une ligne, soit plusieurs, depuis un mail.
Lors de mes tests, je copiais/collais à partir d'Excel.
Or, depuis Excel, lorsque tu copies une ligne seule, le copié se termine par les caractères de changement de ligne Chr(13) & Chr(10). Par contre, le copié depuis un mail n'ajoute pas ces caractères.
Du coup, ça plantait...
De plus, tu dois également penser qu'un jour, tu vas utiliser ce fichier pour travailler dessus. Il faut donc pouvoir désactiver et réactiver ce coller un peu spécial.
Voici donc le nouveau code qui fonctionne avec les éléments transmis par mail :
!!!nécessite d'activer la référence "Microsoft Forms 2.0 Object Library."!!!
Module ThisWorkbook :
Module standard : (Module1)
Le souci rencontré tiens dans le fait que tu copies, soit une ligne, soit plusieurs, depuis un mail.
Lors de mes tests, je copiais/collais à partir d'Excel.
Or, depuis Excel, lorsque tu copies une ligne seule, le copié se termine par les caractères de changement de ligne Chr(13) & Chr(10). Par contre, le copié depuis un mail n'ajoute pas ces caractères.
Du coup, ça plantait...
De plus, tu dois également penser qu'un jour, tu vas utiliser ce fichier pour travailler dessus. Il faut donc pouvoir désactiver et réactiver ce coller un peu spécial.
Voici donc le nouveau code qui fonctionne avec les éléments transmis par mail :
!!!nécessite d'activer la référence "Microsoft Forms 2.0 Object Library."!!!
Module ThisWorkbook :
Option Explicit Private Sub Workbook_Open() Call ActiveCollerSpecial End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim C As String, i As Long If CollerSpecialActif Then With Application.CommandBars("Standard") i = .FindControl(ID:=128).Index C = .Controls(i).List(1) End With If C = "Coller" Then Macro1 End If End Sub
Module standard : (Module1)
Option Explicit Option Base 0 Public CollerSpecialActif As Boolean Sub ActiveCollerSpecial() CollerSpecialActif = True End Sub Sub DesactiveCollerSpecial() CollerSpecialActif = False End Sub Sub Macro1() Dim Donnees As Variant, NbDim As Integer Dim strTexte As String 'on annule le coller With Application .EnableEvents = False .Undo 'on récupère le contenu du presse-papier strTexte = GetPressPapier 'calcul du nombre de dimensions du tableau à créer : NbDim = InStr(strTexte, Chr(13) & Chr(10)) If NbDim = 0 Then Donnees = Split(strTexte, Chr(9)) Restitue Donnees, 1 Else Donnees = Fait_Tableau(strTexte) Restitue Donnees, 2 End If .EnableEvents = True .CutCopyMode = False End With Cells(ActiveCell.Row, 1).Select End Sub Function GetPressPapier() As String 'http://excel.developpez.com/faq/?page=PressePapier#RecupPressePapier 'nécessite d'activer la référence "Microsoft Forms 2.0 Object Library." With New dataObject .GetFromClipboard GetPressPapier = .GetText(1) End With End Function Function Fait_Tableau(strPp As String) As Variant() Dim TB_Temp As Variant, Lignes As Variant, Temp As Variant, i As Long, J As Long Lignes = Split(strPp, vbCrLf) ReDim TB_Temp(0 To UBound(Lignes) - 1, 0 To UBound(Split(Lignes(0), Chr(9)))) For i = LBound(Lignes) To UBound(Lignes) Temp = Split(Lignes(i), Chr(9)) For J = LBound(Temp) To UBound(Temp) TB_Temp(i, J) = Temp(J) Next J Next Fait_Tableau = TB_Temp Erase TB_Temp End Function Sub Restitue(Tb As Variant, dimens As Integer) Dim ColRemplac As Variant, i As Long, J As Long ColRemplac = Array(1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 17, 18) Select Case dimens Case 1 For i = LBound(Tb, 1) To UBound(Tb, 1) Cells(ActiveCell.Row, ColRemplac(i)) = Tb(i) Next i Case 2 For i = LBound(Tb, 1) To UBound(Tb, 1) For J = LBound(Tb, 2) To UBound(Tb, 2) Cells(ActiveCell.Row + i, ColRemplac(J)) = Tb(i, J) Next J Next i End Select End Sub Sub SOS() Application.EnableEvents = True End Sub
Kuartz
Messages postés
852
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
3 août 2016 à 15:44
3 août 2016 à 15:44
Merci infiniment Pikaju. C'est juste parfait. Bravo pour l'expertise !
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 754
>
Kuartz
Messages postés
852
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
4 août 2016 à 08:51
4 août 2016 à 08:51
Salut,
De rien, ça a été un plaisir de travailler avec et pour toi.
A+
De rien, ça a été un plaisir de travailler avec et pour toi.
A+
ThauTheme
Messages postés
1442
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
29 juillet 2022
160
20 juil. 2016 à 15:14
20 juil. 2016 à 15:14
Bonjour Kuartz, bonjour le forum,
Non testé mais je pense que la macro événementielle Change devrait faire l'affaire ! Non ?
Non testé mais je pense que la macro événementielle Change devrait faire l'affaire ! Non ?
Kuartz
Messages postés
852
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
61
21 juil. 2016 à 10:47
21 juil. 2016 à 10:47
Bonjour ThauTheme, bonjour le forum
Ca marcherait en effet. Mais je voulais gérer toutes les possibilités de "coller".
En fait,, l'idée c'est que lorsque je colle sur le fichier excel, les données viennent se mettre dans les bonnes colonnes. Ca paraît simple, mais vraiment pas finalement.
Merci quand même pour l'aide.
Ca marcherait en effet. Mais je voulais gérer toutes les possibilités de "coller".
En fait,, l'idée c'est que lorsque je colle sur le fichier excel, les données viennent se mettre dans les bonnes colonnes. Ca paraît simple, mais vraiment pas finalement.
Merci quand même pour l'aide.
Modifié par Kuartz le 26/07/2016 à 17:13
Alors là... Je tire mon chapeau ! Solution plus qu'à ma convenance. Je te remercie du fond du coeur pikaju.
Cordialement.
Edit : Bizarre, j'ai l'erreur suivante :
"Type défini par l'utilisateur non défini" sur New dataObject...
Cordialement.
27 juil. 2016 à 08:25
Bizarre, j'ai l'erreur suivante : "Type défini par l'utilisateur non défini" sur New dataObject...
Comme indiqué en commentaire de la fonction GetPressPapier, il convient de cocher la référence : "Microsoft Forms 2.0 Object Library."
Modifié par Kuartz le 27/07/2016 à 09:29
C'est effectivement écrit en commentaire... Désolé.... Merci pour tout.
Cordialement.
27 juil. 2016 à 09:38
Sachant que le but n'est pas de modifier le contenu du presse papier mais simplement de mettre les bons éléments dans les bonnes colonnes, comment peut-on faire du coup?
Comment prendre chaque information du presse-papier pour les mettre dans chaque colonne concernée?
Cordialement.
27 juil. 2016 à 09:44
N'est pas censé empêcher le Undo? Parce que sur mon fichier, la ligne collée s'enlève, le Undo se fait donc.
Cordialement.