VBA : Couper ; Coller ; suppression ligne (selon condition)

Bonjour à tous,

Je vous sollicite de nouveau car je suis confronté à des choses que je ne maîtrise pas encore

Voici un code que sabV m'as gentillement donné pour la copie d'une colonne dans une feuille donnée pour coller en ligne dans une autre feuille sans prendre en compte la cellule C14 de la feuille "TBL B":

Sheets("Data").Rows("3:3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
LastRow = Sheets("TBL B").Cells(Rows.Count, 3).End(xlUp).Row

For i = 4 To LastRow
 If Sheets("TBL B").Range("C" & i) <> 0 And i <> 14 Then
   n = n + 1
   Sheets("Data").Cells(3, n).Value = Sheets("TBL B").Cells(i, "C").Value
 End If

Il marche au top

Néanmoins je sollicite votre aide de car ce code sert pour enregistrer une nouvelle commande. Désormais je suis en train de créer un outils pour pouvoir modifié une commande déjà enregistré.

Voici le fichier en question :

Ma question est donc la suivante voici ce que j'aimerais faire. En feuille "TBL B" en colonne AD et AE il y a l'outils de modification de commande. J'aimerais que lorsque l'utilisateur rentre le numéro de BC (commande) en AE4, la macro recherche la ligne correspondante (valeur de AK4 sur la même feuille) dans la feuille "Data". Puis coupe les données et les incrémentes dans la feuille TBL B aux endroit correspondant (colonne AE cellule 6 / 8 / 10 / 12 / Pas 14 / 16 / 18 / 22 / 24 / 28 / 30) et supprime automatiquement la ligne en DATA une fois les données collé en TBL B.

Pensez vous que cela soit réalisable ? Voilà déjà ce que je t'ai tenter (car je ne demande pas de l'aide avant d'avoir essayer tt seul sinon c'est trop facile de faire bosser les autres) :

Sub Recherche_BC()

If Sheets("TBL B").Range("AK4").Value <> 0 Then

Dim reponse As Long
Dim cel As Range

reponse = MsgBox("Êtes vous sûr de vouloir rechercher cette commande, celle ci sera automatiquement retirée du planning, vous devrez ensuite cliquer sur enregistrer pour qu'elle soit de nouveau pris en compte ?", _
vbYesNo + vbQuestion + vbDefaultButton2, _
"")

If reponse = vbYes Then

Sheets("Data").Rows("3:3").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
LastRow = Sheets("TBL B").Cells(Rows.Count, 3).End(xlUp).Row

 'Je suppose ne plus avoir besoin de cette ligne :)

Set plage1 = Sheets("Data").Range("O:O")

        For Each cel In plage1

            If cel.Text = Sheets("TBL B").Range("AK4") Then
                Range(Cells(cel.Row, cel.Column - 14)).Cut
                Sheets("TBL B").Cells(i, "C").Value = Sheets("Data").Cells(3, n).Value

               'un peu bloqué ici ... 

Else

MsgBox "Vous recherchez une commande innexistante, merci d'entrer un numéro de commande valide !"

 Sheets("TBL B").Range("AE4").Select
    Range("AE4").ClearContents

End If

End Sub 

Désolé j'ai l'impression d'abusé un peu avec toutes mes questions mais étant débutant et souhaitant finir mon tableur sous 7 jours pour présentation en entreprise, je me tourne vers vous pour me venir en aide

Je vous souhaite une bonne journée

Corentin apprentis VBA

Bonsoir,

merci de rester sur le forum pour les questions

Pour ce qui est d'une des possibilité ou bien une partie de votre réponse, vous pouvez vous orienter ver les formules du type RECHERCHE :

=RECHERCHEV($AE$4;Data!$A$1:$K$87;2;FAUX)

où on lance une recherche sur la colonne de gauche de la plage de cellule Date!$A1:$K87, donc sur la colonne N° bon de commande.

Si en $AE$4 vous entrez la valeur 15, alors la formule ci dessus qui correspond à la case "date de début" il s'affichera le 01/01/2018.

Il suffit pour les autres cellules copier la même formule en changeant le "2" par le n° de colonne de la valeur recherchée.

Ensuite en VBA avec votre bouton vous pouvez gérez le choix du N°BC... mais une liste de choix sur la cellule AE4 pourrait suffire.

Cette liste de choix serait issue d'une liste dynamique qui reprend la colonne A de la feuille Data.

@ bientôt

LouReeD

Bonjour LouReed,

Tout d'abord merci pour ta réponse.

Je connais les fonctions recherchev mais celle ci ne peux s'appliquer à mon cas.

En réalité, une fois la cellule copié de la feuille "Data" puis collé en "TBL B" la ligne de feuille "Data" correspondant sera supprimer.

De plus une fois les données incrémenté, l'utilisateur devra pouvoir les changer pour les réengesitrer, une nouvelle ligne est alors créé avec les nouvelles données dans la feuille Data

En réalité une ligne dans le data = une prestation dans le planning ; pour pouvoir être modifié celle ci nécessite d'être supprimer au préalable je pense ...

J'ai déjà essayer ce code la mais sans succès j'ai une erreur que je n'arrive pas à comprendre ... :

    Sub Recherche_BC()

    If Sheets("TBL B").Range("AK4").Value <> 0 Then

    Application.ScreenUpdating = False

    Dim reponse As Long
    Dim cel As Range
    Dim plage1 As Range

    reponse = MsgBox("Êtes vous sûr de vouloir rechercher cette commande ? Celle ci sera automatiquement retirée du planninng vous devrez ensuite cliquer sur enregistrer pour qu'elle soit de nouveau pris en compte !", _
    vbYesNo + vbQuestion + vbDefaultButton2, _
    "")

    If reponse = vbYes Then

    Set plage1 = Sheets("Data").Range("O1:O12000")

    For Each cel In plage1

           If cel.Value = Sheets("TBL B").Range("AK4") Then

                    Sheets("Data").Range("B3:B12000").Copy: Sheets("TBL B").Range("AE6").Paste  'lieu de l'erreur dans le code
                   Sheets("Data").Range("C3:C12000").Copy: Sheets("TBL B").Range("AE8").Paste
                    Sheets("Data").Range("D3:D12000").Copy: Sheets("TBL B").Range("AE10").Paste
                    Sheets("Data").Range("E3:E12000").Copy: Sheets("TBL B").Range("AE12").Paste
                    Sheets("Data").Range("F3:F12000").Copy: Sheets("TBL B").Range("AE16").Paste
                    Sheets("Data").Range("G3:G12000").Copy: Sheets("TBL B").Range("AE18").Paste

                    Sheets("TBL B").Range("AE14").Value = "Oui"

                    Sheets("Data").Range("H3:H12000").Copy: Sheets("TBL B").Range("AE22").Paste
                    Sheets("Data").Range("I3:I12000").Copy: Sheets("TBL B").Range("AE24").Paste
                    Sheets("Data").Range("J3:J12000").Copy: Sheets("TBL B").Range("AE28").Paste
                    Sheets("Data").Range("K3:K12000").Copy: Sheets("TBL B").Range("AE30").Paste

                End If

                Next

                End If

    Application.ScreenUpdating = True

    Else

    MsgBox "Vous recherchez une commande innexistante, merci d'entrer un numéro de commande valide !"

     Sheets("TBL B").Range("AE4").Select
        Range("AE4").ClearContents

    End If

    End Sub

Lorsque je la lance il me met une erreur et me dit : 'Erreur d’exécution 438' : Propriété ou méthode non géré par cet objet et j'arrive pas à comprendre pourquoi ..

Je vais continué de fouiner dans le forum.

A+

Bonjour (..)

Pourquoi y a-t-il =SOMME.SI(Data!C(-36);LC(-6);Data!C(-22)) en AK4 et pas une fonction de recherche plus classique ?

Je ne comprends pas bien le but de cette somme ??

Bonjour NCC

Alors j'ai fait un somme.si mais effectivement on aurait très bien pu faire une recherche classique. Il n'y a aucune différence entre les deux dans mon cas puisque les valeurs cherché sont numérique et qu'il n'y aucune possibilité de doublon dans les numéros de commande. Le résultat avec un somme.si sans doublon et une recherche classique est exactement le même dans mon exemple. Si tu trouve plus judicieux de mettre une recherche ont peut le faire sans soucis

Le résultat renvoyé en AK4 est le numéro de ligne correspondant dans la feuille "Data".

On aurait pu également mettre cette formule :

=RECHERCHEV(AE4;Data!A:O;15;FAUX)

Le résultat sera identique

Edit : Je me rappel que j'ai fait un somme.si à la place d'une recherche car j'avais plus de facilité à créer une macro qui dit que si AK4 = 0 et que l'utilisateur appuis sur recherche alors erreur. Plutôt que si AK4 = N/A ...

Bonjour

à tester...

Sub Recherche_BC()
Dim rep
Dim wsData As Object
Dim ligneBC

    Set wsData = Worksheets("DATA")

    If Cells(4, 37) = 0 Then
        MsgBox "Entrez un n° de commande valide"
    Else
        rep = MsgBox("Confirmez...", vbQuestion + vbYesNo + vbDefaultButton2)
        If rep = vbYes Then
            ligneBC = Cells(4, 37)
            Cells(6, 31) = wsData.Cells(ligneBC, 2)
            Cells(8, 31) = wsData.Cells(ligneBC, 3)
            ' ...   Continuer ici à copier les autres données
            '       la règlre est la suivante:
            '       cells( ligne , colonne ) de l'onglet TBL B
            '       = wsData.cells( ligneBC , la colonne correspondante dans l'onglet DATA )
            With wsData
                .Cells(ligneBC, 1).EntireRow.Delete
            End With
        End If
    End If

End Sub

PS/ Pour éviter le #N/A tu peux utiliser =SiErreur

Dont la syntaxe est la suivante =SiErreur( laFonction ; quoiFiareSiErreur )

Donc dans ton cas ; =SiErreur( RechercheV(...) ; 0 )

@ NCC

ça marche du tonnerre !!! Mille merci

Voici le code final :

Sub Recherche_BC()
Dim rep
Dim wsData As Object
Dim ligneBC

    Set wsData = Worksheets("DATA")

    If Cells(4, 37) = 0 Then
        MsgBox "Vous recherchez une commande innexistante, merci d'entrer un numéro de commande valide !"

 Sheets("TBL B").Range("AE4").Select
    Range("AE4").ClearContents

    Else
        rep = MsgBox("Êtes vous sûr de vouloir rechercher cette commande ? Celle ci sera automatiquement retirée du planninng vous devrez ensuite cliquer sur enregistrer pour qu'elle soit de nouveau pris en compte !", _
    vbYesNo + vbQuestion + vbDefaultButton2, _
    "")

        If rep = vbYes Then

        Application.ScreenUpdating = False

            ligneBC = Cells(4, 37)
            Cells(6, 31) = wsData.Cells(ligneBC, 2)
            Cells(8, 31) = wsData.Cells(ligneBC, 3)
            Cells(10, 31) = wsData.Cells(ligneBC, 4)
            Cells(12, 31) = wsData.Cells(ligneBC, 5)
            Cells(16, 31) = wsData.Cells(ligneBC, 6)
            Cells(18, 31) = wsData.Cells(ligneBC, 7)

            Cells(14, 31).Value = "Oui"

            Cells(22, 31) = wsData.Cells(ligneBC, 8)
            Cells(24, 31) = wsData.Cells(ligneBC, 9)
            Cells(28, 31) = wsData.Cells(ligneBC, 10)
            Cells(30, 31) = wsData.Cells(ligneBC, 11)

           With wsData
                .Cells(ligneBC, 1).EntireRow.Delete

            End With

        MsgBox ("Vous pouvez maintenant modifier la commande, merci de l'enregistrer une fois modifiée pour que celle ci soit de nouveau prise en compte")

        Application.ScreenUpdating = True

        End If
    End If

End Sub

Grâce à toi je peux maintenant finir mon tableur et je suis dans les temps par rapport à mes objectifs Merci beaucoup !

A bientôt

(re)

Koko_Swiff a écrit :

ça marche du tonnerre !!! Mille merci

c'était prévu pour et merci pour tes 1000 merciS

Désolé pour l’orthographe, s'il y a bien un domaine dans lequel je dois également m'améliorer c'est celui ci

Lors de mon cursus scolaire nous avions le site : https://www.projet-voltaire.fr/ qui est génial pour s'entrainer !

Rechercher des sujets similaires à "vba couper coller suppression ligne condition"