XL 2016 Selection.replace inopérante

albuqs

XLDnaute Nouveau
Bonjour à tous,

J'espère vous trouver en bonne forme.
Je pense pas qu'il y aura besoin de fichier pour un œil averti, cas échéant je le prépare.

J'ai actuellement le petit bout de code suivant:

VB:
Sub MAGICPASTE()

    'on verifie l'état du mode copié/collé d'excel
     Select Case Application.CutCopyMode
    'si une plage a été copiée (ctrl+c) alors
    Case Is = xlCopy

    'on colle la selection dans la cellule active en valeur et en ométant les vides
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=True, Transpose:=False
        
    'on remplace les valeurs précédemment collées 0 par du vide
        Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
   
    'on remplace les valeurs 60 précédemment collées par du vide
            Selection.Replace What:="60", Replacement:="61", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False

    'sinon, si aucune plage n'a été copiée
    Case Else

    'on le fait remarquer!
        MsgBox "Il n'y a rien à copier !", vbOKOnly + vbCritical

    End Select


End Sub

Le collage fonctionne à merveille... en revanche la substitution derrière ne fonctionne pas.
J'ai le sentiment que le .selection ne fait plus référence à la plage collée, sans doute une subtilité... (?!)

J'ai bien tenté de mettre la plage collée dans une variable range et de la rappeler en vue de la substitution, mais sans effet....

Je précise que la substitution ne doit s'opérer QUE dans la plage qui vient d'être collée, histoire de pas flinguer le reste des données du tableau de destination....

J'ai également des évènements selection_change et worksheet_change sur la page, dès lors j'ai tenté le coup en passant le EnableEvents à False des fois que, mais ça ne change rien...

Si quelqu'un a une idée :)

Bien à vous,
 
Dernière édition:
Solution
Bon, bah je suis nul, mais j'ai trouvé.

Du coup desfois qu'un autre nul serait confronté à la même situation:


VB:
Sub MAGICPASTE()

    'on déclare notre variable pour récupérer la plage de selection tout à l'heure
    Dim dest As String

Application.ScreenUpdating = False

    'on verife l'état du mode copié/collé d'excel
     Select Case Application.CutCopyMode
    'si une plage a été copiée (ctrl+c) alors
    Case Is = xlCopy

    'on colle la selection dans la cellule active en valeur et en ométant les vides
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=True, Transpose:=False
           
    'on attribue l'adresse de la plage à la variable
    dest = Selection.Address...

albuqs

XLDnaute Nouveau
Après multiples tests, le code semble fonctionner... sauf sur mon classeur.

En utilisant l'enregistreur de macro, ça fonctionne, il me rajoute une étape qui vise à resélectionner la plage.

VB:
Sub Macro2()
'
' Macro2 Macro
'

'
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
    Application.CutCopyMode = False
    
        'ActiveSheet.Unprotect
        
    Selection.Replace What:="60", Replacement:="61", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=False
        
    Range("Q49:AU55").Select
    
    Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
        ReplaceFormat:=False
        

End Sub

Me reste donc, à priori, à parvenir à récupérer la selection dans une variable range pour la rappeller....
 
Dernière édition:

albuqs

XLDnaute Nouveau
Bonjour sylvanu,

Grâce à MatchCase:=True.

Sinon on en est là... le premier remplacement s'effectue, ça avance, le second en revanche implique de resélectionner la plage.

Je dois donc parvenir à stocker la plage dans une variable entre les deux étapes pour la reselectionner... en gros récupérer, je pense, selection.address pour le réutiliser ensuite....
 
Dernière édition:

albuqs

XLDnaute Nouveau
Bon, bah je suis nul, mais j'ai trouvé.

Du coup desfois qu'un autre nul serait confronté à la même situation:


VB:
Sub MAGICPASTE()

    'on déclare notre variable pour récupérer la plage de selection tout à l'heure
    Dim dest As String

Application.ScreenUpdating = False

    'on verife l'état du mode copié/collé d'excel
     Select Case Application.CutCopyMode
    'si une plage a été copiée (ctrl+c) alors
    Case Is = xlCopy

    'on colle la selection dans la cellule active en valeur et en ométant les vides
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=True, Transpose:=False
           
    'on attribue l'adresse de la plage à la variable
    dest = Selection.Address
       
    'on désactive le mode copié-collé
    Application.CutCopyMode = False
   
    'on remplace les valeurs précédemment collées 0 par du vide
        Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
         
    'on (re)sélectionne notre plage en faisant appel à la variable
    Range(dest).Select
   
        'on remplace les valeurs 60 précédemment collées par autre chose (61 ici)
            Selection.Replace What:="60", Replacement:="61", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False

    'sinon, si aucune plage n'a été copiée
    Case Else

    'on le fait remarquer!
        MsgBox "Il n'y a rien à copier !", vbOKOnly + vbCritical

    End Select

Application.ScreenUpdating = True

End Sub

Voili voilou, désolé du dérangement :)
 

Discussions similaires

Réponses
1
Affichages
205