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
A bientôt
(re)
c'était prévu pourKoko_Swiff a écrit :ça marche du tonnerre !!! Mille merci
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 !