Couper coller avec condition VBA

Bonjour le forum,

Voici le code suivant :

Sub Valider()
If MsgBox("Voulez vous continuer?", vbYesNo, "Confirmation") = vbYes Then
With Sheets("Table Excel")
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Shapes("CheckBox" & i).ControlFormat.Value = 1 Then
            .Shapes("CheckBox" & i).Delete
            .Range(.Cells(i, 3), .Cells(i, 17)).Copy Destination:=Sheets("BD").Range("A" & Sheets("BD").Range("A" & Sheets("BD").Rows.Count).End(xlUp).Row + 1)
            .Rows(i).Delete
        End If
    Next i
Call Ajout_checkbox
End With
End If
End Sub

En fait ce que j'ai pu faire dans un premier temps c'est de couper coller une ligne :si l'utilisateur coche une case à cocher, la macro coupe et colle la ligne concernée par la case à cocher de la feuille (Table Excel) vers la table (BD);

Maintenant ce que je souhaiterai faire et je n'ai pas pu faire, c'est couper coller une ligne de la feuille (Table Excel) vers la feuille (BD) si la ligne n'est pas déjà présente dans la feuille BD pour éviter les doublons (critère de comparaison: rapprochement entre la colonne D de la (Table Excel) et la colonne B de la table (BD)).

Si la ligne est présente afficher un message d'erreur.

Merci d'avance

Amicalement

Bonjour

Une macro sans fichier, c'est comme une auto sans roues : ça n'avance pas !

Bye !

66fichier.xlsm (211.92 Ko)

Bonjour,

Merci bcp pour ta réponse.

Ci joint le fichier.

Amicalement

Essaie la modification suivante :

Sub Valider()
If MsgBox("Voulez vous continuer?", vbYesNo, "Confirmation") = vbYes Then
With Sheets("Table Excel")
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Shapes("CheckBox" & i).ControlFormat.Value = 1 Then
            Set cell = Sheets("BD").Range("B:B").Find(Cells(i, "D").Value)
            If Not cell Is Nothing Then
                MsgBox "Cet IDRH existe déjà sur la feuille BD", 16
            Else
                .Shapes("CheckBox" & i).Delete
                .Range(.Cells(i, 3), .Cells(i, 17)).Copy Destination:=Sheets("BD").Range("A" & Sheets("BD").Range("A" & Sheets("BD").Rows.Count).End(xlUp).Row + 1)
                .Rows(i).Delete
            End If
        End If
    Next i
Call Ajout_checkbox
End With
End If
End Sub

Oups ! J'ai oublié un

End

après le Msgbox

bonjour gmb,

Merci bcp c'est très gentil ça marche nickel chrome.

Merci encore.

Amicalement

Bonjour gmb, Bonjour le forum,

J'ai un autre souci peut être que tu pourras m'aider,

Feuille Table Excel = Ligne en attente de validation

en fait, la feuille (Table Excel) est alimentée par une base de données sql, avec une actualisation des données à l'ouverture du fichier excel.

ce que souhaiterai faire c'est que à chaque fois qu'une ligne est validée (coupée collée dans la feuille BD) ou rejetée (coupée collée dans la feuille journal de rejet), je la supprime de la base de données comme ça lors de l'actualisation de la feuille Table Excel, j'aurai pas cette ligne en attente soit de validation soit de rejet.

Merci d'avance.

Amicalement

Bonjour

Tu me parles de base de données sql.

Là , je n'y connais rien, je sais à peine ce que c'est.

Désolé...

merci bcp gmb, ce n'est pas grave

have a nice day

Bonjour gmb, bonjour le Forum,

Je pense que j'ai une idée pour contourner sql, mais je ne sais pas comment la mettre en oeuvre.

Ce que je souhaiterai faire, dans thisworkbook j'ai le code suivant qui me permet d'actualiser les données et rajouter des cases à cocher:

Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:01"), "Ajout_checkbox"

End Sub

Je souhaiterai rajouter le traitement suivant mais comme je ne sais pas je me retourne vers toi, ça sera très gentil de ta part:

On regarde pour chaque ligne sur la feuille (Table Excel), on fait un rapprochement avec les feuilles (BD) et (Journal de rejet) afin de voir si cette ligne figure sur la feuille BD ou bien la feuille Journal de rejet.

Si c'est le cas je supprime la ligne de la feuille (Table Excel)

Merci d'avance.

Amicalement

Comme critère de rapprochement la colonne IDRH

Bonjour

Tu as écris, en complément d'un message précédent :

Comme critère de rapprochement la colonne IDRH

Je l'ai lu trop tard.

J'ai pris la ligne entière comme critère.

A tester.

13fichier-v1.xlsm (208.32 Ko)

Je viens de voir ta réponse, elle était sur la page 2 j'ai même pas vu.

Merci bcp c'est très gentil de ta part

Amicalement

Bonjour gmb,

ça marche nickel chrome sauf que le rapprochement sur toute la ligne peut me poser des problème ( les majuscules, minuscules par exemples).

c'est de ma faute, je l'ai rajouté en retard. merci et mille merci c'est très gentil de ta part

Bonjour

Tu écris :

le rapprochement sur toute la ligne peut me poser des problème

Alors ...voilà avec le rapprochement avec seulement les valeurs IDRH. A tester.

Bye !

22fichier-v2.xlsm (63.47 Ko)

Bonjour gmb, bonjour le forum,

merci bcp c'est très gentil je vais tester

Amicalement

Bonjour gmb,

ça marche très bien merci bcp

juste une question en fait le traitement prend un temps conséquent (lorsqu'il y a bcp de lignes à supprimer, j'ai essayé avec 93 lignes ça met 19 sec pour les supprimer? est ce normal? y aura t il un remède?

je souhaiterai mettre le traitement à l'ouverture du fichier, donc sur ThisWorkBook, sachant que j'ai deux traitement avant un premier qui met à jour les données à partir de ma base de données sql et un second qui rajoute les cases à cocher. Je souhaiterai lancer ce traitement juste après ces deux traitements.

Merci d'avance

Amicalement

Bonjour

Tu écris :

j'ai essayé avec 93 lignes ça met 19 sec pour les supprimer? est ce normal? y aura t il un remède?

Essaie de rajouter en début de code :

Application.ScreenUpdating = False

tu gagneras peut-être quelques secondes. Sinon ... prends patience !

Bye !

BOnjour gmb,

Merci bcp, j'ai gagné énormément de temps ça passe de 19 sec à 6 sec. merci bcp camarade

T'as une idée pour la deuxième demande:

je souhaiterai mettre le traitement à l'ouverture du fichier, donc sur ThisWorkBook, sachant que j'ai deux traitements avant.

Un premier qui met à jour les données à partir de ma base de données sql

et un second qui rajoute les cases à cocher.

Je souhaiterai lancer ce traitement juste après ces deux traitements.

Amicalement.

Bonjour

Tu écris :

Je souhaiterai lancer ce traitement juste après ces deux traitements.

Il te faut mettre le code à la suite des 2 autres, dans la macro événementielle "Private Sub Workbook_Open()"

Sans ton fichier, je ne peux pas te le faire.

Bye !

Rechercher des sujets similaires à "couper coller condition vba"