XL 2013 Problème d'affectation de valeur

rofou13

XLDnaute Nouveau
Bonjour tout le monde,

je souhaite que lorsque l'on clique sur une cellule quelconque dans une colonne, un userform s'affiche avec une liste déroulante et que quand la personne sélectionne un mot dans la liste, ce mot s'affiche dans la cellule sélectionnée. Pour faire cela je pensais identifier la cellule sélectionnée avec un compteur de ligne et de colonne pour pouvoir écrire dessus plus tard.

Du coup, j'ai utilisé les codes suivants :

- Affichage de l'userform :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("M2:M200")) Is Nothing Then
UserForm1.Show
End If
End Sub

- Repérage de la cellule :
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
Cells(1, 22) = Target.Column
Cells(2, 22) = Target.Row
End Sub

- le codage du combobox:
rivate Sub ComboBox1_Change()

Dim col As Integer
Dim lig As Integer

col = bilan!Cells(1, 22).Value
lig = bilan!Cells(2, 22).Value

Sheets("Bilan").Cells(lig, col) = ComboBox7.Value

UserForm1.Hide

End Sub

Le problème dans tout ça c'est l'assignation de mes variables. ça ne fonctionnent pas et je n'arrive vraiment pas à voir pourquoi. J'ai essayé de changer avec range("V1").value mais cela ne change rien...

Si quelqu'un a une solution ou une autre manière de le faire je suis preneur :)

Voici le fichier si vous voulez regarder plus en détail.

Merci de votre aide :)
 

Pièces jointes

  • test1.xlsm
    36.9 KB · Affichages: 27
  • test1.xlsm
    36.9 KB · Affichages: 30

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème d'affectation de valeur

Bonjour rofou13,

Un essai avec une Listbox.


  • Userform1 n'apparait que si une seule cellule de M2:M200 est sélectionnée (voir code de Feuil1)
  • on peut sélectionner avec un clique de la souris
  • on peut sélectionner avec les flèches haut et bas puis la touche Entrée
  • on peut sélectionner avec la première lettre d'une option (par chance, toutes les options ont une lettre de début différente)
  • la touche ESC referme la fenêtre sans inscrire aucune option

La cellule de saisie est tout simplement la cellule active ActiveCell.

Question : pourquoi utiliser un userform puisqu'il y a une liste de validation dans les cellules de la colonne M ?

Edit : v2 avec code commenté
 

Pièces jointes

  • rofou13- Problème d'affectation de valeur- v1.xlsm
    41.6 KB · Affichages: 23
  • rofou13- Problème d'affectation de valeur- v2.xlsm
    42.9 KB · Affichages: 20
Dernière édition:

rofou13

XLDnaute Nouveau
Re : Problème d'affectation de valeur

Bonjour rofou13,

Un essai avec une Listbox.


  • Userform1 n'apparait que si une seule cellule de M2:M200 est sélectionnée (voir code de Feuil1)
  • on peut sélectionner avec un clique de la souris
  • on peut sélectionner avec les flèches haut et bas puis la touche Entrée
  • on peut sélectionner avec la première lettre d'une option (par chance, toutes les options ont une lettre de début différente)
  • la touche ESC referme la fenêtre sans inscrire aucune option

La cellule de saisie est tout simplement la cellule active ActiveCell.

Question : pourquoi utiliser un userform puisqu'il y a une liste de validation dans les cellules de la colonne M ?

Bonsoir mapomme,

Merci de ta réponse.

en effet ta solution fonctionne très bien, je l'ai adapté avec le combobox graçe à activecell qui en effet simplifie le code.

Par contre tu ne sais pas pourquoi les affections des variables ne fonctionnent pas par hasard ?

Pour répondre à ta question, mon objectif est que l'utilisateur choisisse une des réponses possibles et que cela ouvre un nouvel userform ou il pourra rentrer la date de l'évènement dans la bonne colonne suivant sa réponse. Sachant qu'il ne pourra pas rentrer de date si les colonnes précédentes n'ont pas été remplie.
Du coup, j'étais parti sur un principe de validation de données avec des conditions "si" dans les cellules à coté mais je ne trouvais pas ça très propre...

Maintenant je me demande comment écrire dans la cellule de droite de celle active. C'est pour ça que je voulais passer par les coordonnées des cellules...

Si je ne suis pas très clair n'hésite pas à me poser des questions et merci de ton aide encore une fois :)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème d'affectation de valeur

Re,

(...) Maintenant je me demande comment écrire dans la cellule de droite de celle active. C'est pour ça que je voulais passer par les coordonnées des cellules (...)

On peut utiliser la méthode OFFSET. Cette méthode s'applique à un range. Avec OFFSET, on identifie un range à partir d'un range de départ déplacé de i lignes (vers le bas ou vers le haut) et déplacé de j colonnes (vers la droite ou vers la gauche).
Cela s'écrit: RangeDépart.Offset(i , j)

Si le range de départ est la cellule active ActiveCell (disons D2)

ActiveCell.Offset(2,4) désigne le range H4
(on part de D2, on translate de 2 lignes vers le bas (D4) puis on translate de 4 colonnes vers la droite (H4)

ActiveCell.Offset(-1,-2) désigne le range B1
(on part de D2, on translate de 1 lignes vers le haut (D1) puis on translate de 2 colonnes vers la gauche (B1)

Pour référencer la cellule à droite de la cellule active, on peut utiliser ActiveCell.Offset(0,1)

Pour affecter la valeur 1234 à la cellule à droite de la cellule active, on écrira : ActiveCell.Offset(0,1)=1234
 
Dernière édition:

rofou13

XLDnaute Nouveau
Re : Problème d'affectation de valeur

Re,



On peut utiliser la méthode OFFSET. Cette méthode s'applique à un range. Avec OFFSET, on identifie un range à partir d'un range de départ déplacé de i lignes (vers le bas ou vers le haut) et déplacé de j colonnes (vers la droite ou vers la gauche).
Cela s'écrit: RangeDépart.Offset(i , j)

Si le range de départ est la cellule active ActiveCell (disons D2)

ActiveCell.Offset(2,4) désigne le range H4
(on part de D2, on translate de 2 lignes vers le bas (D4) puis on translate de 4 colonnes vers la droite (H4)

ActiveCell.Offset(-1,-2) désigne le range B1
(on part de D2, on translate de 1 lignes vers le haut (D1) puis on translate de 2 colonnes vers la gauche (B1)

Pour référencer la cellule à droite de la cellule active, on peut utiliser ActiveCell.Offset(0,1)

Pour affecter la valeur 1234 à la cellule à droite de la cellule active, on écrira : ActiveCell.Offset(0,1)=1234

Re,

Merci beaucoup mapomme je pense que je devrais m'en sortir avec ça pour la suite :)

Si jamais tu identifies le problème des attributions des variables je veux bien le savoir pour ma connaissance :)

Passe une bonne soirée.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Problème d'affectation de valeur

Re,

(...) Si jamais tu identifies le problème des attributions des variables je veux bien le savoir pour ma connaissance (...)

Il y a plusieurs points à noter:

Tu utilises deux procédures évènementielles différentes déclenchées par la même action (changement de sélection).

La première est une procédure évènementielle (de feuille) qui se déclenche uniquement quand la sélection change sur la feuille Feuil1.
il s'agit de Private Sub Worksheet_SelectionChange(ByVal Target As Range) au sein du code de la feuille Feuil1

La seconde est une procédure évènementielle (de classeur) qui se déclenche pour chaque feuille du classeur sur laquelle la sélection change.
il s'agit de Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range) au sein du code du classeur
Tu remarqueras que cette dernière procédure a un paramètre nommé Sh qui référence la feuille au sein de laquelle la sélection a changé.

Lorsque la sélection change au sein de Feuil1, la suite des procédures est la suivante :

  1. Appel de la procédure de la feuille Feuil1: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. Affichage de Userform1
  3. Appel de la procédure Private Sub ComboBox1_Change() de Userform1
  4. Masquage de Userform1
  5. Appel de la procédure de classeur Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)

On s'aperçoit que la dernière procédure, qui doit théoriquement sauvegarder les coordonnées de la cellule sélectionnée, n'est exécutée qu'après l'affichage et le masquage de Userform1. La sauvegarde des coordonnées se fait après leur utilisation. C'est pas bon, ça!

En fait, il ne faut utiliser que des procédures évènementielles de la feuille Feuil1 puisqu'il n'y a que cette feuille qui nous intéresse.

La procédure de classeur peut-être utilisée quand on veut agir de manière analogue sur plusieurs feuilles. Imaginons que nous ayons 12 feuilles similaires (une par mois) et qu'on fasse la même action sur chacune des feuilles si la sélection change. On utilise Sh pour savoir sur quelle feuille le changement de sélection s'est produit. On écrirait:
Code:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
  with Sh
      if not intersect(target, .range("M2:M200")) is nothing then
        ligne code
        ligne code
        ligne code
      end if
  end with
end sub


Je pense donc qu'il faudrait :
  • effacer toute la procédure: Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
  • sauvegarder les coordonnées dans la procédure: Private Sub Worksheet_SelectionChange(ByVal Target As Range) avant d'afficher Userform1



.
Il existe un autre moyen de créer des variables globales (au lieu de les sauvegarder sur une feuille de calcul) pouvant être utilisées dans toutes les procédures de feuilles, de classeur ou d'autres modules.
  • créer un module (Module1)
  • déclarer deux variables "Public" dans Module1
VB:
Option Explicit
Public Lig As Long, Col As Long

Le code dans Feuil1 deviendrait:
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("M2:M200")) Is Nothing Then
    Lig = Target.Row
    Col = Target.Column
    UserForm1.Show
  End If
End Sub

Le code dans Userform1 deviendrait:
VB:
Private Sub ComboBox1_Change()
  Sheets("Bilan").Cells(Lig, Col) = ComboBox1.List(ComboBox1.ListIndex)
  UserForm1.Hide
End Sub
 
Dernière édition:

rofou13

XLDnaute Nouveau
Re : Problème d'affectation de valeur

Ah d'accord je n'avais pas vu la différence entre les deux évènements.

C'est beaucoup plus clair maintenant. Je vais faire des essais avec toutes ces informations.

En tout cas merci beaucoup encore une fois pour ces réponses précises.
 

Dranreb

XLDnaute Barbatruc
Re : Problème d'affectation de valeur

Bonsoir.
Je me dois de signaler une autre manière de faire que j'utilise très souvent et que j'aime bien parce que je la trouve très pratique, pour transmettre des informations à un UserForm ou en récupérer.
Ça consiste à y écrire des procédures Public avec paramètres transmis. Sub ou Function, même Property Let et Get si on veut.
Elles se terminent souvent par Me.Show, vu qu'on les appelle un peu à la place de Show. D'ailleurs il faut, comme pour Show spécifier devant le nom de l'UserForm suivi d'un point. Parce que c'est un module objet, non un module standard, et qu'une chose Public dans un tel module s'appelle par définition une méthode ou une propriété.
 

Statistiques des forums

Discussions
312 506
Messages
2 089 121
Membres
104 038
dernier inscrit
Helpme59