Copier coller ligne si condition... HELLLP PLZ

Résolu
besoin_d'aide Messages postés 30 Statut Membre -  
Polux31 Messages postés 7219 Statut Membre -
Bonjour,

je galère encore en VBA, si quelqu'un pourrait m'aider svp..
Je voudrai en fait copier coller une ligne si la cellule Z de la feuille "entrée-sortie" est >= la cellule C8 de la feuille détails.

Deux problèmes se posent : la fonction ne s'exécute pas toute seule
Il me duplique la ligne à copier alors que je veux que si elle existe, il ne la copie pas

voilà ce que j'avais écris

Sub Détails()
'
Dim Place As Long
' 1ère ligne vide
Place = 1 + Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'rechercher les cellules non vides
Worksheets("entrée-sortie").Select
ligES = 4
While Cells(ligES, 1) <> ""
ligES = ligES + 1
Wend
'
For i = 4 To ligES - 1
'workSheets("entrée-sortie").Range("A" & n) , Sheets("entrée-sortie").Range("A" & n).End(xlToRight)).Copy
Sheets("détails").Select
If Sheets("entrée-sortie").Range("Z" & i) >= Sheets("détails").Range("c8") Then
Worksheets("entrée-sortie").Range("A4:DQ4").Copy _
Destination:=Worksheets("détails").Range("A" & Place)
Place = Place + 1
Application.DisplayAlerts = True
End If
Next i

End Sub

et voilà le code en entier de toute la page:

Private Sub ComboBox1_Change()
Dim i As Long, drLig As Long
Dim maFeuil As Worksheet

If ComboBox1 = "" Then Exit Sub
'ignorer erreur feuille existante
On Error Resume Next
'Si la feuille n'existe pas
If Not FeuilleExiste(ThisWorkbook, ComboBox1) Then
Application.DisplayAlerts = False
'on fait une copie de la feuille active
ActiveSheet.Copy after:=Sheets(Sheets.Count)
'on affecte cette nouvelle feuille à la variable maFeuil
Set maFeuil = ActiveSheet
'on la renomme
maFeuil.Name = ComboBox1
'On supprime les lignes inutiles
drLig = Range("A" & Rows.Count).End(xlUp).Row
For i = drLig To 11 Step -1
If UCase(maFeuil.Range("J" & i).Value) Like "*DEJA*" Then maFeuil.Rows(i).Delete
Next
Application.DisplayAlerts = True
End If
'
Dim Place As Long
' 1ère ligne vide
Place = 1 + Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'rechercher les cellules non vides
Worksheets("entrée-sortie").Select
ligES = 4
While Cells(ligES, 1) <> ""
ligES = ligES + 1
Wend
'
For i = 4 To ligES - 1
'workSheets("entrée-sortie").Range("A" & n) , Sheets("entrée-sortie").Range("A" & n).End(xlToRight)).Copy
Sheets("détails").Select
If Sheets("entrée-sortie").Range("Z" & i) = Sheets("détails").Range("c8") Then
Worksheets("entrée-sortie").Range("A4:DQ4").Copy _
Destination:=Worksheets("détails").Range("A" & Place)
Place = Place + 1
Application.DisplayAlerts = True
End If
Next i

End Sub

'On y ajoute la fonction de Bbil :
Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
On Error Resume Next
FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
End Function

'lorsque l'on active la feuille (quand elle est active)
Private Sub Worksheet_Activate()
Dim i As Byte

Range("A5").Value = ComboBox1
'on vide la liste des mois
ComboBox1.Clear
With ComboBox1
'et on la remplit
For i = 1 To 12
.AddItem Format(CDate("01/" & i & "/2000"), "mmmm")
Next i
End With
End Sub

MERCI

14 réponses

  1. besoin_d'aide Messages postés 30 Statut Membre
     
    s'il vous plaiit, je tourne en rond et je n'ai pas trouvé de solution ...
    pourquoi mon code, dès qu'il arrive à Worksheets("détails").Activate, il saute directement à Private Sub worksheet_activate()

    j'avoue je suis plus qu'une quiche en informatique en général ...
    Merci

    voilà le code :
    'insérer recrus
    Private Sub détails()

    Dim Place As Long
    ' 1ère ligne vide dans détails
    Place = 1 + Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
    'rechercher cellules non vides
    Worksheets("entrée-sortie").Select
    ligES = 4
    While Cells(ligES, 1) <> ""
    ligES = ligES + 1
    Wend

    'Balayer les lignes de ES
    For i = 4 To ligES
    Worksheets("détails").Activate
    If Sheets("entrée-sortie").Range("Z" & i) = Sheets("détails").Range(c8).Value Then
    Worksheets("entrée-sortie").Range("ligES").Copy
    Destination = Sheets("détails").Range("A" & Place)
    Place = Place + 1
    End If
    Next i

    'Eviter doublons
    Dim lig As Double
    'tri sur identifiant
    ActiveSheet.UsedRange.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

    For lig = 1 To ActiveSheet.UsedRange.Rows.Count
    If Cells(lig, 1).Value = Cells(lig + 1, 1).Value _
    And Cells(lig, 1).Value <> "" Then
    'regroupement
    Cells(lig, Cells(lig, 256).End(xlToLeft).Column + 1).Value _
    = Cells(lig + 1, 4).Value
    'suppression ligne regroupée
    Rows(lig + 1).Delete
    lig = lig - 1
    End If
    Next lig

    End Sub

    'lorsque l'on active la feuille (quand elle est active)
    Private Sub worksheet_activate()
    Dim i As Byte

    Range("A5").Value = ComboBox1
    'on vide la liste des mois
    ComboBox1.Clear
    With ComboBox1
    'et on la remplit
    For i = 1 To 12
    .AddItem Format(CDate("01/" & i & "/2000"), "mmmm")
    Next i
    End With

    End Sub
    0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Salut,

    pourquoi mon code, dès qu'il arrive à Worksheets("détails").Activate, il saute directement à Private Sub worksheet_activate() ?

    Parce que, comme tu l'as commenté dans ton code :
    'lorsque l'on active la feuille (quand elle est active)
    Private Sub worksheet_activate()


    Il faut éviter les Sheets().Select ou Sheets().Activate.
    Pour cela je te conseille de déclarer des objets Worksheets en entête de procédure :

    Dim wsDetail As Worksheets
    Dim wsEntreeSortie As Worksheets

    Et ensuite d'instancier les objets:

    Set wsDetail = Thisworkbook.Worksheets("détails")
    Set wsEntreeSortie = Thisworkbook.Worksheets("entrée-sortie")

    Et pour les utiliser :

    Dim Place As Long
    ' 1ère ligne vide dans détails
    Place = 1 + wsDetail.Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
    'rechercher cellules non vides
    'Worksheets("entrée-sortie").Select // devient inutile //
    ligES = 4
    While wsEntreeSortie.Cells(ligES, 1) <> ""
    ligES = ligES + 1
    Wend 


    A toi de modifier le reste de ton code en conséquence et de supprimer les lignes devenues inutiles.

    ;0)
    0
  3. besoin_d'aide Messages postés 30 Statut Membre
     
    merci pour ta réponse, je commençais à perdre espoir qu'on me réponde, je vais tenter ce que tu m'as dis et te dirais si ça a marché.
    Merci encore une fois
    0
  4. besoin_d'aide Messages postés 30 Statut Membre
     
    bonjour,
    j'ai une erreur de compilation n° 13 ;
    Set wsDetail = Thisworkbook.Worksheets("détails")
    Set wsEntreeSortie = Thisworkbook.Worksheets("entrée-sortie")
    ne fonctionne pas :s
    merci
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. besoin_d'aide Messages postés 30 Statut Membre
     
    franchement ca marche pas, je suis une quiche en informatique, cela fait des jours (plus de deux semaines) que je galère pour un petit programme... je lis et relis et me forme seule mais là... je n'y arrive pas...
    Je remercie d'avance tous ceux qui peuvent m'aider
    cordialement
    0
  7. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Effectivement, j'ai fait ça de tête

    Il faut modifier ceci :

    Dim wsDetail As Worksheets
    Dim wsEntreeSortie As Worksheets

    Par

    Dim wsDetail As Worksheet
    Dim wsEntreeSortie As Worksheet

    Désolé pour cette erreur grossière de ma part.
    0
  8. besoin_d'aide Messages postés 30 Statut Membre
     
    merci pour tout :)
    Une autre question svp :
    j'ai ce code, destiné à me remplir ma combobox par les mois. Le problème, c'est qu'elle ne s'exécute pas, et il faut entrer dans le code et mettre exécuter sub pour que ca marche. Que dois-je faire

    Dim j As Byte

    Range("A5").Value = ComboBox1
    'on vide la liste des mois
    ComboBox1.Clear
    With ComboBox1
    'et on la remplit
    For j = 1 To 12
    .AddItem Format(CDate("01/" & j & "/2000"), "mmmm")
    Next j
    End With

    MERCI ENCORE UNE FOIS
    0
  9. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Désolé, je ne comprends pas trop ce que tu veux faire et j'ai besoin d'en savoir un peu plus.

    Ou se trouve ta combo ? (Userform, sheets)
    Après quel évènement la combo doit se remplir ?
    0
  10. besoin_d'aide Messages postés 30 Statut Membre
     
    Bonjour,
    j'ai une feuille excel, avec un combobox , il comprend les mois (de janvier à décembre).. Normalement, en changeant le mois, une nouvelle feuille est créée.
    le problème c'est qu'à l'ouverture, le combobox n'est pas rempli .. je dois dans ce cas visualiser le code et mettre "exécuter sub " pour qu'il soit rempli...
    merci
    0
  11. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Admettons que le combobox contenant les mois soit sur le feuille 1 du classeur.

    Dans l'éditeur VB du classeur, il y a à gauche, sous les feuilles, un élément ThisWorkbook. En double cliquant dessus, on ouvre à droite la fenêtre d'édition. Dans la liste déroulante de gauche (Général), il faut cliquer sur "Workbook". On a alors ça

    Private Sub Workbook_Open()
    
    End Sub


    C'est ici qu'il faut mettre le code qui remplit le combobox.
    0
  12. besoin_d'aide Messages postés 30 Statut Membre
     
    Bonjour,
    ca ne marche pas :( erreur 424 .
    le problème c'est que le code marchait quand je l'avait sur la feuille , mais il faut l'exécuter à chaque fois
    voici mon code au cas où :
    Private Sub workbook_open()
    Dim x As Byte
    'on vide la liste des mois
    With ComboBox1
    'et on la remplit
    For x = 1 To 12
    .AddItem Format(CDate("01/" & x & "/2000"), "mmmm")
    Next x
    End With
    End Sub

    MERCI
    0
  13. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Que veux-tu dire par : "il faut l'exécuter à chaque fois" ?

    J'avoue ne pas comprendre ce que tu cherches à faire. Essaies d'être un peu plus précise dans tes demandes.

    Le code ne fonctionne pas parce que tu ne lui dis pas où se trouve le combobox !!!
    0
  14. besoin_d'aide Messages postés 30 Statut Membre
     
    merci pour ta réponse, c'est bon j'ai réussi, comment je ne sais pas mais ca c'est fait :)....
    Je voulais te mettre le fichier sur cjoint, mais le site ne fonctionnait pas...
    Merci
    0
  15. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Content pour toi.

    Bonne continuation.

    ;0)
    0