OVH Cloud OVH Cloud

changement valeur cellule

6 réponses
Avatar
Michel
Bonjour,

Pour faire suite à mon mail d'hier, j'ai corrigé la macro ci-dessous mais
maintenant, je ne peux plus faire de copier/coller ni de suppression sur une
plage multiple. Comment peut-on contourner le problème ?

Salutations

Michel

Private Sub Worksheet_Change(ByVal Target As Range)
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub

6 réponses

Avatar
MichDenis
Bonjour Michel,

Tu peux simplement inscrire en début de procédure : On error resume next

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
On error resume next
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub
'---------------------------

Mais, il serait préférable que tu définisse le "Range" sur lequel ta procédure doit avoir un effet.
à titre d'exemple :

Ta macro s'exécutera seulement pour les cellules C1:C5, tout autre modification dans ta feuille n'affectera pas ces
cellules.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg as range, Plg as Range
Set Rg = Range("C1:C5")
Set Plg = intersect(rg,target)
if not Plg is nothing then
for each c in plg
If Ucase(c.Value) = "MDF 38" Then choix
next
end if
Set Rg = Nothing : Set Plg = Nothing
End Sub

P.S. "Choix" est une variable ? Est-elle renseignée au moment de l'exécution de la macro ? Si non, tu vas obtenir des 0
ou rien selon le type de variable que tu lui a attribué (Integer ou String). Si tu cette variable est définie au niveau
d'une autre procédure, Tu dois la déclarer au niveau du module (en haut) et non au niveau de la procédure pour que sa
valeur soit disponible.


Salutations!





"Michel" a écrit dans le message de news:
Bonjour,

Pour faire suite à mon mail d'hier, j'ai corrigé la macro ci-dessous mais
maintenant, je ne peux plus faire de copier/coller ni de suppression sur une
plage multiple. Comment peut-on contourner le problème ?

Salutations

Michel

Private Sub Worksheet_Change(ByVal Target As Range)
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub
Avatar
Michel
Merci pour ta réponse

En fait, la finalité de ma feuille est de remplacer une chaîne de caractère
par une autre (par une userform) sur une plage fixe sur laquelle j'ai des
calculs de posés. Je vais essayer de borner le range à mes cellules de
saisie concernées, c'est une excellente idée !

Par contre, j'ai besoin de récupérer les variables LIG et COL qui me servent
à intégrer le résultat de ma userform dans cellule ou j'ai saisi "MDF 38".
Est-ce que le fait de rajouter la range ne va pas me planter la récup de ma
cellule saisie ?
Private Sub ListBox1_Click()
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub


choix est une macro d'un module qui me lance la userform :
Public LIG, COL As Integer
Sub Bouton1_QuandClic()
UserForm1.Show
End Sub
Sub Bouton2_QuandClic()
UserForm2.Show
End Sub
Sub choix()
UserForm3.Show
End Sub

Merci encore pour ton aide très précieuse !

Salutations

Michel


"MichDenis" a écrit dans le message de news:
ek04$
Bonjour Michel,

Tu peux simplement inscrire en début de procédure : On error resume next

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
On error resume next
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub
'---------------------------

Mais, il serait préférable que tu définisse le "Range" sur lequel ta
procédure doit avoir un effet.
à titre d'exemple :

Ta macro s'exécutera seulement pour les cellules C1:C5, tout autre
modification dans ta feuille n'affectera pas ces
cellules.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg as range, Plg as Range
Set Rg = Range("C1:C5")
Set Plg = intersect(rg,target)
if not Plg is nothing then
for each c in plg
If Ucase(c.Value) = "MDF 38" Then choix
next
end if
Set Rg = Nothing : Set Plg = Nothing
End Sub

P.S. "Choix" est une variable ? Est-elle renseignée au moment de
l'exécution de la macro ? Si non, tu vas obtenir des 0
ou rien selon le type de variable que tu lui a attribué (Integer ou
String). Si tu cette variable est définie au niveau
d'une autre procédure, Tu dois la déclarer au niveau du module (en haut)
et non au niveau de la procédure pour que sa
valeur soit disponible.


Salutations!





"Michel" a écrit dans le message de news:

Bonjour,

Pour faire suite à mon mail d'hier, j'ai corrigé la macro ci-dessous mais
maintenant, je ne peux plus faire de copier/coller ni de suppression sur
une
plage multiple. Comment peut-on contourner le problème ?

Salutations

Michel

Private Sub Worksheet_Change(ByVal Target As Range)
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub





Avatar
MichDenis
Bonjour Michel,

Au lieu de m'explique ce qui ne va pas, essaie plutôt de m'explique ce que tu veux faire. Et si tu utilises des
contrôles, Où ces contrôles sont situés ? d'où émanent-ils Boîte d'outils formulaire ou contrôle si ils sont dans une
feuille de calcul .


Salutations!





"Michel" a écrit dans le message de news:
Merci pour ta réponse

En fait, la finalité de ma feuille est de remplacer une chaîne de caractère
par une autre (par une userform) sur une plage fixe sur laquelle j'ai des
calculs de posés. Je vais essayer de borner le range à mes cellules de
saisie concernées, c'est une excellente idée !

Par contre, j'ai besoin de récupérer les variables LIG et COL qui me servent
à intégrer le résultat de ma userform dans cellule ou j'ai saisi "MDF 38".
Est-ce que le fait de rajouter la range ne va pas me planter la récup de ma
cellule saisie ?
Private Sub ListBox1_Click()
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub


choix est une macro d'un module qui me lance la userform :
Public LIG, COL As Integer
Sub Bouton1_QuandClic()
UserForm1.Show
End Sub
Sub Bouton2_QuandClic()
UserForm2.Show
End Sub
Sub choix()
UserForm3.Show
End Sub

Merci encore pour ton aide très précieuse !

Salutations

Michel


"MichDenis" a écrit dans le message de news:
ek04$
Bonjour Michel,

Tu peux simplement inscrire en début de procédure : On error resume next

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
On error resume next
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub
'---------------------------

Mais, il serait préférable que tu définisse le "Range" sur lequel ta
procédure doit avoir un effet.
à titre d'exemple :

Ta macro s'exécutera seulement pour les cellules C1:C5, tout autre
modification dans ta feuille n'affectera pas ces
cellules.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg as range, Plg as Range
Set Rg = Range("C1:C5")
Set Plg = intersect(rg,target)
if not Plg is nothing then
for each c in plg
If Ucase(c.Value) = "MDF 38" Then choix
next
end if
Set Rg = Nothing : Set Plg = Nothing
End Sub

P.S. "Choix" est une variable ? Est-elle renseignée au moment de
l'exécution de la macro ? Si non, tu vas obtenir des 0
ou rien selon le type de variable que tu lui a attribué (Integer ou
String). Si tu cette variable est définie au niveau
d'une autre procédure, Tu dois la déclarer au niveau du module (en haut)
et non au niveau de la procédure pour que sa
valeur soit disponible.


Salutations!





"Michel" a écrit dans le message de news:

Bonjour,

Pour faire suite à mon mail d'hier, j'ai corrigé la macro ci-dessous mais
maintenant, je ne peux plus faire de copier/coller ni de suppression sur
une
plage multiple. Comment peut-on contourner le problème ?

Salutations

Michel

Private Sub Worksheet_Change(ByVal Target As Range)
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub





Avatar
Michel
Je cherche à faire un tableau(1) de données avec des zones de saisies et une
tableau(2) de synthése qui exprime ces besoins en terme de matière première.
Le premier tableau ressemble à ça :
qté-------------désignation------------agglo------------long(mm)----------larg(mm)
1 dessus bureau MDF 38 1600
800
5 cotes armoire AG 19 2000
450

Le tableau de synthèse est issu d'une requete sur une base de donnée externe
Informix et ressemble à ça :
type agglo------code
matière-------libellé------------------------------------besoins
MDF 38 MP2000 médium 38mm
1.28 m2
AG 19 MP2001 aggloméré 19mm
4.5 m2
MP9001 MP9001 MDF MEDIS 1330 X 1330 EP 38 MM
2 panneaux
..............

Si j'ai une correspondance entre le type d'agglo et type de support, c'est
pour la fabrication en atelier.

Pour obtenir le résultat du tableau(1) vers le tableau(2), je passe par une
somme.si(...), ça ne pose pas de problème.
Par contre, pour certaines matières premières, je dispose de plusieurs
formats de panneaux pour la même épaissseur : c'est le cas pour le MDF 38 ou
soit j'ai le code MP2000 si dessus, soit les codes ci-dessous :
MP9001 MDF MEDIS 1330 X 1330 EP 38 MM
MP9002 MDF MEDIS 2240 X 1050 EP 38 MM
MP9003 MDF 38 MM DECOUPE DE 2220 X 1235
MP9004 MDF 38 MM DECOUPE DE 1820 X 1235


Je veux qu'à la saisie de MDF 38 s'affiche les codes MP9* dans une listbox
avec son libellé afin de selectionner le code matière le plus approprié : si
on selection un code en MP9*,il vient en remplacement de MDF 38 sinon, je
reprend la valeur par défaut MDF 38...

Pour ça, j'ai dévelloppé une macro sur mon tableau(1), ça tu connais...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Plg As Range
LIG = Target.Row
COL = Target.Column
Set Rg = Range("L10:L300")
Set Plg = Intersect(Rg, Target)
If Not Plg Is Nothing Then
For Each c In Plg
If UCase(c.Value) = "MDF 38" Then choix
Next
End If
Set Rg = Nothing: Set Plg = Nothing
End Sub

sur le module 1
Public LIG, COL As Integer -> variables de ma cellule
cible pour remplacement
Sub Bouton1_QuandClic() -> macro pour impression
tableau(1) avec mise en forme (ça marche)
UserForm1.Show
End Sub
Sub Bouton2_QuandClic() -> macro pour impression
tableau(2) avec suppression des codes MP à 0 (ça marche aussi)
UserForm2.Show
End Sub
Sub choix() -> macro
remplacement de données
UserForm3.Show
End Sub

sur userform3, j'ai 2 listbox (code MP et libellé) ainsi que 2 boutons
(valider et annuler)
Option Explicit

Private Sub UserForm_Initialize()
ListBox1.RowSource = "predebit" ->plage nommée pour
code MP
ListBox2.RowSource = "libelle" ->plage nommée
pour libellé
End Sub

Private Sub CommandButton1_Click() ->valider
Unload UserForm3
End Sub

Private Sub CommandButton2_Click() ->annuler
Unload UserForm3
ActiveSheet.Cells(LIG, COL).Value = "MDF 38"
End Sub

Private Sub ListBox1_Click() ->remplacement
code
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub

Avec les infos que tu m'a transmis, ça fonctionne mais il me reste quelques
détails à revoir : je souhaite plutot avoir le libellé du code MP dans une
textbox unique plutot que dans une listbox mais je ne sais pas comment
décaler d'une colonne la valeur du code vers le libellé. Et puis, est-ce que
tout ça tiens la route ?

Comme tu t'en doutes, je suis menuisier et piqué par
l'informatique...personne n'est parfait

A bientôt de tes nouvelles



"MichDenis" a écrit dans le message de news:

Bonjour Michel,

Au lieu de m'explique ce qui ne va pas, essaie plutôt de m'explique ce que
tu veux faire. Et si tu utilises des
contrôles, Où ces contrôles sont situés ? d'où émanent-ils Boîte d'outils
formulaire ou contrôle si ils sont dans une
feuille de calcul .


Salutations!





"Michel" a écrit dans le message de news:

Merci pour ta réponse

En fait, la finalité de ma feuille est de remplacer une chaîne de
caractère
par une autre (par une userform) sur une plage fixe sur laquelle j'ai des
calculs de posés. Je vais essayer de borner le range à mes cellules de
saisie concernées, c'est une excellente idée !

Par contre, j'ai besoin de récupérer les variables LIG et COL qui me
servent
à intégrer le résultat de ma userform dans cellule ou j'ai saisi "MDF 38".
Est-ce que le fait de rajouter la range ne va pas me planter la récup de
ma
cellule saisie ?
Private Sub ListBox1_Click()
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub


choix est une macro d'un module qui me lance la userform :
Public LIG, COL As Integer
Sub Bouton1_QuandClic()
UserForm1.Show
End Sub
Sub Bouton2_QuandClic()
UserForm2.Show
End Sub
Sub choix()
UserForm3.Show
End Sub

Merci encore pour ton aide très précieuse !

Salutations

Michel


"MichDenis" a écrit dans le message de news:
ek04$
Bonjour Michel,

Tu peux simplement inscrire en début de procédure : On error resume next

'---------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
On error resume next
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub
'---------------------------

Mais, il serait préférable que tu définisse le "Range" sur lequel ta
procédure doit avoir un effet.
à titre d'exemple :

Ta macro s'exécutera seulement pour les cellules C1:C5, tout autre
modification dans ta feuille n'affectera pas ces
cellules.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg as range, Plg as Range
Set Rg = Range("C1:C5")
Set Plg = intersect(rg,target)
if not Plg is nothing then
for each c in plg
If Ucase(c.Value) = "MDF 38" Then choix
next
end if
Set Rg = Nothing : Set Plg = Nothing
End Sub

P.S. "Choix" est une variable ? Est-elle renseignée au moment de
l'exécution de la macro ? Si non, tu vas obtenir des 0
ou rien selon le type de variable que tu lui a attribué (Integer ou
String). Si tu cette variable est définie au niveau
d'une autre procédure, Tu dois la déclarer au niveau du module (en haut)
et non au niveau de la procédure pour que sa
valeur soit disponible.


Salutations!





"Michel" a écrit dans le message de news:

Bonjour,

Pour faire suite à mon mail d'hier, j'ai corrigé la macro ci-dessous mais
maintenant, je ne peux plus faire de copier/coller ni de suppression sur
une
plage multiple. Comment peut-on contourner le problème ?

Salutations

Michel

Private Sub Worksheet_Change(ByVal Target As Range)
LIG = Target.Row
COL = Target.Column
If Target.Value = "MDF 38" Or Target.Value = "mdf 38" Then choix
End Sub










Avatar
MichDenis
Bonjour Michel,

Question :
'-------------------
Private Sub ListBox1_Click() ->remplacement
code
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub

Avec les infos que tu m'a transmis, ça fonctionne mais il me reste quelques
détails à revoir : je souhaite plutot avoir le libellé du code MP dans une
textbox unique plutot que dans une listbox mais je ne sais pas comment
décaler d'une colonne la valeur du code vers le libellé. Et puis, est-ce que
tout ça tiens la route ?


Réponse :
'------------------
Voici une petite explication ....Si tu comprends ce bout de code, tu vas pouvoir te débrouiller pour récupérer
l'information qui se trouve dans la feuille de calcul, qui est adjacente à l'information sélectionnée dans ton listbox
et l'affichée soit dans un textbox ou ailleurs. Si tu as besoin d'informations supplémentaires, ne te gêne pas ... mais
essaie d'être un brin plus spécifique...

Le code qui suit peut être mis sous l'événement de ton choix dans ton formulaire
'----------------------------------------
Private Sub CommandButton1_Click()

'Déclaration des variables :
Dim Rg As Range, A As Integer, B As Integer

'Comme la propriété RowSource de ton
'contrôle Listbox est une plage de cellules

'Attribution de la plage à la variable Rg
Set Rg = Range(Me.ListBox1.RowSource)

'A = Index sélectionné dans ta listbox
'Tu dois additionner 1 car l'index du
'Listbox débute à zéro et non à 1
A = Rg(Me.ListBox1.ListIndex + 1).Row
'A = La ligne où se retrouve l'information
'sélectionnée dans ta feuille de données

'Détermine la colonne d'où origine le
'contenu de ta listbox
B = Rg.Column

'Rg.Parent.Name = Nom de la feuille
'où est l'information
With Worksheets(Rg.Parent.Name)
'juste pour tester ...
'x devrait être égale à l'information
'sélectionnée dans ta listbox
x = .Cells(A, B) '
'Pour affecter une valeur à la cellule
'à droite de la cellule.
.Cells(A, B).Offset(, 1) = 10
'Pour affecter une valeur à la cellule
'à gauche de la cellule.
'.Cells(A, b).Offset(, -1) = 10
End With
End Sub
'----------------------------------------


Salutations!
Avatar
Michel
Je devrais arriver à m'en sortir maintenant.

Encore merci pour tous tes conseils et ta disponibilité !


"MichDenis" a écrit dans le message de news:

Bonjour Michel,

Question :
'-------------------
Private Sub
->remplacement
code
ActiveSheet.Cells(LIG, COL).Value = UserForm3.ListBox1
End Sub

Avec les infos que tu m'a transmis, ça fonctionne mais il me reste
quelques
détails à revoir : je souhaite plutot avoir le libellé du code MP dans une
textbox unique plutot que dans une listbox mais je ne sais pas comment
décaler d'une colonne la valeur du code vers le libellé. Et puis, est-ce
que
tout ça tiens la route ?


Réponse :
'------------------
Voici une petite explication ....Si tu comprends ce bout de code, tu vas
pouvoir te débrouiller pour récupérer
l'information qui se trouve dans la feuille de calcul, qui est adjacente à
l'information sélectionnée dans ton listbox
et l'affichée soit dans un textbox ou ailleurs. Si tu as besoin
d'informations supplémentaires, ne te gêne pas ... mais
essaie d'être un brin plus spécifique...

Le code qui suit peut être mis sous l'événement de ton choix dans ton
formulaire
'----------------------------------------
Private Sub CommandButton1_Click()

'Déclaration des variables :
Dim Rg As Range, A As Integer, B As Integer

'Comme la propriété RowSource de ton
'contrôle Listbox est une plage de cellules

'Attribution de la plage à la variable Rg
Set Rg = Range(Me.ListBox1.RowSource)

'A = Index sélectionné dans ta listbox
'Tu dois additionner 1 car l'index du
'Listbox débute à zéro et non à 1
A = Rg(Me.ListBox1.ListIndex + 1).Row
'A = La ligne où se retrouve l'information
'sélectionnée dans ta feuille de données

'Détermine la colonne d'où origine le
'contenu de ta listbox
B = Rg.Column

'Rg.Parent.Name = Nom de la feuille
'où est l'information
With Worksheets(Rg.Parent.Name)
'juste pour tester ...
'x devrait être égale à l'information
'sélectionnée dans ta listbox
x = .Cells(A, B) '
'Pour affecter une valeur à la cellule
'à droite de la cellule.
.Cells(A, B).Offset(, 1) = 10
'Pour affecter une valeur à la cellule
'à gauche de la cellule.
'.Cells(A, b).Offset(, -1) = 10
End With
End Sub
'----------------------------------------


Salutations!