Récupérer coordonnées d'une cellule contenant du texte (inputbox)
Bonjour à tous,
Je ne suis pas familier avec le vba et j'essaie d'automatiser les modifications d'une BDD afin d'en faciliter la gestion.
Étant débutant je sollicite votre aide (ne me donnez pas forcément la réponse mais des pistes de solutions me vont très bien dans un premier temps, histoire de voir si je peux apprendre).
Voici le souci :
Un classeur contient 2 formulaires, le 1er pour ajouter une ligne avec des informations (text-box et combo-box) et le second (identique) mais dans l'optique de les modifier.
Avant d'ouvrir mon formulaire de modification, j'ai une inputbox qui demande à l'utilisateur de renseigner une référence de document sous la forme "xx0000" (peu importe la taille de la chaîne de caractères).
Ce que je souhaite faire c'est, qu'à partir de la chaine de caractère inscrit dans la boite de dialogue, pouvoir récupérer l'emplacement de la cellule dans sa colonne (Me.txtreference) pour la stocker dans CellNum.
Ensuite j'aimerai utiliser la variable MaLigne pour effectuer la recherche des informations de la ligne correspondante dans mon tableau afin de les inscrire dans les champs correspondants.
En l'état cela fonctionne si le contenu de ma recherche est uniquement composée de chiffres mais je souhaite que mes références soient alphanumériques).
Private Sub UserForm_Initialize()
'Déclaration des variables
Dim MaReference
Dim CelNum
Dim MaLigne As Integer
'affectation du numéro du texte dans la variable
MaReference = InputBox("Saisir la référence du texte à modifier", "Modification")
'frmmodification ou Me fonctionnent tous les 2
Me.txtreference = MaReference
MaLigne = MaReference '+ 1
'On se positionne sur la ligne de la référence à modifier
Cells(MaLigne, 1).Select
'test contenu de la cellule active
If ActiveCell <> "" Then
Me.txttitre = Cells(MaLigne, 2)
Me.cbonature = Cells(MaLigne, 3)
Me.cboutilisateur = Cells(MaLigne, 5)
Me.cboperimetre = Cells(MaLigne, 7)
Me.cboemetteur = Cells(MaLigne, 9)
Me.cbophaseprojet = Cells(MaLigne, 11)
Me.cboniveau = Cells(MaLigne, 13)
End If
End SubPar avance, merci pour votre aide.
Bonsoir DC_1 et
Une petite présentation ICI serait la bienvenue
Si vous ne l'avez pas encore fait, je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER] ainsi que ses fonctionnalités
qui vous aideront dans vos demandes et réponses sur ce forum.
Merci de votre participation
Cordialement
Bonsoir,
vous écrivez : MaLigne = MaReference, où je pense que MaLigne est un chiffre correspondant au numéro de ligne de la feuille Excel où se trouve la valeur Référence.
donc si l'input box renvoie une donnée alphanumérique cela ne fonctionne plus, normale.
Il vous faut donc trouver le numéro de ligne de la feuille Excel où se trouve la référence donnée dans l'inputbox.
Vous pouvez comme "première solution" utiliser Find qui permet de chercher une valeur dans une plage.
Private Sub UserForm_Initialize()
'Déclaration des variables
Dim MaReference
Dim CelNum
Dim MaLigne As Integer
Dim Cel As Range ' variable représentant la cellule où l'on va trouver la valeur cherchée
Dim Plage As Range ' variable représentant la plage de cellule dans laquelle on va chercher la référence
'affectation du numéro du texte dans la variable
MaReference = InputBox("Saisir la référence du texte à modifier", "Modification")
'frmmodification ou Me fonctionnent tous les 2, voir même ne rien mettre !
Me.txtreference = MaReference
'********************* LouReeD
Set Plage = Activesheet.Range("A5:A125") ' on attribue à Plage la colonne de recherche (par exemple)
Set Cel = Plage.Find(MaReference) ' on attribue à Cel le résultat de la recherche
' si Cel n'est pas égale à rien c'est qu'on a trouvé, alors
If Not Cel Is Nothing Then
MaLigne = Cel.Row ' alors MaLigne est égal à la ligne de la cellule Cel où se trouve la référence
Else ' si on n'a pas trouvé la référence
' que fait-on ? On Quitte .
Unload Me
End If
' MaLigne = MaReference '+ 1 n'est plus utile
'On se positionne sur la ligne de la référence à modifier
' Cells(MaLigne, 1).Select pas utile de sélectionner
'test contenu de la cellule active
' If ActiveCell <> "" Then pas utile de tester puisque l'on a trouvé
Me.txttitre = Cells(MaLigne, 2)
Me.cbonature = Cells(MaLigne, 3)
Me.cboutilisateur = Cells(MaLigne, 5)
Me.cboperimetre = Cells(MaLigne, 7)
Me.cboemetteur = Cells(MaLigne, 9)
Me.cbophaseprojet = Cells(MaLigne, 11)
Me.cboniveau = Cells(MaLigne, 13)
'End If plus utile non plus
End SubVoici votre code avec ma proposition en partant du principe que la recherche de la référence se fait en colonne A de la ligne 5 à 125.
Certaine ligne de votre code en commentaire car devenues inutiles ou l'étaient déjà.
@ bientôt
LouReeD
Nota : pourquoi 2 USF identiques ? Si vous en avez un pour la création de données, celui-ci peut également servir pour la consultation, la modification et la suppression des enregistrements ! Voyez ceci
Bonjour LouReed,
Tout d'abord, merci pour ton retour.
je n'ai pas encore eu le temps de tester ta solution mais je pense que c'est ce qui me manquait.
Aussi, je vais prendre le soin de lire l'article que tu m'as conseillé car cela me semble bien plus efficace que la solution que j'envisageais (plusieurs formulaires et un bouton Suppr).
Encore merci.
Je ferme ce poste et reviendrai demander de l'aide si besoin ;-).
Bonsoir,
je veille... J'attends votre retour !
@ bientôt
LouReeD
Bonjour LouReed (et les autres par la même occasion),
Merci pour la piste me permettant de corriger le code.
Voici le code tel que je l'utilise actuellement.
Il y a évidemment encore des améliorations à faire ;-)
Private Sub UserForm_Initialize()
'Déclaration des variables
Dim MaReference
Dim MaLigne As Integer
Dim Cel As Range
Dim Plage As Range
MaReference = InputBox("Saisir la référence du texte à modifier", "Modification")
If MaReference = "" Then Exit Sub
Me.txtreference = MaReference
Set Plage = ActiveSheet.Range("Référence")
Set Cel = Plage.Find(MaReference)
If Not Cel Is Nothing Then
MaLigne = Cel.Row
Cells(MaLigne, 2).Select 'Ici j'ai conservé le sélecteur sinon les modifications se font à l'emplacement du curseur dans la feuille
Else Unload Me
End If
Me.txttitre = Cells(MaLigne, 3)
Me.cbonature = Cells(MaLigne, 5)
Me.cboutilisateur = Cells(MaLigne, 7)
Me.cboperimetre = Cells(MaLigne, 9)
Me.cboemetteur = Cells(MaLigne, 11)
Me.cbophaseprojet = Cells(MaLigne, 13)
Me.cboniveau = Cells(MaLigne, 14)
Me.cbodgii = Cells(MaLigne, 15)
Me.cboinfrapole = Cells(MaLigne, 16)
Me.cboconception = Cells(MaLigne, 17)
Me.cborealisation = Cells(MaLigne, 18)
Me.cbomaintenance = Cells(MaLigne, 19)
End Sub
'***********************************************
'Procédure qui permet de modifier un texte
'dans la base de donnée à partir du formulaire
'***********************************************
Private Sub btnvalider_Click()
ActiveCell = Me.txtreference
ActiveCell.Offset(0, 1) = Me.txttitre
ActiveCell.Offset(0, 3) = Me.cbonature
ActiveCell.Offset(0, 5) = Me.cboutilisateur
ActiveCell.Offset(0, 7) = Me.cboperimetre
ActiveCell.Offset(0, 9) = Me.cboemetteur
ActiveCell.Offset(0, 11) = Me.cbophaseprojet
ActiveCell.Offset(0, 12) = Me.cboniveau
ActiveCell.Offset(0, 13) = Me.cbodgii
ActiveCell.Offset(0, 14) = Me.cboinfrapole
ActiveCell.Offset(0, 15) = Me.cboconception
ActiveCell.Offset(0, 16) = Me.cborealisation
ActiveCell.Offset(0, 17) = Me.cbomaintenance
End SubMaintenant je cherche le meilleur moyen de copier certaines colonnes dans une autre feuille (certaines colonnes se remplissent grâce à des fonctions directement depuis les cellules et ce sont ces colonnes que je souhaite utiliser par ailleurs).
De plus, j'ai regardé le formulaire USerForm CRUD Tableaux Structuré mais c'est assez difficile à appréhender et à modifier pour correspondre à mon besoin au vu de mon niveau.
Pour pouvoir le faire j'aurais besoin soit d'améliorer mes connaissances, soit d'un coup de main. D'ailleurs je n'arrive pas à faire fonctionner correctement le formulaire car j'ai une erreur lors de la création d'une nouvelle entrée :
Private Sub tb3_Change()
On Error Resume Next
'l'arrêt se focalise sur TB4.SetFocus. J'ai réussi à le contourner en retirant la ligne
tb4.SetFocus
End SubPour le moment je vais travailler ma solution car au moins je peux corriger les erreurs sans trop de difficultés.
Bonjour DC_1
Le sujet était marqué comme résolu, je le verrouille donc.
Pour plus de visibilité, merci d'en ouvrir un nouveau si vous avez besoin d'une autre aide
LouReed n'aurait pas dû vous répondre "en attendant votre retour"
Merci de votre compréhension