Macro qui fonctionne avec valeurs saisies mais pas du type B3=C3

Modifier une macro existante sur une seule feuille

qui "utilise" des saisies manuelles,

en vu d’utiliser deux feuilles

qui renvoient des valeurs du type B3=C3

3classeur6.zip (17.42 Ko)

Bonjour PierrePierre,

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("F:F"), Target) Is Nothing And Target.Value <> "" And Target.Count = 1 Then
    Target.Offset(Target.Value, -1).Value = Target.Value
  End If
End Sub

Voici ton code simplifié.

Maintenant que veux-tu faire?

Cordialement

merci ddetp88,

j'ai le cervolant,

je regarde ça

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Range("F:F"), Target) Is Nothing And Target.Value <> "" And Target.Count = 1 Then

Target.Offset(Target.Value, -1).Value = Target.Value

End If

End Sub

En fait j'ai pas bien compris sur quelle feuille je doit placer ces codes.

doit je conserver le code suivant

ou choisir entre les deux ?

Private Sub Worksheet_Change(ByVal Target As Range)

Dim MaVal As Integer

' Pour éviter les erreurs si selection multiple ou valeur vide alors quitter

' moi : ' Si la modification de la colonne est supérieure à 1 alors quitter

If Target.Columns.Count > 1 Then Exit Sub

' moi : si le compte de ligne cible supérieur à 1 alors quitter

If Target.Rows.Count > 1 Then Exit Sub

' moi : si la valeur est nulle dans la cible alors quitter

If Target.Value = "" Then Exit Sub

' Si saisie d'une valeur en F

' moi : Si la cellule active est dans colonne F, la procédure s'applique sinon il ne se passe rien

If Not Intersect(Range("F:F"), Target) Is Nothing Then

' Désactiver les évènements

' moi : désactiver provisoirement les évènements.

' Si vous devez par exemple écrire dans une cellule à partir d'une procédure évènementielle

' qui est déclenchée par la modification des cellules, vous allez provoquer une boucle récursive infinie.

' La propriété Application.EnableEvents = False permet de règler ce problème.

Application.EnableEvents = False

' Récupérer la valeur

MaVal = Target.Value

' A partir de la cellule modifiée, décaler de X lignes vers le bas et d'une colonne à gauche

' et inscrire la valeur

Target.Offset(MaVal, -1).Value = MaVal

' Activer les évènements

Application.EnableEvents = True

End If

End Sub

tu es sur une procédure worksheet change et non selectionchange

Remplace ton code par celui que je t'ai transmis.

Cdt

Ok

Merci ddetp88

je vais prendre le temps de mieux comprendre

Bonjours à tous

bonjour ddept88

J'ai bien remplacé la macro par la "courte" mais la colonne E ne reçoit pas les valeurs de F

Ci-dessous ma demande reformulée

2classeur7.zip (16.06 Ko)

Et à Toutes

scuzzi !

le code mis en place.

Tu peux effectivement ajouter deux lignes

Application.EnableEvents = False

Application.EnableEvents = True

Elles évitent la relecture d'une ligne (celle du test if... then). De toutes façons, le changement s'effectuant sur une autre colonne que la colonne F la procédure s'arrête. C'est aussi pourquoi je disais qu'il n'était pas utile de désactiver les événements. On ne boucle pas.

ce qui donne:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("F:F"), Target) Is Nothing And Target.Value <> "" And Target.Count = 1 Then
   Application.EnableEvents = False
   Target.Offset(Target.Value, -1).Value = Target.Value
   Application.EnableEvents = True
  End If
End Sub

Bon après midi

Bonjour ddetp88,

bonjour à tous

Je doît tout de même préciser qu'avant de demander un complément,

je passe 5 ou 6 heure à chaque fois à fouiller partout pour me familiariser avec vba.

Je viens d'appliquer le code que tu m'a envoyé à l'instant.

Les saisies, "n'aboutissent" pas en E comme quand t'elles sont saisie directement en F.

Les valeurs de F Doîvent aller dans la colonne E

selon la dernière valeur de la colonne F avec un espace (nbre de cellules) égal à la valeur saisie.

Ci-joint le fichier avec une seule feuille que j'espère plus clair que les précédents.

0classeur8.zip (15.48 Ko)

Bonjour à ddetp8

bonjour à tous,

J'ai appliqué le code "court",

mais les valeurs saisie "n'haboutissent" pas en colonne E

La dernière valeur de la colonne F doît être envoyée dans la colonne E

avec un espace (nbre de cellules) égal à la valeur saisie.

ci-joint le fichier que j'espère un peut plus clair.

1classeur8.zip (15.48 Ko)

Bonjour PierrePierre,

Déjà, tes remarques dans la procédure sont correctes. C'est bien tu es rigoureux dans ta réflexion.

En revanche, je pense que tu devrais réfléchir sur le fait qu'une ligne puisse en remplacer plusieurs.

Exemple ces trois lignes peuvent être remplacer par une.

Ta première ligne teste si plusieurs cellules sont sélectionnées dans une colonne.

La deuxième fait la même chose mais en ligne

Enfin la troisième teste si la cellule est vide.

  If Target.Columns.Count > 1 Then Exit Sub
  If Target.Rows.Count > 1 Then Exit Sub
  If Target.Value = "" Then Exit Sub

Je te propose de remplacer ces trois lignes par une

If target.count > 1 or target.value = "" then exit sub

Effectivement on se fiche que les cellules soient sélectionnées en vertical (columns) ou en horizontal (rows), l'important est qu'on teste qu'il n'y en ait qu'une cellule de sélectionnée.

Ensuite, si j'ai bien compris, que tu entres une valeur numérique (là aussi il faudrait faire un contrôlé avec isnumeric(target.value) si tu veux être rigoureux) en colonne E ou K tu veux que cette valeur s'inscrive en colonne E avec un décale en y (ligne) égale à la valeur entrée. je propose de remplacer cette ligne

If Not Intersect(Range("F:F"), Target) Is Nothing Then

par celle-ci.

If Not Intersect(Range("F:F,K:K"), Target) Is Nothing Then

et ensuite tu remplaces celle-ci

Target.Offset(MaVal, -1).Value = MaVal

par celle-là

Cells(Target.Row + MaVal, "E") = MaVal

Teste, analyse et reviens vers moi.

Bonne soirée

ddetp88

avant tout merci.

Je tourne en rond.

Voilà du blé à moudre !

Ce soir j'arrête j'ai bougé depuis ce matin.

à chaque jour sa peine.

Je lache pas l'affaire

Bonjour ddetp88

à tous

J'ai regardé avec plaisir les modifs communiquées,

et les ai appliqué.

Par contre le but étant que E prenne F non saisie manuellement,

mais en "relais" de K

ici F=K mais pourrait être issus d'une autre formule plus complexe ou venant d'une autre feuille.

If Not Intersect(Range("F:F"), Target) Is Nothing Then

ne doît t'il pas se pourrait se subtituer à :

If Not Intersect(Range("F:F,K:K"), Target) Is Nothing Then

Bonjour PierrePierre,

Il faut laisser l'événementiel sur la colonne K et supprimer H.

Il faut modifier l'écriture en E au lieu de F

Cells(Target.Row + MaVal, "E") = MaVal

Par ailleurs, il y a une erreur ce n'est pas un or mais un and dans la ligne

If Target.Count > 1 And Target.Value = "" Then Exit Sub

J'ai regardé les fichiers précédents et c'est moi qui a commis l'erreur

Bonne journée

les erreurs se font souvent quand le sujet est facile (facile pour toi).

Merci,

Je regarde tout ça

bonne aprem

ddept88

Je progresse à pas de fourmis, et apprend un peu à chaque fois.

Du chemin à été fait grace à vous et je marquerais j'espère une pause si je pouvais résoudre cette question.

La macro semble bien,

mais quand les données viennent par exemple de =Feuil1!A4

elles sont bien copiés dans K4 sans aller dans E

1pierrepierre10.zip (16.77 Ko)

Une possibilité en faisant la même chose en feuil1.

Teste

Bonne fin d'après-midi.

2pierrepierre10.zip (18.08 Ko)
Rechercher des sujets similaires à "macro qui fonctionne valeurs saisies pas type"