Se déplacer d'une colonne à une autre à chaque click
Bonjour,
Je vous joint un fichier Testv01,
il y a un code que j'ai mis , mais je suis bloqué comment traduire un click à un saut d'une colonne à une autre.
l'idée est que lorsque je mets une piece à D4 et je clique sur le bouton 1 , un calcul se fait pour cette piece S1 par exemple ensuite je veux que lorsque je mets une piece S2 et je clique sur le bouton 1 le calcul se fait mais au lieu de copier les valeurs de la colonne C:C dans le classeur Tools dans la colonne C:C du classeur Cumul il fait la copie dans la colonne D:D et ainsi de suite :
3 eme clik la copie se fait à E:E
4 eme clik la copie se fait à F:F
....
MERCI POUR VOTRE AIDE
Bonjour Firas7
De ce que j'ai compris, voici un code modifié et optimisé
Sub Bouton1_Cliquer()
Dim Inc As Integer
' Récupère le numéro de pièce 1 pour S1, 2 pour S2
' et s'en sert comme incrément de colonne
Inc = Right(Sheets("PG").Range("D4"), 1) - 1
With Sheets("Tools")
.Range("C4").FormulaR1C1 = _
"=INDEX(BASE!R4C4:R14C13,MATCH(PG!R4C4,BASE!R4C3:R14C3,0),MATCH(RC[-1],BASE!R3C4:R3C13,0))"
.Range("C4").AutoFill Destination:=.Range("C4:C13"), Type:=xlFillDefault
End With
ActiveWorkbook.Save
Sheets("Tools").Columns("C:C").Copy
With Sheets("Cumul")
.Columns("C:C").Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
.Range("A4:A13").FormulaLocal = "=SOMME(C4:L4)"
End With
End SubA+
Bonjour
Pas sûr d'avoir compris mais ce que vous voulez c'est copier les données de la feuille BASE vers la feuille Cumul selon la pièce choisie ?
Je ne vois pas l'utilité de la feuille Tools en fait
Cordialement
Edit : oups Bruno ! j'ai pas vérifié que l'on avait posté. Deuxième fois aujourd'hui... mé bon, j'avais préparé un code plus court. Tout dépend de la réponse à ma question
Merci Bruno ,
votre code fonctionne en changeant 1 pat Inc dans l'offset
With Sheets("Cumul")
.Columns("C:C").Offset(0, Inc).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Merci Dan pour votre intervention.
j'ai ajouté la feuille Tools comme intermediaire , je commence pas à pas avec VBA.
Maintenant je me permets de vous demander , aprés tout mes pieces ne seront pas toujours S1, S2 etc , ils ont des codes d'environ 7 digit entre integer et string comment faire alors , ajouter une autre colonne pour dire que pour chaque piece vous mettez P1 , P2 ... ?
Aussi quel modification a faire dans le code pour ne pas se limiter de la colonne L4 dans la feuille Cumul , ca doit etre illimité jusqu'a avoir la case de la somme à une valeur bien definie.
je ne sais pas si j'ai bien posé le probleme.
Merci pour votre aide encore une fois.
re,
Merci Dan pour votre intervention.
j'ai ajouté la feuille Tools comme intermediaire , je commence pas à pas avec VBA.
Sans la feuille Tools et formule, essayez ceci
Sub Bouton1_Cliquer()
Dim ligne As Byte, col As Byte
Dim dlg As Integer, dcol As Integer
Dim tablo
With Sheets("Base")
dlg = .Range("C" & Rows.Count).End(xlUp).Row
On Error Resume Next
ligne = Sheets("BASE").Range("C4:C" & dlg).Find(Sheets("PG").Range("D4"), LookIn:=xlValues, lookat:=xlWhole).Row
If ligne = 0 Then MsgBox "le num de pièce n'existe pas !": Exit Sub
col = ligne - 1
End With
With Sheets("Cumul")
dcol = .Cells(4, Columns.Count).End(xlToLeft).Column
tablo = Sheets("Base").Range(Sheets("Base").Cells(ligne, 4), Sheets("Base").Cells(ligne, dcol)).Value
ligne = dcol - 3
.Range(.Cells(4, col), .Cells(ligne, col)) = WorksheetFunction.Transpose(tablo)
End With
End SubDans la ligne TABLO, remplacez le M pour la lettre correspondant à votre dernière colonne
si le fil est terminé -->
Crdlt
Merci Dan.
Votre code fonctionne à merveille , reste je n'ai compris votre note "Dans la ligne TABLO, remplacez le M pour la lettre correspondant à votre dernière colonne".
Aussi , la somme exisistante avant dans le sheet cumul colonne A , cette somme va calculer toute la ligne pour chaque MFRxxx et la comparer avec ce qui existe dans le sheet Limites colonne C , si la somme pour un MFRXXX depasse la valeur mentionnée dans le sheet Limites pour cet MFRXXX alors un msg s'affiche et apres la validation (un clik par exemple) la somme se met à 0 et le code continue.
Je vous joint le fichier et merci infinement pour votre support.
Bonjour
Votre code fonctionne à merveille , reste je n'ai compris votre note "Dans la ligne TABLO, remplacez le M pour la lettre correspondant à votre dernière colonne".
Oui désolé. J'avais édité mon post car j'avais modifié le code afin que cette dernière colonne soit directement vue dans le code et j'ai omis de supprimer ce commentaire.
Dans le fichier que vous avez posté êtes-vous sûr que le code fonctionne bien ?
Aussi , la somme exisistante avant dans le sheet cumul colonne A , cette somme va calculer toute la ligne pour chaque MFRxxx et la comparer avec ce qui existe dans le sheet Limites colonne C , si la somme pour un MFRXXX depasse la valeur mentionnée dans le sheet Limites pour cet MFRXXX alors un msg s'affiche et apres la validation (un clik par exemple) la somme se met à 0 et le code continue.
Heu je dois regarder quelque chose ?
Bonjour Dan,
je pense qu'il y avait un soucis , le code ne focntionne plus.
j'ai refait la copie et enresgistrer et ca fonctionne et tout est OK , je vous laisse checker. (piece jointe).
Pour ma demande de comparaison des valeurs d'une colonne à une autre, en fait il y a avait dans le classeur « Cumul » dans la colonne A la somme S qui se calcule à chaque clik sur valider de la « PG » , cette somme est un compteur des valeurs de chaque MFR001 ... MFRXXX et sera comparée par rapport à des valeurs fixes figées dans le classeur « Limites » la colonne C , à chaque dépassement un msgbox s’affiche pour alerter l'utilisateur qu'il y a un dépassement et une action immédiate à faire , et après la validation de l'utilisateur (click ? choix puis click ?) , le compte à rebours de la colonne S dans le classeur Cumul » pour le MFRXXX qui a dépassé se remet à 0.
J’espère que j'ai bien décrit mon problème.
Bonjour
Vous écrivez "classeur", mais je suppose qu'il s'agit des feuilles Cumul, Limites car on pourrait penser que vous avez un fichier par feuille.
Ce que vous voulez c'est un avertissement quand la colonne A dépasse la valeur en colonne C de la feuille Limite. cela c'est Ok
Par contre,
le compte à rebours de la colonne S dans le classeur Cumul » pour le MFRXXX qui a dépassé se remet à 0.
pourquoi la colonne S alors que vous allez jusque la colonne CY.
EDIT : Peut être parlez vous de la colonne A ? si oui, vous pouvez peut être faire cela par formule ? Essayez en mettant cette formule en A4 ---> =SI(SOMME(C4:CY4)>RECHERCHEV($B4;Limites!$B$4:$C103;2);0;SOMME(C4:CY4))
Ensuite recopiez vers le bas.
Une fois fait, cela remettre les cellules à 0 si la valeur en feuille Limite est dépassée.
Tout a fait Dan , vous avez raison il s'agit des feuilles et pas des classeurs.
Aussi faute de frappe je voulais dire la colonne A et pas S comme vous avez mentionné ( S c'est la case A3) .
La formule fonctionne mais en automatique , je veux que la somme se remet à zero suite à la validation de l'utisateur.
Ce qui est automatique c'est l'alerte qu'il y a un depassement.
Par exemple pour le "MFR001" , son max dans la feuille "Limites" est 10 , donc lorsque la case "A4" de la feuille "Cumul" depasse la valeur de 10 , un msg s'affiche " MFR001 est depassé" , alors l'utilisateur reagi et valide qu'il peut remette à zero la case A4 en 0..
Merci.
Si l'utilisateur doit faire un choix pour remettre à zero, je ne vois qu'une solution par code. Mais cela veut aussi dire que vous ne pouvez plus utilisez de formulesPar exemple pour le "MFR001" , son max dans la feuille "Limites" est 10 , donc lorsque la case "A4" de la feuille "Cumul" depasse la valeur de 10 , un msg s'affiche " MFR001 est depassé" , alors l'utilisateur reagi et valide qu'il peut remette à zero la case A4 en 0..
Vous êtes ok sur ce point ?
Bonjour Dan,
Oui pas de formules , je veux essayer votre methode.
Je vous propose plutôt ceci
Lorsque vous validez en feuille PG, le code vous calcule la colonne A en feuille Cumul et ce, pour les valeurs importées depuis la feuille Base
Le code vous mettra aussi la somme en colonne A
Pour la remise à 0 des dépassements, l'utilisateur peut faire cela manuellement plutot que par code. A mon avis, c'est plus simple que de cliquer dans chaque cellule à remettre à 0 et activer un code
Votre avis
oui c'est faisable , biensur en tenant compte que la somme se fait par le code et non par la formule.
1. remplacez votre code par celui ci-dessous
Sub Bouton1_Cliquer()
Dim ligne As Integer, col As Integer
Dim dlg As Integer, dcol As Integer
Dim tablo
With Sheets("Base")
dlg = .Range("C" & Rows.Count).End(xlUp).Row
On Error Resume Next
ligne = Sheets("BASE").Range("C4:C" & dlg).Find(Sheets("PG").Range("D4"), LookIn:=xlValues, lookat:=xlWhole).Row
If ligne = 0 Then MsgBox "le num de pièce n'existe pas !": Exit Sub
col = ligne - 1
End With
With Sheets("Cumul")
dcol = .Cells(4, Columns.Count).End(xlToLeft).Column
tablo = Sheets("Base").Range(Sheets("Base").Cells(ligne, 4), Sheets("Base").Cells(ligne, dcol)).Value
ligne = dcol - 3
.Range(.Cells(4, col), .Cells(ligne, col)) = WorksheetFunction.Transpose(tablo)
End With
Dim plglimite As Range
Set plglimite = Feuil5.Range("B4:B" & Feuil5.Range("B" & Feuil5.Rows.Count).End(xlUp).Row)
dlg = Sheets("Cumul").Cells(Rows.Count, col).End(xlUp).Row
limite dlg, col, plglimite
ActiveWorkbook.Save
End Sub2. Ajoutez ce code à la suite du premier
Sub limite(dlg As Integer, col As Integer, plglimite As Range)
Dim lglimite As Integer, i As Integer
With Sheets("Cumul")
For i = dlg To 4 Step -1
On Error Resume Next
lglimite = plglimite.Find(.Range("B" & i), LookIn:=xlValues, lookat:=xlWhole).Row
If lglimite = 0 Then MsgBox "La reference MRFxxx n'existe pas en feuille Limites": Exit Sub
On Error GoTo 0
If .Cells(i, col) <> "" Then .Cells(i, 1) = WorksheetFunction.Sum(.Range("C" & i & ":CY" & i))
Next i
End With
End SubCordialement
Je vous remercie Dan pour votre support.
le code fonctionne , rest je n'ai pas compris ce msg s'affiche quand ?
If lglimite = 0 Then MsgBox "La reference MRFxxx n'existe pas en feuille Limites": Exit Sub
J'ai tenté pour l'afficher mais ca n'a pas fonctionné.
Aussi j'ai ajouté une collne E4 ou il y a quantité , car je nai trouvé comment faire si la meme piece a etet faite plusieurs fois n ca doit alimenter les cases de chaque MFR de la feuille cumul par le coefficient quantité.
Je m'exuse pour mes demandes , je suis entrain d'apprendre et vraiment c'est tres interessant.
Je vous joins le fichier.
Edit dan : fichier supprimé. Voir post suivant
le code fonctionne , rest je n'ai pas compris ce msg s'affiche quand ?
If lglimite = 0 Then MsgBox "La reference MRFxxx n'existe pas en feuille Limites": Exit Sub
c'est pour le cas où le MFR ne serait pas trouvé en feuille Limite. Soit MRF inexistant ou par exemple vous mettez un espace après.
Essayez MFR00002 par exemple...
Le reste je dois voir
Le msg ne fonctionne pas si MFR est inexisitant.
aussi lorsque l'utilisateur met 0 dans la case A4 de la feuiile "cumul" pour par exemple MFR001 , toute la ligne 4 commencant par la colonne c doit se remettre à 0 sinon à la prochaine piece validée il recalcule les anciennes valeurs qui sont deja sauvgardées.
Le msg ne fonctionne pas si MFR est inexisitant.
Si mais il faut que vous avez une valeur dans le colonne correspondant à votre pièce Sxxx
Dans votre fichier posté choisissez la pièce S001 et mettez MFRxx à la place de MFR001 ou mettez MFRxx à la place de MFR005
Dans ce cas, s'il met manuellement la valeur à 0, il faudra ajouter un code pour remettre la ligne à 0. Je reviens vers vous plus tard pour ce point.aussi lorsque l'utilisateur met 0 dans la case A4 de la feuiile "cumul" pour par exemple MFR001 , toute la ligne 4 commencant par la colonne c doit se remettre à 0 sinon à la prochaine piece validée il recalcule les anciennes valeurs qui sont deja sauvgardées.
