Copier contenu et mise en forme avec formulaR1C1

Roverman

XLDnaute Nouveau
Bonjour à tous,

Après recherches je n'ai pas trouvé ce qu'il me faut. Je pense que ca devrait vite être réglé puisque le chantier n'est pas très important.

Je voudrais juste savoir comment, en plus de copier le contenu des cellules, copier leurs mises en forme. J'ai le code pour la copie de contenu. Est ce qu'il s'agir juste d'une extension qui précise la copie de mise en forme sans exclure la copie de contenu ? Cela m'étonnerait, la copie de contenu me semblerai implicite. Quant à l'extension précisant la copie de la mise en forme, je pense qu'elle exclue la copie du contenu.

Pouvez vous me dire si ce que je pense n'est pas faux et m'indiquer comment procéder pour copier le contenu et la mise en forme ?

Code:
With Sheets("Rapport actuel").Range("A65536").End(xlUp) 
                .Offset(1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C1" 
                .Offset(1, 1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C2" 
                .Offset(1, 2).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C3" 
                .Offset(1, 3).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C4" 
                .Offset(1, 4).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C5" 
                .Offset(1, 12).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C7" 
          End With

Merci beaucoup.
 

Gorfael

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Salut Roverman et le forum
Petit rappel : il n'y a ni télépathe, ni devin sur ce site (du moins à ma connaissance)
Donner un extrait de code n'est pas la solution : on n'a ni le contexte dans il évolue, ni ce qu'il est supposé faire réellement et souvent ce n'est pas ce qu'on lui demande de faire
Tonextrait
Code:
With Sheets("Rapport actuel").Range("A65536").End(xlUp) 
                .Offset(1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C1" 
                .Offset(1, 1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C2" 
                .Offset(1, 2).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C3" 
                .Offset(1, 3).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C4" 
                .Offset(1, 4).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C5" 
                .Offset(1, 12).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C7" 
          End With
On recherche la dernière ligne non vide en A
Sur la ligne suivante, on colle une formule dans les colonnes A, B, C, D, E et M une formule en références absolues
Tu vas donc avoir en Ax une formule du genre : "=Entrée!$A$y" avec Y étant la ligne de la variable Cel
Comme je ne connais pas celle-ci, difficile de proposer un meilleur code, mais regarde FormulaLocal

Pour copier un format, il faut connaître la cellule source et la cellule de destination et il faut utiliser PasteSpecial avec un paramètre du style xlFormat.
A+
 

Roverman

XLDnaute Nouveau
Re : Copier contenu et mise en forme avec formulaR1C1

Bonjour Gorfael,

Désolé mais il ne me semblait pas utile de voir le code entier puisque ma question n'est que sur la copie de cellules. J'ai donc pensé que seul le code concernant la copie était intéressant. Mais puisque tu le souhaite je vais le mettre en entier.

De mon coté je vais rechercher comment faire avec FormulaLocal.

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Cel As Range, Cancel As Boolean)
If Intersect(Cel, [F2:F65536]) Is Nothing Then Exit Sub
Cancel = True
Application.EnableEvents = False
Application.ScreenUpdating = False

For Each Cel In Intersect(Cel, [F2:F65536]) 'traite toutes les cellules sélectionnées colonne F
    If Cel <> "" Then 'si x existe
        Range(Cel, Cel.Offset(0, 1)) = "" 'effacement repères colonnes F et G
        Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 0 'effacement couleur ligne
        Sheets("Rapport actuel").Rows(WorksheetFunction.Match(0, _
        Sheets("Rapport actuel").Range("M:M"), -1)).Delete 'suppression de la ligne en feuille "Rapport actuel" si repère = 0
        Else 'si aucun X
        Cel.Value = "X"
        Cel.Offset(0, 1).Value = 1 'repère colonne G
        Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 15 'mise en couleur
    End If
    
        If Application.CountA([A1:E1].Offset(Cel.Row - 1)) < 5 Then _
            Range(Cel, Cel.Offset(0, 1)) = "" 'si ligne incomplète efface repères colonnes F et G
            Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 0
        Sheets("Entrée").Select

            If Cel.Offset(0, 1) = 1 Then
            Range(Cel.Offset(0, -5), Cel.Offset(0, 1)).Interior.ColorIndex = 15 'mise en couleur
                With Sheets("Rapport actuel").Range("A65536").End(xlUp) 'dernière cellule colonne A
                .Offset(1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C1" 'transfert Opération
                .Offset(1, 1).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C2" 'transfert Temps"
                .Offset(1, 2).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C3" 'transfert Taux
                .Offset(1, 3).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C4" 'transfert Coût"
                .Offset(1, 4).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C5" 'transfert Sous-Traitance et Achat
                .Offset(1, 12).FormulaR1C1 = "=Entrée!R" & Cel.Row & "C7" 'transfert Repère colonne M
                End With
    End If
Next

Call SUPPR_DOUBLONS 'Module 1
Call Couleur_Fixe 'Module 2

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

Merci
 

JNP

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Bonjour le fil :),
Euh, t'es sûr que ton code fait ce que tu souhaites :rolleyes: ?
BeforeDoubleClic renvoie uniquement la cellule où on double clique, pas la plage sélectionnée :eek:...
Tu parles de "copie" mais tu ne fait que remplir des cellules :eek:...
Après, comme proposé par Gorfael, tu peux utiliser Copy et PasteSpecial pour prendre une mise en forme existante, sinon, tu utilises déjà Interior pour la couleur, tu peux utiliser Font pour définir le reste :p...
Enfin, comme tu es sous 2007, tu peux définir un (ou plusieurs) style de cellule personnalisé :
Onglet Accueil -> Section Style -> Style de cellules -> Nouveau style personnalisé -> Lui donner un nom, choisir en cochant ce qu'il inclut et cliquer sur Format... pour définir les propriétés. Après, tu peux y faire directement appel avec la propriété Style, exemple
Code:
Range("E11").Style = "Test"
Bonne suite :cool:
 

Roverman

XLDnaute Nouveau
Re : Copier contenu et mise en forme avec formulaR1C1

Bonjour le fil,

Oui oui JNP mon code fait bien ce que je souhaite :)

Copier ou remplir des cellules à partir d'autres cellules, pour moi c'est exactement la même chose. Après je ne rentre pas dans les détails qui ne me changerons rien.

Merci pour tes pistes en tout cas, j'y ai réfléchie et je me suis dit que finalement j'allais sans doute passer par une condition du genre : Si cellule(ligne i, colonne A) a son texte centré Alors coloré la ligne i.

Qu'en pense tu ? Niveau faisabilité ca devrait le faire mais parlons efficacité et perméabilité. Tant qu'a faire je vais essayer de faire les meilleurs choix dès le départ plutôt que de revenir sur le code en entier dans 1 mois pour optimiser.

Bonne journée :)
 

JNP

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Re :),
A mon avis, si tu remplis une cellule par égalité, le centrage ne sera pas pris en compte, donc ton test ne servira à rien... Mais bon, j'ai peut-être mal compris, sans fichier exemple, difficile de bien cerner le problème :rolleyes:...
Bon courage :cool:
 

Roverman

XLDnaute Nouveau
Re : Copier contenu et mise en forme avec formulaR1C1

Re,

En effet la copie simple ne prend pas en compte la mise en forme, je reviens au même problème :/ Je n'avais encore jamais été confronter réellement au VBA, et comme surement tous les autres langages, il faut se creuser la tête pour trouver une solution adaptée. :)

Je mets une pièce jointe si tu veux jeter un œil.

Hasta luego

Edit : le boulet à oublié la pièce jointe --"
 

Pièces jointes

  • Projet VBA.xls
    132.5 KB · Affichages: 56
  • Projet VBA.xls
    132.5 KB · Affichages: 51
  • Projet VBA.xls
    132.5 KB · Affichages: 55
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Re :),
Ça me parait bien compliqué tes codes :p...
Teste
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)Dim I As Integer
If Intersect(Target, [F2:F65536]) Is Nothing Then Exit Sub
Application.EnableEvents = False
I = Target.Row
With Sheets("Rapport actuel")
    If Target = "" Then
        Target = "X"
        Range("A" & I & ":E" & I).Copy .Range("A" & Rows.Count).End(xlUp).Offset(1)
        If Range("A" & I).Font.Bold = False Then
            Range("A" & I & ":E" & I).Interior.ColorIndex = 15
        End If
    Else
        Target = ""
        .Columns(1).Find(Range("A" & I), lookat:=xlWhole).EntireRow.Delete
        If Range("A" & I).Font.Bold = False Then
            Range("A" & I & ":E" & I).Interior.ColorIndex = 0
    End If
    End If
End With
Application.EnableEvents = True
End Sub
ça fonctionne sur simple clic et ça parait remplacer avantageusement ton évènementielle double-clic :rolleyes:
Bonne suite :cool:
 

Roverman

XLDnaute Nouveau
Re : Copier contenu et mise en forme avec formulaR1C1

Re,

Oui c'est plus de la bidouille que du vrai code c'est certain, mon truc c'est plutôt la méca :). Halte aux préjugés :p

Alors là je suis sur les fesses :eek:. Comment tu as fais pour faire ca ? Tu pars d'une macro ou tu le fais au talent ? Je suis bluffé par le temps que tu as mis, il me faut des heures pour pondre une ligne correcte..

Il y a juste une bricole embêtante, on peut pas cliquer 2 fois de suite sur la même cellule, je pensais faire sélectionner une cellule voisine après le premier click. Tu penses que ca peut régler le problème ?

Sinon juste une petite question, j'ai essayé d'adapter ton code à mon ancien, je sais c'est pas très jolie. Je pense faire une boucle For Each pour traiter toutes les cellules à la suite. Il y a surement plus simple et plus jolie mais j'ai pas assez d'expérience et de pratique pour me lancer dans le hors-piste :)

Sincèrement merci.

A bientôt ;)
 

JNP

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Re :),
C'est juste une question de logique :
J'ai pas d'X : je mets le X, je copie la ligne à la suite de ce qu'il y a sur le rapport
J'ai un X : je l'ôte, je cherche la ligne avec le même libellé (que j'ai forcément, sinon, il n'y aurait pas d'X :rolleyes:), et je la supprime.
Après, il suffit juste de le mettre en musique, en n'oubliant pas : c'est gras, je ne touche pas à la couleur, c'est maigre, je modifie la couleur :p...
Oui, je pense qu'un
Code:
Target.Offset(0,1).Select
en fin de Sub AVANT le EnableEvents devrait le faire ;).
A noter (pour moi, je pense que c'est un avantage, mais bon...) que les lignes sont copiées dans l'ordre de la sélection :rolleyes:...
Pour la boucle, tu peux reprendre exactement mon code, simplement au lieu de Target = "", ce sera un test sur ta quantité, et il faudra définir ton X (ou pas X) en F :D
Bon courage :cool:
 

Roverman

XLDnaute Nouveau
Re : Copier contenu et mise en forme avec formulaR1C1

Re,

C'est vrai que c'est très simple comme raisonnement, je le comprend parfaitement mais pour le rédiger c'est une autre histoire, c'est là qu'on se rend compte qu'on a l'esprit tordu. Toutes les routes mènent à Rome, mais tu seras sans doutes plus rapide et efficace si tu connais la route, ou des raccourcis, que celui qui ne situe pas l'Italie :)

J'ai mis en place le décalage de cellule, j'ai aussi décaler "Application.EnableEvents = False" vers le haut car il y avait un problème en cas de click rapide sur la même cellule.

J'ai remis mon fragment pour interdire de mettre un "X" dans une ligne incomplète, ca marche mais qu'une fois, après le programme s'arrête. Je cherche la raison, je sens que je vais trouver :)

Sinon je ne vois pas du tout comment je peux faire le mode auto avec un test sur la quantité, soit je n'ai pas compris ce que tu voulais me dire, soit l'inverse. Tu voulais parler d'un test sur la quantité de cellules sélectionnées avec une sélection multiple ? Parce que j'ai découvert ce problème sur le mode manuel, si le doigt glisse et sélectionne 2 cellules ça plante, erreur que je ne pouvais pas avoir avec le double click (peut être son seul avantage).

Je pensais à un bouton qui en fait ne sélectionne/de-sélectionne pas, mais plus simplement, change le statut de la ligne si elle est complète. Ce que j'avais dans mon ancien programme. Ce qui permet de reprendre quasiment tout le code du mode manuel. C'est pour cette raison que je pensais faire une boucle avec For Each, ou alors je pensais parcourir les lignes avec incrémentation d'une variable. Ce sont les techniques que j'ai déjà vu et que je comprend très bien.

Comme tu dis, l'important ce n'est pas de savoir se servir des outils, c'est de savoir qu'ils existent. A partir de là ça peut aider. :)

A plus tard !!
 

JNP

XLDnaute Barbatruc
Re : Copier contenu et mise en forme avec formulaR1C1

Re :),
Je voulais dire "test sur Temps/Poids" pour ne pas sélectionner la ligne dans ton "Sélectionner/Désélectionner" :rolleyes:
Contre les sélections multiples, soit tu fait un For Each pour décrire toutes les cellules de la sélection (en vérifiant que l'Intersect avec F est égal à la sélection), soit tu fait un test sur Target.Count qui ne doit pas être supérieur à 1 :p
Bon courage :cool:
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 453
Messages
2 088 551
Membres
103 881
dernier inscrit
malbousquet