Copie de valeurs d'un onglet à l'autre [VBA]

  • Initiateur de la discussion Initiateur de la discussion skygoat76
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

S

skygoat76

Guest
Bonjour,

mon est problème est le suivant:
J'ai 2 onglets "LUP VIE SERIE" (disons A) et "ACTIONS" (disons B)

Je veux balayer ma colonne Y de l'onglet A et si on trouve le mot "OUI" alors je veux copier le texte (colonne I) de la ligne en question dans l'onglet B 1ère colonne et premiere case vide

Si la case de l'onglet B n'est pas vide, il faut passer à la ligne toujours colonne A

J'ai commencé ceci mais cela ne fonctionne pas :

Private Sub Worksheet_Activate()

Dim i, j As Integer

j = 1

For i = 1 To 10000
If Cells(j, 1) = "" Then
If Cells(i, 25).Sheets("LUP VIE SERIE") = "OUI" Then
Cells(j, 1) = Cells(i, 9).Sheets("LUP VIE SERIE")
End If
Else
j = j + 1
End If
Next i

End Sub
 
Re : Copie de valeurs d'un onglet à l'autre [VBA]

bonjour skygoat76,

voici un exemple :
Code:
Private Sub CommandButton1_Click()
Dim ongletA As Worksheet, ongletB As Worksheet
Dim celluleRecherche As Range
Dim premiereAdresse As String
    
    Set ongletA = ThisWorkbook.Sheets("LUP VIE SERIE")
    Set ongletB = ThisWorkbook.Sheets("ACTIONS")
    
    Set celluleRecherche = ongletA.Columns("Y").Find("oui", , xlValues, xlWhole, , , False)
    If Not celluleRecherche Is Nothing Then
        premiereAdresse = celluleRecherche.Address
        Do
            ongletB.Range("A" & ongletB.Rows.Count).End(xlUp).Offset(1, 0).Value = ongletA.Range("I" & celluleRecherche.Row)
            Set celluleRecherche = ongletA.Columns("Y").FindNext(celluleRecherche)
        
        Loop Until celluleRecherche.Address = premiereAdresse
    End If
End Sub
a+
 

Pièces jointes

Re : Copie de valeurs d'un onglet à l'autre [VBA]

Bonjour skygoat76, mromain,

Essayer aussi :

Code:
Private Sub Worksheet_Activate()
Dim i As Long
With Sheets("LUP VIE SERIE")
  For i = 1 To .[Y65536].End(xlUp).Row
    If .Cells(i, "Y") = "OUI" Then Columns(1).Find("", LookIn:=xlValues) = .Cells(i, "I")
  Next
End With
End Sub

S'il n'y a pas de cellules vides intermédiaires dans la feuille activée, il serait plus rapide d'utiliser dans la macro le filtre automatique sur la feuille copiée.

Edit : la macro se déclanche chaque fois que la feuille est activée...

Il vaudrait mieux utiliser un bouton comme le propose mromain 🙂

A+
 
Dernière édition:
Re : Copie de valeurs d'un onglet à l'autre [VBA]

Merci à vous 2,

mromain, ta solution fonctionne très bien dans ton exemple mais je souhaiterais que ce soit automatique à l'ouverture et lors d'un changement de feuille, non avec un bouton.

C'est faisable?

@job75

Oui, il y a des cellules vides intermédiaires dans ma colonne
 
Re : Copie de valeurs d'un onglet à l'autre [VBA]

En effet, j'ai fait le test. La solution de job75 est très bien.

J'ai encore une requête : sa solution fait que quand je vais sur l'onglet "ACTIONS", même si les valeurs sont déjà copiées, la macro fait qu'il les recopie de nouveau...

Or, mon fichier est voué à s'agrandir sans cesse...

Y'a-t-il un moyen pour que la macro ne copie pas "sans réfléchir" les valeurs si elles sont déjà copiées?

Job75
Non, non tout se passe très bien! la résultat est à la hauteur...
La seule chose qui me chiffonne, c'est le temps de copie inutile.
Votre macro copie mes valeurs sans cesse dès que je retourne sur l'onglet "ACTIONS".
Je pense qu'il est possible d'ajouter un test pour éviter cela.

On constate un clignotement de la feuille pendant la copie des lignes car je précise qu'en fait, j'ai plus de 300 lignes et que ce n'est que le début.
Y'a-t-il une optimisation à apporter?

mromain
Je constate la même chose avec ta macro. Le résultat est conforme à ma demande.
Je souhaite juste une optimisation pour éviter une recopie inutile des valeurs déjà copiées (si possible bien sûr)
 
Dernière modification par un modérateur:
Re : Copie de valeurs d'un onglet à l'autre [VBA]

En effet, j'ai fait le test. La solution de job75 est très bien.

J'ai encore une requête : sa solution fait que quand je vais sur l'onglet "ACTIONS", même si les valeurs sont déjà copiées, la macro fait qu'il les recopie de nouveau...

Or, mon fichier est voué à s'agrandir sans cesse...

Y'a-t-il un moyen pour que la macro ne copie pas "sans réfléchir" les valeurs si elles sont déjà copiées?
re,

essaye le classeur de mon post n° #5...
ça fait une RAZ et recalcule tout à chaque fois.

a+
 
Re : Copie de valeurs d'un onglet à l'autre [VBA]

Re,

Y'a-t-il un moyen pour que la macro ne copie pas "sans réfléchir" les valeurs si elles sont déjà copiées?

Tout dépend de ce que vous voulez exactement (car ce n'est pas très très clair).

La macro de mromain efface d'abord la colonne A de l'onglet "ACTIONS", donc il 'n'y a pas duplication des copies.

Si vous ne voulez pas ça il vaut mieux un bouton comme je le disais.

On peut aussi dans la feuille copiée mettre un "X" dans une colonne supplémentaire (Z par exemple) quand il y a copie. La macro testera si ce "X" existe ou non. Cela vous intéresse ???

A+
 
Re : Copie de valeurs d'un onglet à l'autre [VBA]

Re,

Bon, pour illustrer ce que je disais précédemment :

Code:
Private Sub Worksheet_Activate()
Dim i As Long
Application.ScreenUpdating = False
With Sheets("LUP VIE SERIE")
  For i = 1 To .[Y65536].End(xlUp).Row
    If .Cells(i, "Y") = "OUI" And .Cells(i, "Z") <> "X" Then
      .Cells(i, "Z") = "X" 'pour repérer la copie
      Columns(1).Find("", LookIn:=xlValues) = .Cells(i, "I")
    End If
  Next
End With
End Sub

Application.ScreenUpdating = False évite le clignotement de l'écran.

A+
 
Re : Copie de valeurs d'un onglet à l'autre [VBA]

Re,

Re,

Bon, pour illustrer ce que je disais précédemment :


Code:
Private Sub Worksheet_Activate()
Dim i As Long
Application.ScreenUpdating = False
With Sheets("LUP VIE SERIE")
For i = 1 To .[Y65536].End(xlUp).Row
If .Cells(i, "Y") = "OUI" And .Cells(i, "Z") <> "X" Then
.Cells(i, "Z") = "X" 'pour repérer la copie
Columns(1).Find("", LookIn:=xlValues) = .Cells(i, "I")
End If
Next
End With
End Sub

A+

Oui, cette façon est bien mais en utilisant la colonne A (pas Z) de l'onglet "LUP VIE SERIE", vous pouvez ajouter un "X" pour faire votre test. J'ai corrigé le "Z" en "A"

Application.ScreenUpdating = False ====> SUPER !

Si vous pouviez ajouter une chose,

si dans la colonne V, on trouve la valeur "Soldée" (attention, c'est une formule que me donne ce mot) alors ne plus prendre en compte dans l'onglet "LUP VIE SERIE" la valeur concernée
 
Dernière modification par un modérateur:
Re : Copie de valeurs d'un onglet à l'autre [VBA]

😛 Je venais de le faire...

Cela fonctionne à la presque perfection.

Je m'explique et c'est la fin, je vous assure.

Imaginons que je me trompe en mettant "Soldée" puis en l'enlevant.
Votre macro va mettre un "X" sur sa ligne en colonne A mais ne va pas l'enlever...alors que la ligne n'est plus soldée.

Une solution?

LUP_VIE_SERIE_TEST.xls - 5.5 Mb
 
Dernière modification par un modérateur:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
15
Affichages
815
Réponses
8
Affichages
797
Réponses
5
Affichages
926
Réponses
2
Affichages
528
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
463
Retour