Copier coller VBA en gardant la mise en forme du texte d'origine

ted1057

XLDnaute Occasionnel
Bonjour à tous,

Je suis entrain de créer un suivi d'affaires ou j'ai besoin que la cellule copier est le même format que celle d'origine en terme de Couleur d'écriture, Gras, Italique, etc...

Ci dessous, la façon dont je copie mes données. Je ne voulais pas utiliser la fonction "paste" afin de gagner en rapidité de code (si on peut dire ainsi)
Code:
Sub Mise_a_jour_commentaires_planning_fiches()

Dim N_Affaire As String

Application.ScreenUpdating = False

Sheets("Suivi Affaires").Select

affaire = Cells(Rows.Count, "a").End(xlUp).Row

Range(Cells(6, 1), Cells(affaire, 10)).Select
Majuscule


Sheets("Planning").Select
Nbr_Affaire = Cells(34, 4)

d = 35

For h = 6 To affaire
Sheets("Suivi Affaires").Select
N_Affaire = Cells(h, 2)
Commentaire = Cells(h, 10)
Sheets("Planning").Select
Cells(d, 4).Select
Nbr_Affaire = ActiveCell
Numéro_Affaire = Cells(d, 9)
If Numéro_Affaire = N_Affaire Then
Sheets("Planning").Cells(d + 4, 12) = Commentaire
Sheets(N_Affaire).Cells(46, 1) = Commentaire
d = ActiveCell.Row + Nbr_Affaire
Else

ligne = ActiveCell.Row
Cells(Nbr_Affaire + ligne, 4).Select
d = ActiveCell.Row
End If


Next h


End Sub

Auriez vous des idées pour réaliser ceci?

Merci par avance,

Cordialement,
 
Dernière édition:

Theze

XLDnaute Occasionnel
Re : Copier coller VBA en gardant la mise en forme du texte d'origine

Bonjour,

Je ne voulais pas utiliser la fonction "paste" afin de gagner en rapidité de code (si on peut dire ainsi)
Si tu veux récupérer la mise en forme de la cellule source, il est plus rapide de faire un collage spécial du formatage plutôt que de recherche toutes les possibilités de mise en forme que pourrait avoir la cellule. Ici, ne copie que le formatage :
Code:
Range("Source").Copy Range("Cible").PasteSpecial(xlPasteFormats)
Maintenant, si tu veux gagner en rapidité, évite tous les "Select" et Activate" et là déjà, tu gagnera pas mal de temps. Prends l'habitude de déclarer et de typer tes variables car toutes variables non typées au comme type "Variant" qui n'est pas le plus économique en mémoire. Le fait de rendre obligatoire la déclaration des variables (Option Explicit en tête de module) va t'éviter bien des tracas car une simple petite erreur de frappe sur une variable et le compilateur va considérer ce mot comme une nouvelle variable et le résultat sera sûrement pas celui que tu attends ! Pour être sûr que la déclaration des variables obligatoire soit faite sur tous les module, tu clique sur le Menu "Outils"-->"Options..."-->Onglet "Editeur"-->Cocher "Déclaration des variables obligatoire" et au prochain lancement d'Excel, quand tu ouvriras un module, "Option Explicit" sera écrit d'office. J'ai un peu retouché ton code mais absolument pas testé. A priori, tu appelle une Sub (Majuscule) qui doit probablement travailler sur une plage de cellules et bien il est mieux de passer cette plage en argument à la Sub puisqu'il n'y a plus de plage sélectionnée :
Code:
Option Explicit

Sub Mise_a_jour_commentaires_planning_fiches()

    Dim N_Affaire As String
    Dim affaire As Long
    Dim D As Long
    Dim H As Long
    Dim Nbr_Affaire As Long
    Dim Commentaire As String
    Dim Numero_Affaire As Long
    Dim Ligne As Long
    
    With Sheets("Suivi Affaires")
    
        affaire = .Cells(Rows.Count, "a").End(xlUp).Row
        
        'je suppose que c'est une procédure qui doit travailler sur la plage
        'il est préférable de la passer en argument puisque par défaut c'est ByRef !
        Majuscule .Range(.Cells(6, 1), .Cells(affaire, 10))
        
    End With
    
    D = 35
    
    With Sheets("Planning")
    
    Nbr_Affaire = .Cells(34, 4)
    
        For H = 6 To affaire
        
            N_Affaire = .Cells(H, 2)
            Commentaire = .Cells(H, 10)
            Nbr_Affaire = .Cells(D, 4)
            Numero_Affaire = .Cells(D, 9)
            
            If Numero_Affaire = N_Affaire Then
            
                .Cells(D + 4, 12) = Commentaire
                Sheets(N_Affaire).Cells(46, 1) = Commentaire
                D = .Cells(D, 4).Row + Nbr_Affaire
                
            Else
            
                Ligne = .Cells(D, 4).Row
                D = .Cells(Nbr_Affaire + Ligne, 4).Row
                
            End If
        
        Next H
    
    End With

End Sub

'ici la procédure appelée enfin, je suppose...
Sub Majuscule(Plage As Range)

    'ici ton code qui fait référence à la plage...
    
End Sub
 

Dranreb

XLDnaute Barbatruc
Re : Copier coller VBA en gardant la mise en forme du texte d'origine

Bonjour.
Seul une variable objet devant y être initialisée par un Set doit être transmise ByRef à une procédure.
Si c'est une expression objet définie qui est transmise, elle doit en principe être ByVal dans les paramètres.
L'accès des propriétés en écriture de l'objet y sont indépendante du mode de passation car techniquement un objet n'est qu'un pointeur, c'est à dire une variable contenant une adresse. C'est l'incidence à l'extérieur de la procédure d'une affectation à ce pointeur, donc d'un Set dessus, qui dépend du passage ByVal ou ByRef, et non l'accès en écriture aux structures de l'objet pointé.
 

ted1057

XLDnaute Occasionnel
Re : Copier coller VBA en gardant la mise en forme du texte d'origine

Bonsoir,

Merci pour vos réponses, même si pour Dranreb, je n'ai pas tout compris.
Je vais tester ce que tu m'as écris Theze.

Je pensais utiliser la fonction "destination" mais à priori cela ne fonctionne pas très bien
Code:
Range(cells(i,1)).Copy Destination:=Worksheets("Feuil2").Range(cells(d,4))

l’utilisation du code ci-dessous, ne me permet pas de garder la couleur de la cellule, le format de l'écriture Gras italique, couleur différente du texte d'origine...
Code:
    Sheets("Planning").Cells(D + 4, 12).PasteSpecial Paste:=xlPasteAll
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 319
Membres
103 177
dernier inscrit
grizly