VBA: copier filtrer coller

bonjour

j'ai un fichier joint dans lequel j'ai un tableau

je souhaite copier une valeur (facile en vba)

puis je fais un filtre du tableau (facile en vba)

puis je colle dans les cellules visibles (facile en vba)

quand j'execute le code, la collage genere une erreur. on dirait qu'il ne mémorise pas la copie.

savez vous comment faire?

je joins le fichier mais voici le code tout simple, ca coicne où c'est surligné en bleu

Sub copie_filtre_colle()

Sheets("Feuil1").Activate

derniereLigne = Sheets("Feuil1").Cells(Rows.Count, 2).End(xlUp).Row ' on recupere la derniere ligne du tableau

'COPIE

Set resu_recherche = Sheets("Feuil1").Range("C:C").Find("commun", LookIn:=xlValues) 'je recherche la premiere ligne om je trouve le mot "commun en colonne C

If resu_recherche Is Nothing Then

Exit Sub

Else

Sheets("Feuil1").Range("E" & resu_recherche.Row).Select ' si on trouve la ligne, on copie la cellule où il y a l'année (en colonne E)

Selection.Copy

End If

'FILTRER

Range("Tableau1").AutoFilter Field:=3, Criteria1:=Array( "oui"), Operator:=xlFilterValues

Range("Tableau1").AutoFilter Field:=1, Criteria1:=Array( "4"), Operator:=xlFilterValues

'COLLER

For ligne_MMO = 3 To derniereLigne

If Sheets("Feuil1").Cells(ligne_MMO, 2).EntireRow.Hidden = False Then

Sheets("Feuil1").Cells(ligne_MMO, 5).Select

ActiveSheet.Paste

End If

Next
End Sub

21essai.xlsm (19.35 Ko)

Bonjour

Essaie comme ça !

Sub copie_filtre_colle()

    Sheets("Feuil1").Activate
    derniereLigne = Sheets("Feuil1").Cells(Rows.Count, 2).End(xlUp).Row ' on recupere la derniere ligne du tableau

     'COPIE
    Set resu_recherche = Sheets("Feuil1").Range("C:C").Find("commun", LookIn:=xlValues) 'je recherche la premiere ligne om je trouve le mot "commun en colonne C

    If resu_recherche Is Nothing Then
        Exit Sub
    Else
        'Sheets("Feuil1").Range("E" & resu_recherche.Row).Select  ' si on trouve la ligne, on copie la cellule où il y a l'année (en colonne E)
        'Selection.Copy
        v = Sheets("Feuil1").Range("E" & resu_recherche.Row)
    End If

    'FILTRER
    Range("Tableau1").AutoFilter Field:=3, Criteria1:=Array( _
        "oui"), Operator:=xlFilterValues
    Range("Tableau1").AutoFilter Field:=1, Criteria1:=Array( _
        "4"), Operator:=xlFilterValues

    'COLLER
    For ligne_MMO = 3 To derniereLigne
        If Sheets("Feuil1").Cells(ligne_MMO, 2).EntireRow.Hidden = False Then
            'Sheets("Feuil1").Cells(ligne_MMO, 5).Select
            'ActiveSheet.Paste
            Sheets("Feuil1").Cells(ligne_MMO, 5) = v

        End If
    Next
End Sub

Bye !

en fait, je veux copier une cellule qui contient une formule...

avec ta méthode, je copie la valeur de la formule.

j'ai actualisé mon fichier exemple avec une une formule dans la cellule à copier.

tu peux regarder à nouveau?

Bonjour,

Ceci peut-être:

Sub copie_filtre_colle()
    Dim f1 As Worksheet
    Dim DerLig
    Dim resu_recherche As Object
    Application.ScreenUpdating = False
    Set f1 = Sheets("Feuil1")
    DerLig = f1.ListObjects("Tableau1").DataBodyRange.Rows.Count + 2 ' on recupere la derniere ligne du tableau

     'COPIE
    Set resu_recherche = f1.Range("C:C").Find("commun", LookIn:=xlValues) 'on recherche la premiere ligne où se trouve le texte "commun en colonne C
    If Not resu_recherche Is Nothing Then
        'FILTRER
        f1.Range("Tableau1").AutoFilter Field:=3, Criteria1:=Array("oui"), Operator:=xlFilterValues
        f1.Range("Tableau1").AutoFilter Field:=1, Criteria1:=Array("4"), Operator:=xlFilterValues
        'COLLER
        For ligne_MMO = 3 To DerLig
            If f1.Cells(ligne_MMO, 2).EntireRow.Hidden = False Then f1.Cells(ligne_MMO, 5).FormulaLocal = "=1990*Tableau1[[#Cette ligne];[numéro]]"
        Next
    End If
    Set f1 = Nothing
End Sub

Cdlt

Bonjour,

Arf, dommage, j'avais fait un truc du genre :

Sub copie_filtre_colle()
Dim C As Long

With Sheets("Feuil1")
    .Activate

    Set resu_recherche = .Range("C:C").Find("commun", LookIn:=xlValues).Offset(0, 2) 'on prend directement la valeur dans la colonne E

    If resu_recherche Is Nothing Then Exit Sub

    With .ListObjects("Tableau1")
        col_numéro = .ListColumns("numéro").Index
        col_prêt = .ListColumns("prêt").Index
        col_resu = .ListColumns("année").Index
        For C = 1 To .ListRows.Count
           If .DataBodyRange.Cells(C, col_numéro).Value = 4 And .DataBodyRange.Cells(C, col_prêt).Value = "oui" Then _
           .DataBodyRange.Cells(C, col_resu).Value = resu_recherche
        Next
    End With
End With
End Sub

@arturo83 : Je veuix éviter les fomulaLOCAL car la forumule est très complexe et je ne veux pas l'écrire en vba.

de plus, si jamais la formule change, je dois actualiser le code VBA.

c'est pourquoi je veux juste un copier coller de la formule pur ne pas être géné par cela.

est-ce possible?

Je veux éviter les fomulaLOCAL car la forumule est très complexe et je ne veux pas l'écrire en vba.,
FORMULALOCAL reprend la formule telle quelle est dans la cellule, nul besoin de chercher à l'écrire en VBA, un simple copié-collé dans le code fait l"affaire.

Ta formule est la même dans toute ta colonne. Qu'espères-tu qu'un copier-coller fasse d'autre que ... rien ?

dans mon exemple, c'est exact.

en réalité, j'ai des formules excels diverses et variées pour chaque ligne.

et je veux justement filtrer pour que les formules soient les memes pour les lignes que je sélectionne

Quelques petites remarques :
-Pourquoi ne pas nous fournir directement un fichier représentatif ?
-Tes formules ne doivent pas être mises au hasard, elles doivent suivre une logique, non ? Si tel est le cas, tu peux te faire une seule formule qui prend tous les cas de figure en compte.

Sinon, ceci a l'air de fonctionner :

Sub recopie_formule()
Dim C As Long, resu_recherche As String 'on passe à une variable texte

With Sheets("Feuil1")
    .Activate

    resu_recherche = .Range("C:C").Find("commun", LookIn:=xlValues).Offset(0, 2).Address 'on récupère l'adresse de la cellule comportant la formule qui t'intéresse

    If resu_recherche = "" Then Exit Sub 'comme on est sur une variable texte, le is nothing ne fonctionne plus, on teste si la variable est vide ou non

    With .ListObjects("Tableau1")
        col_numéro = .ListColumns("numéro").Index
        col_prêt = .ListColumns("prêt").Index
        col_resu = .ListColumns("année").Index
        For C = 1 To .ListRows.Count
           If .DataBodyRange.Cells(C, col_numéro).Value = 4 And .DataBodyRange.Cells(C, col_prêt).Value = "oui" Then _
           .DataBodyRange.Cells(C, col_resu).FormulaLocal = Range(resu_recherche).FormulaLocal
        Next
    End With
End With
End Sub

Et sinon, voici un code encore plus optimisé, orienté vraiment objet tableau structuré.

Tes colonnes peuvent changer d'ordre dans ton tableau, ça fonctionnera toujours :

Sub new_formula()
Dim C, result, rng

With Sheets("Feuil1").ListObjects("Tableau1")
    col_numéro = .ListColumns("numéro").Index
    col_type = .ListColumns("type").Index
    col_prêt = .ListColumns("prêt").Index
    col_année = .ListColumns("année").Index

Set rng = .ListColumns(col_type).DataBodyRange
result = Application.Match("commun", rng, 0) 'je recherche la première ligne où je trouve le mot "commun" en colonne type

If IsError(result) Then Exit Sub

    For C = 1 To .ListRows.Count
    With .DataBodyRange
        If .Cells(C, col_numéro).Value = 4 And .Cells(C, col_prêt).Value = "oui" Then _
        .Cells(C, col_année).FormulaLocal = .Cells(result, col_année).FormulaLocal
    End With
    Next
End With
End Sub

Si vous trouvez encore mieux, je suis preneur. Si tu repasses par ici gmb, n'hésite pas à améliorer, ça me fera plaisir :)

merci je vais tester.

pour répondre à joyeux noel : c'est un doc d'entreprise donc je ne peux pas le donner tel quel.

c'est des formules réalisées par des collegues et ca ne suit absoulemnt aucnue logique d'où ma question sur ce forum.

merci pour votre aide, je vais tester et je reviens si ca marche pas

Bonjour,

Tu peux même revenir si ça marche, pour mettre le sujet en résolu.

On ne te demandait pas ton fichier tel quel, mais un fichier représentatif, c'est à dire avec au moins tes fonctions bizarres dans un 1er temps. Juste manière d'éviter de partir sur de fausses pistes.

Après, peut-être le fichier peut-il être repensé, mais là c'est une autre histoire.

RE

bon, ca ne marche toujours pas.

je joins un fichier vraiment représentatif.

si je teste les propositions, ca copie la formule sans appliquer le décalage relatif aux cellules.

en gros si ca copie une une formule de type 1900*B4 à la ligne 4 et que ca la colle à la ligne 6 ca me donne ca : 1900*B4 alors que je je veux 1900*B6

je comprends pas pourquoi le simple copier-coller en vba ne marche pas?

C'est pas possible de faire un copier coller?

quand j'enregistre la macro, ca a l'air de fonctionner mais quand j'adate le code pour faire une boucle suite à un filtre, ca ne marche plus...

Bien sûr que si, ça marche.

Tout ce qu'on t'a donné a toujours répondu à ta demande.

Le problème étant que tu changes de demande à chaque fois...

=1900*[@numéro]

bonjour

j'ai renvoyé un fichier représentatif avec les formules excel

il se trouves que les formules n'utilisent pas le format "=1900*[@numéro]" mais plutot "=1900*B6"

Je sais que c'est incohérent comme il s'agit d'un tableau formaté mais je vous assure que c'est le cas et je ne peu pas changer la tete des formules, elles sont bien trop longues et complexes.

pouvez-vous m'aider svp?

Bonjour,

Les autres peut-être, moi non.

Tu as usé ma patience, à changer incessamment tes demandes.

La structure que je t'ai donnée fonctionne. Si tu ne peux pas l'utiliser, que veux-tu que je te dise ? De toute façon ça ne conviendra pas parce que ceci, ou parce que cela...

Bonjour à tous,

Que cherchez-vous à faire exactement (l'objectif pas la manipulation) ?

Sinon, j'ai l'impression que la solution a déjà été donnée et j'ai peut-être mal compris mais je vois peu d'intérêt à copier une formule déjà présente sur la feuille ? Il suffirait de correctement bloquer les références pour éviter une macro.

Cdlt,

bonjour

sans etre de mauvaise foi, j'ai testé ta solution JoeuxNoel sur le 2e fichier joint( celui que tu as utilisé pour répondre à ma demande), c'est celui qui S'appelle

essai-avec-formule-bis.xlsm (23.63 Ko)

La solution ne marche pas, je comprends pas comment tu vois qu'elle marche.

voici mon tableau dans le fichier:

  1. ta macro copie la formule dans la colonne année qui est à la 2e ligne (en rouge)
  2. Puis la macro identifie les lignes selon les critères du filtre et remplace la formule (surligne en jaune)
  3. or ta formule recopie ce qu'il y anen rouge tel quel
  4. cependant, je demande à ce que la formule s'adapte au décalage relatif des lignes (voir ce que je demande en bleu)

pas grave si tu veux pas répondre, je vais reposter et expliquer autrement

numérotypeprêtannéeles formules utilisées dans la colonne Eles formules finales dans la colonne Ece que je veux
1uniqueoui1989=1990-[@numéro]
2communnon1988=1990-B4

3uniquenon9953=1990*5+B5

4communoui7960=1990*B6=1990-B4
=1990-B6
(car on est sur la 6e lign

1uniqueoui1988=1990-B7*2

2communoui1984=1990-B8*3

3uniquenon17910=1990*B9*3

4uniquenon1978=1990-B10*3

1uniqueoui1993=1990+B11*3

2communoui7960=1990*B12*2

3communnon5972=1990*B13+2

4communoui23880=1990*B14*3=1990-B4=1990-B14
(car on est sur la 14e ligne)
Rechercher des sujets similaires à "vba copier filtrer coller"