VBA Copier données sans mise en forme?

Franco

XLDnaute Nouveau
Bonjour,

Mon besoin est le suivant : l'usager doit être capable de copier des données externes dans un formulaire Excel que nous avons créé. Il ne faut pas cependant que le copier/coller change les propriétés des cellules (format conditionnel, liste de choix déroulantes, etc.)

J'ai essayé la solution VBA suivante qu'une amie m'a donnée, elle fonctionne, mais elle ne permet pas d'annuler (CTRL+Z). Une fois les données collées, plus moyen de revenir en arrière.

Quelqu'un aurait une meilleure solution?
Merci à l'avance.
Franco

Code utilisé :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
If .CutCopyMode Then
.EnableEvents = False
.Undo
Selection.PasteSpecial xlPasteValues
.OnUndo "", ""
.OnRepeat "", ""
.EnableEvents = True
End If
End With
End Sub


Si pour une feuille spécifique alors le début sera:

Private Sub Worksheet_Change(ByVal Target As Range)
 

InaPiotr

XLDnaute Nouveau
Bonjour,
Déjà, est-il nécéssaire de passer par du VBA ? En collant des données à la main, il est possible d'aller dans "collage spécial" pour choisir de ne coller que les valeurs. Cela fera la même chose que votre code, mais avec la possibilité d'annuler.

Si pour une raison quelconque vous voulez absolument faire cela en VBA, je pense que la commande "Application.OnUndo" présente une piste de recherche intéresante. Je ne l'ai moi-même jamais utilisée, mais l'aide microsoft indique qu'elle permet de définir la procédure à appeler lorsque l'utilisateur clique sur "annuler" ; peut être serait-il possible de sauvegarder les données de la feuille avant de coller les valeurs (dans un tableau, ou dans une autre feuille par exemple), et de créer une procédure qui récupererait ces valeurs et les remettrait sur la feuille de base si l'utilisateur clique sur annuler ?
Cordialement,
 

job75

XLDnaute Barbatruc
Bonjour Franco, bienvenue sur XLD,
Code:
Dim sel As Range, tablo 'mémorise les variables

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Source As Range)
Set sel = Selection
tablo = sel
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
    If .CutCopyMode Then
        .EnableEvents = False
        .Undo
        Selection.PasteSpecial xlPasteValues
        .OnUndo "Annuler", Me.CodeName & ".Annuler"
        .EnableEvents = True
    End If
End With
End Sub

Sub Annuler()
Application.EnableEvents = False
On Error Resume Next
sel = tablo
Application.EnableEvents = True
End Sub
Un bémol : l'annulation doit se faire immédiatement après le collage, sans autre sélection.

A+
 
Dernière édition:

job75

XLDnaute Barbatruc
En fait comme la sélection ne change pas la variable sel était inutile :
Code:
Dim tablo 'mémorise la variable

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Source As Range)
tablo = Selection
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
    If .CutCopyMode Then
        .EnableEvents = False
        .Undo
        Selection.PasteSpecial xlPasteValues
        .OnUndo "Annuler", Me.CodeName & ".Annuler"
        .EnableEvents = True
    End If
End With
End Sub

Sub Annuler()
Application.EnableEvents = False
On Error Resume Next
Selection = tablo
Application.EnableEvents = True
End Sub
 

Franco

XLDnaute Nouveau
En fait comme la sélection ne change pas la variable sel était inutile :
Code:
Dim tablo 'mémorise la variable

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Source As Range)
tablo = Selection
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
On Error Resume Next 'sécurité
With Application
    If .CutCopyMode Then
        .EnableEvents = False
        .Undo
        Selection.PasteSpecial xlPasteValues
        .OnUndo "Annuler", Me.CodeName & ".Annuler"
        .EnableEvents = True
    End If
End With
End Sub

Sub Annuler()
Application.EnableEvents = False
On Error Resume Next
Selection = tablo
Application.EnableEvents = True
End Sub

Bonjour,
Ça fonctionne, sauf que :
1- la cellule de destination a un formattage conditionnel et est validé avec une liste de valeur
2- le coller efface la liste de validation de la cellule
3- la cellule adopte le format de bordure de la cellule originale du copier
 

Franco

XLDnaute Nouveau
Bonjour,
Déjà, est-il nécéssaire de passer par du VBA ? En collant des données à la main, il est possible d'aller dans "collage spécial" pour choisir de ne coller que les valeurs. Cela fera la même chose que votre code, mais avec la possibilité d'annuler.

Si pour une raison quelconque vous voulez absolument faire cela en VBA, je pense que la commande "Application.OnUndo" présente une piste de recherche intéresante. Je ne l'ai moi-même jamais utilisée, mais l'aide microsoft indique qu'elle permet de définir la procédure à appeler lorsque l'utilisateur clique sur "annuler" ; peut être serait-il possible de sauvegarder les données de la feuille avant de coller les valeurs (dans un tableau, ou dans une autre feuille par exemple), et de créer une procédure qui récupererait ces valeurs et les remettrait sur la feuille de base si l'utilisateur clique sur annuler ?
Cordialement,

Bonjour,
Oui, ça doit être en VBA, car il arrive que les usagers ne pensent pas à utiliser l'option : coller valeurs seulement.
 

Franco

XLDnaute Nouveau
Cela dit je suis étonné par les remarques de votre post #5.

Car finalement on ne colle que des valeurs, les formats ne sont donc pas modifiés.
Oui, bizarre, voir image ci-jointe.
bordure.png
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87