Microsoft 365 Personnaliser une formule depuis un formulaire

netparty

XLDnaute Occasionnel
Bonjour à tous
Dans un de mes fichiers j'utilise une formule de concaténation mais suivant les projets je dois adapter cette formule.
Je me demande si via un formulaire je pourrais personnaliser cette formule.
Dans mon formulaire j'aurais la possibilité de choisir la position de la cellule concernée pour choix d'une numérotation exemple 1 2 3 et si je met un 0 cette cellule n'est pas prise en compte et entre chaque choix j'aurais la possibilité de placer un séparateur exemple - ou _

Merci d'avance pour votre aide
 

Pièces jointes

  • Concatenation.xlsm
    21.8 KB · Affichages: 2

Staple1600

XLDnaute Barbatruc
Bonjour @netparty

Une alternative
Alternative.PNG

avec la formule JOINDRE.TEXTE
et en modifiant le formulaire (on utilise des cases à cocher pour sélectionner les cellules à prendre en compte)
Le séparateur est dans la cellule N7 dans cet exemple
 

Staple1600

XLDnaute Barbatruc
Re

Donc en suivant l'idée du message précédent, on peut faire par exemple
UserForm.PNG
Ci-dessous le code de l'Userform
VB:
Dim t()
Private Sub UserForm_Initialize()
ReDim t(1, 1 To 9)
t = ActiveSheet.Range("D3:L3").Value
End Sub

Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      Select Case ctrl.Value
      Case True
      Range(ctrl.Tag & "3") = ""
      Case Else
      End Select
    End If
Next ctrl
End Sub

Private Sub CommandButton2_Click()
ActiveSheet.Range("D3:L3").Value = t
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      ctrl.Value = False
    End If
Next ctrl
End Sub
NB: Ne pas oublier de renseigner la propriété Tag de chaque checkbox
Avant chaque création de formule, ne pas oublier de cliquer sur le bouton RAZ
(pour remettre les valeurs initiales présentes avant l'affichage de l'useform)

Tag.png







Donc le Tag pour CheckBox2 sera E , pour CheckBox3 sera F etc...
 

netparty

XLDnaute Occasionnel
Re

Donc en suivant l'idée du message précédent, on peut faire par exemple
Regarde la pièce jointe 1195995
Ci-dessous le code de l'Userform
VB:
Dim t()
Private Sub UserForm_Initialize()
ReDim t(1, 1 To 9)
t = ActiveSheet.Range("D3:L3").Value
End Sub

Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      Select Case ctrl.Value
      Case True
      Range(ctrl.Tag & "3") = ""
      Case Else
      End Select
    End If
Next ctrl
End Sub

Private Sub CommandButton2_Click()
ActiveSheet.Range("D3:L3").Value = t
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      ctrl.Value = False
    End If
Next ctrl
End Sub
NB: Ne pas oublier de renseigner la propriété Tag de chaque checkbox
Avant chaque création de formule, ne pas oublier de cliquer sur le bouton RAZ
(pour remettre les valeurs initiales présentes avant l'affichage de l'useform)

Regarde la pièce jointe 1195997






Donc le Tag pour CheckBox2 sera E , pour CheckBox3 sera F etc...
Bonjour @Staple1600

Merci pour ton aide, mais est-il possible aussi de choisir l’ordre de choix
Bonne journée
 

Staple1600

XLDnaute Barbatruc
Re

Petite correction de code (et pour que cela soit plus intuitif)
(ici les cases cochées indiquent les cellules retenues dans la formule)
Code:
Dim t()
Private Sub UserForm_Initialize()
ReDim t(1, 1 To 9)
t = ActiveSheet.Range("D3:M3").Value
End Sub

Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      Select Case ctrl.Value
      Case True
      '
      Case Else
      Range(ctrl.Tag & "3") = ""
      End Select
    End If
Next ctrl
End Sub

Private Sub CommandButton2_Click()
ActiveSheet.Range("D3:M3").Value = t
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      ctrl.Value = False
    End If
Next ctrl
End Sub
Et j'avais oublié de posté la formule
=JOINDRE.TEXTE(B3;VRAI;$D$3:$M$3)
 

netparty

XLDnaute Occasionnel
Re

Petite correction de code (et pour que cela soit plus intuitif)
(ici les cases cochées indiquent les cellules retenues dans la formule)
Code:
Dim t()
Private Sub UserForm_Initialize()
ReDim t(1, 1 To 9)
t = ActiveSheet.Range("D3:M3").Value
End Sub

Private Sub CommandButton1_Click()
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      Select Case ctrl.Value
      Case True
      '
      Case Else
      Range(ctrl.Tag & "3") = ""
      End Select
    End If
Next ctrl
End Sub

Private Sub CommandButton2_Click()
ActiveSheet.Range("D3:M3").Value = t
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
      ctrl.Value = False
    End If
Next ctrl
End Sub
Et j'avais oublié de posté la formule
=JOINDRE.TEXTE(B3;VRAI;$D$3:$M$3)
Re @Staple1600

Mon idée était la suivante :
1714549073260.png

Partir sur des ComboBox ce qui permet de configurer ma formule crois-tu que cela est faisable ?
 

Staple1600

XLDnaute Barbatruc
Re

@netparty
Moi, je suis parti (et à l'insu de mon plein gré ;)) sur l'alternative proposée dans mes précédents messages
Personnellement, si j'étais moi, j'oublierai cette histoire d'userform pour créer une formule.
(De peur de pencher vers l'usine à gaz, de perdre en ergonomie intuitive)

Mais c'est ton projet, donc suis ton idée.
 

netparty

XLDnaute Occasionnel
Re

@netparty
Moi, je suis parti (et à l'insu de mon plein gré ;)) sur l'alternative proposée dans mes précédents messages
Personnellement, si j'étais moi, j'oublierai cette histoire d'userform pour créer une formule.
(De peur de pencher vers l'usine à gaz, de perdre en ergonomie intuitive)

Mais c'est ton projet, donc suis ton idée.
Oui je sais que c'est peut-être une usine à gaz :)
Dans mon formulaire j'ai réussi à choisir l'ordre que j'ai besoin et j'affiche le résultat dans une textbox mais comment puis-je récupérer les bonnes cellules pour les concaténer ?
 

Pièces jointes

  • Concatenation.xlsm
    24.1 KB · Affichages: 3

netparty

XLDnaute Occasionnel
Re

@netparty
Plutôt qu'un userform, pourquoi ne pas utiliser Données/Validation ?
Regarde la pièce jointe 1195999
Ce serait plus simple, non ?
(Il faut juste créer N listes et faire Données/Validation sur les cellules concernées)

Re

@netparty
Quid de ma précédent suggestion ?
Tu vas trop vite j'étais en train de répondre.

Le but de mon fichier est de gérer une liste de plan en dessin et suivant les projets une codification du nom est souvent demandée.
Donc mon idée était que la première fois je configure la structure du nom et ensuite je duplique cette formule jusque la dernière ligne.
Si c'est moi qui configure cette codification se n'est pas un problème car je modifie la formule manuellement mais se fichier est utilisé par plusieurs personnes qui ne savent pas toujours utiliser des formules personnalisées.
C'est pour cela que j'essaye de faire cela via un formulaire pour que tous le monde puise le faire.
 

Staple1600

XLDnaute Barbatruc
Re

@netparty
C'est pour cela que j'essaye de faire cela via un formulaire pour que tous le monde puise le faire.

Je parle d'expérience.
Plus un classeur Excel est à destination d'utilisateurs "novices" d'Excel, moins celui-ci devrait contenir du VBA.
Jadis, je faisais des classeurs avec VBA, Userform etc...
A l'usage, il y avait toujours un collègue qui faisait planter le bestiau .

Donc désormais, je suis et applique le principe K.I.S.S
Je vais au plus simple (ce qui m'évite mails et coup de fil des mes collègues avec des " ca marche plus"

Si le fichier est à destination d'autres personnes et qu'elles n'ont pas à modifier les formules, il suffit de juste leur fournir une version PDF du classeur, non ?

Sinon, il suffit de prendre du temps (ce que je fais avec mes collègues) pour expliquer le fonctionnent de l'outil que je mets à leur disposition.
;)
 

Discussions similaires

Réponses
27
Affichages
1 K
Réponses
3
Affichages
600

Statistiques des forums

Discussions
315 123
Messages
2 116 458
Membres
112 748
dernier inscrit
Pboiusquet