Microsoft 365 Quelle autre méthode pour créer un Userfom sur Mac | propositions + application de la solution si c'est possible ??? (non ActiveX svp)

RyuAutodidacte

XLDnaute Impliqué
Supporter XLD
Bonjour,

Après Excel 2011 Mac, il n'est plus possible de créer de Userform sur Mac.
Pour l'instant le seul moyen d'avoir un Userform sur Mac est de créer le fichier avec l'userform et les controles sur Excel PC.

Par contre :
  • une fois le fichier récupérer sur MAC, on peut le coder en VBA
  • on peut aussi récupérer l'Userform sur Mac avec import de celui-ci (exporter du fichier PC ou d'un fichier Mac comportant un Userform)
  • les fichiers exporter de Userform sont : Userform.frm , Userform.frx
  • sur Mac les propriétés de l'userform et controls sont pas visibles (on peut les récupérer par VBA)
Ce que j'aimerai, c'est trouver une solution annexe pour le faire sur Mac :
  1. y a t-il moyen de recréer les fichier .frm et .frx sans Excel en mettant les paramètres de l'userfom et des controls voulus ?
  2. je n'ai pas encore trouvé de code vba permettant de créer l'userform sur Mac, mais y 'en a t-il un ??
Merci d'avance pour vos réponse
 

RyuAutodidacte

XLDnaute Impliqué
Supporter XLD
Re à tous pour ce qui sont intéressé par le sujet …

J'ai trouvé ce qui bloqué pour la création d'un UserForm par VBA sur Mac,
dans les préférences Sécurité d'Excel il faut cocher :

1640035624152.png


Question : quel est la référence exact dans visual basic qu'il faut activer pour créer des UserForm ??

Donc pour créer un UserForm j'ai emprunté un code sur le web de johnske :
VB:
Option Explicit
Sub MakeUserForm()
    
    Dim MyUserForm As VBComponent
    Dim NewOptionButton As Msforms.OptionButton
    Dim NewCommandButton1 As Msforms.CommandButton
    Dim NewCommandButton2 As Msforms.CommandButton
    Dim MyComboBox As Msforms.ComboBox
    Dim N, X As Integer, MaxWidth As Long
    
     '//First, check the form doesn't already exist
    For N = 1 To ActiveWorkbook.VBProject.VBComponents.Count
        If ActiveWorkbook.VBProject.VBComponents(N).Name = "NewForm" Then
            ShowForm
            Exit Sub
        Else
        End If
    Next N
    
     '//Make a userform
    Set MyUserForm = ActiveWorkbook.VBProject _
    .VBComponents.Add(vbext_ct_MSForm)
    With MyUserForm
        .Properties("Height") = 100
        .Properties("Width") = 200
        On Error Resume Next
        .Name = "NewForm"
        .Properties("Caption") = "Here is your user form"
    End With
    
     '//Add a Cancel button to the form
    Set NewCommandButton1 = MyUserForm.Designer.Controls.Add("forms.CommandButton.1")
    With NewCommandButton1
        .Caption = "Cancel"
        .Height = 18
        .Width = 44
        .Left = MaxWidth + 147
        .Top = 6
    End With
    
     '//Add an OK button to the form
    Set NewCommandButton2 = MyUserForm.Designer.Controls.Add("forms.CommandButton.1")
    With NewCommandButton2
        .Caption = "OK"
        .Height = 18
        .Width = 44
        .Left = MaxWidth + 147
        .Top = 28
    End With
    
     '//Add code on the form for the CommandButtons
    With MyUserForm.CodeModule
        X = .CountOfLines
        .InsertLines X + 1, "Sub CommandButton1_Click()"
        .InsertLines X + 2, "    Unload Me"
        .InsertLines X + 3, "End Sub"
        .InsertLines X + 4, ""
        .InsertLines X + 5, "Sub CommandButton2_Click()"
        .InsertLines X + 6, "    Unload Me"
        .InsertLines X + 7, "End Sub"
    End With
    
     '//Add a combo box on the form
    Set MyComboBox = MyUserForm.Designer.Controls.Add("Forms.ComboBox.1")
    With MyComboBox
        .Name = "Combo1"
        .Left = 10
        .Top = 10
        .Height = 16
        .Width = 100
    End With
    
    ShowForm
End Sub
 
Sub ShowForm()
    NewForm.Show
End Sub
J'active d'abord des références :

1640036698037.png


Puis utilise le code … j'ai bien mon userform qui se créé, mais je n'ai pas accès au propriétés :

1640036841127.png


Du coup je re-teste en modifiant cette partie de code :
Code:
    For N = 1 To ActiveWorkbook.VBProject.VBComponents.Count
        If ActiveWorkbook.VBProject.VBComponents(N).Name = "toto" Then ' avant le nom était : "NewForm"
            ShowForm
            Exit Sub
        Else
        End If
    Next N

Et là étrangement j'ai ceci :

1640037482395.png


Et là incroyable j'ai accès aux propriétés de l'UserForm1 et des controls :

1640037651138.png


Par contre si je le malheur de faire un UserForm1.Sow, une fois unload je n'ai plus accès au propriétés.

Donc toutes aides/suggestions sont les bienvenues …

Merci d'avance
 

RyuAutodidacte

XLDnaute Impliqué
Supporter XLD
bonsoir ryu
perso je n'ai pas de suggestion sinon une
quand on en arrive a une telle pagaille pour travailler sérieusement , il est temps de revenir au essentiels
tu utilise office utilise un windows
mac c'est mac Microsoft c'est Microsoft
Coucou Patrick

Merci, mais la faute en revient à MS qui a pas maintenu cela après Excel 2011.
Sais tu pour la petite histoire que ces logiciels (Word, Excel) on était créé à la base en tout 1er lieu sur Mac par Bill Gates …
Enfin quoi qu'il en soit mon taf fait que je travail sur Mac et je n'aurais donc pas de PC à dispo …
Donc je fais avec et il doit bien y avoir des soluces, mais faut explorer …

Ce que l'on sait maintenant c'est que l'on peut créer des UserForms sur Mac via VBA et que si le Userform créé n'est pas show ainsi que les controls, on a donc accès aux propriétés.

Maintenant faudrait :
• trouver comment garder l'accessibilité aux propriétés ? (après un show)
• ou comment les faire réapparaître quand on veut y accéder ?

Par contre quel est la réponse à cette question svp ? :
Question : quel est la référence exact dans visual basic qu'il faut activer pour créer des UserForm ??
 

patricktoulon

XLDnaute Barbatruc
re
c'est peut être rien mais je vois a aucun moment dans ton code de construction dynamique de ta forme l'ajout dans collection VBA de ton userform ???????

VBA.UserForms.add("nomdu form")

essaie mon vieux msgbox perso pour voir et vois si tu a les propriétés
VB:
'**********************************
'         MsgBox perso avec userform dynamique
'auteur patricktoulon
'date :12/08/2016
'***********************************
Option Explicit
Sub test()
    MsgBox "vous avez cliqué sur " & msg("salut RYU comment va tu ?")
End Sub
Function msg(texte)
    Dim Obj As Object, usf
    Dim j As Integer
    Set usf = ThisWorkbook.VBProject.VBComponents.Add(3)
    With usf: .Properties("Caption") = "msgboxAA": .Properties("Width") = 250: .Properties("Height") = 150: End With

    Set Obj = usf.Designer.Controls.Add("forms.TextBox.1", "content")
    With Obj:
        .Left = 0:
        .Top = 0:
        .Width = usf.Properties("InsideWidth"):
        .Height = usf.Properties("Insideheight") - 25
        .Name = "content":
        .BackColor = &H80C0FF:
        .ForeColor = vbGreen
        .Font.Name = "algerian"
        .Font.Size = 16
        .TextAlign = 2
        .MultiLine = True
        'et toutes autre propriété des textboxs font,borderstyle,etc......
        .Value = texte


    End With
    Set Obj = usf.Designer.Controls.Add("forms.CommandButton.1", "boutonOK")
    With Obj:
        .Left = usf.Properties("Width") - 60
        .Top = usf.Properties("Height") - 25 - 20
        .Width = 50
        .Height = 20
        .Name = "bouttonOK":
        .BackColor = vbRed
        .ForeColor = vbGreen
        .Caption = "OK"
    End With

    Set Obj = usf.Designer.Controls.Add("forms.CommandButton.1", "boutoncancel")
    With Obj:
        .Left = usf.Properties("Width") - 120
        .Top = usf.Properties("Height") - 25 - 20
        .Width = 50
        .Height = 20
        .Name = "boutoncancel":
        .BackColor = vbBlue
        .ForeColor = vbMagenta
        .Caption = "ANNULER"
    End With


    'creation insertion code du des evenements
    With usf.CodeModule
        j = .CountOfLines
        .insertlines j + 1, "public reponse"
        .insertlines j + 2, "Private Sub bouttonOK_Click():reponse = ""ok"": Me.Hide:End Sub"
        .insertlines j + 3, "Private Sub boutoncancel_Click():reponse = ""Annuler"":me.hide:End Sub"
        .insertlines j + 4, "Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)"
        .insertlines j + 5, "If CloseMode = 0 Then Cancel = True: Me.Hide"
        .insertlines j + 6, "End Sub"


    End With
    VBA.UserForms.Add (usf.Name)
    'affichage du pseudo msgbox
    With UserForms(UserForms.Count - 1)
        .Show
        msg = .reponse
    End With
    ThisWorkbook.VBProject.VBComponents.Remove (usf)
End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87