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

7testv01-1.xlsm (30.42 Ko)

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 Sub

A+

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 Sub

Dans 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.

4testv01-1.zip (78.31 Ko)

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.

5test-v2.zip (93.24 Ko)

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.

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..

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 formules
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 Sub

2. 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 Sub

Cordialement

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.

image

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.

image

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

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.

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.

D'accord Dan, j'ai resseyé mais ca fonctionne pas , peut etre j'ai un souci avec le code sur mon fichier (joint).

Je vous laisse regarder.

Juste Dan , pour cette ligne

image

vous voulez dire quoi la feuil5 ? la feuille "limites" ?

9test-v2.zip (88.49 Ko)
Rechercher des sujets similaires à "deplacer colonne chaque click"