Nom d'une userform créée automatiquement

cobol80

XLDnaute Nouveau
Bonjour,

J'ai récupéré un bout de code (voir ci-dessous) sur le forum pour nommer une userform créée automatiquement par un module.

Set ObjUSF = ThisWorkbook.VBProject.VBComponents.Add(3)
With ObjUSF
.Properties("Caption") = "Etage pour le zoning"
.Properties("Width") = 660
.Properties("Height") = 195
.Properties("Name") = "Etage6"
End With

La première fois cela fonctionnement correctement la userform porte bien ce nom. Par contre la seconde fois cela me donne une erreur :mad::

Erreur d'execution 75
Erreur d'accès Chemin/fichier

Même si je supprime manuellement la userform avant de relancer, même si je supprime la userform automatiquement avec la commande REMOVE :

ThisWorkbook.VBProject.VBComponents.remove... qui fonctionne correctement

Merci de vos réponses.:)
Cordialement
PM
 

jeanpierre

Nous a quitté
Repose en paix
Re : Nom d'une userform créée automatiquement

Bonjour cobol80,

En première lecture, je pense que, suite à ta création et à ta suppression, VBA a modifié le nom de ton USF et là, effectivement Erreur. A voir donc, mais sans ton fichier.....

A te lire.

Jean-Pierre
 

cobol80

XLDnaute Nouveau
Re : Nom d'une userform créée automatiquement

Bonjour,
merci pour cette lecture et réponse rapide.:)
Je joins le fichier exemple récupéré qui ne fonctionne pas non plus.
Cordialement
 

Pièces jointes

  • Creation userform et label automatique.xls
    41.5 KB · Affichages: 59

PMO2

XLDnaute Accro
Re : Nom d'une userform créée automatiquement

Bonjour,

Voici le code corrigé (merci de tenir compte des remarques signalées par '/// ou par '---)
Code:
'/// Remarque PMO : c'est ici qu'il faut adapter le nom du UserForm ///
Const USFName As String = "Etage6_"   'adaptez "Etage6_" au nom souhaité
'//////////////////////////////////////////////////////////////////////

Const Sign As String = "@+Thierry 's Truc sur www.Excel-Downloads.com, Aug 2005"

Const TxbWidth As Integer = 65
Const TxbHeigth As Integer = 15
Const TxbLeft As Integer = 90
Const TxbTop As Integer = 15

Const LblWidth As Integer = 70
Const LblHeigth As Integer = 15
Const LblLeft As Integer = 10
Const LblTop As Integer = 15

Sub MyUserFormAutoBuilder()
Dim ObjUSF As Object
Dim ObjTextBox As Object, ObjLabel As Object, CmdB As Object, LstB As Object
Dim TopPlusHeight As Integer
Dim x As Byte
Dim VLblLeft As Integer
Dim VTxbLeft As Integer

'--- Ajouts ou modifications PMO ---
Dim suffixe&
Randomize Timer
suffixe& = Int((2 ^ 24 * Rnd) + 1)
For Each ObjUSF In ThisWorkbook.VBProject.VBComponents
  If Left(ObjUSF.Name, Len(USFName)) = USFName Then
    ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=ObjUSF
    Exit For
  End If
Next ObjUSF
'---------------------------------

  Set ObjUSF = ThisWorkbook.VBProject.VBComponents.Add(3)
  With ObjUSF
    .Properties("Caption") = Sign
    .Properties("Width") = 660
    .Properties("Height") = 195
    .Properties("ShowModal") = True
    
        '--- Modification PMO - laissez en place la constante USFName, ne la modifiez qu'au ---
        '--- niveau de sa déclaration (voir, au début du code, Const USFName As String )    ---
    .Properties("Name") = USFName & suffixe& 'Si on veut forcer un Nom de UserForm...
        '--------------------------------------------------------------------------------------
        
  End With

    For x = 1 To 40

      Set ObjTextBox = ObjUSF.Designer.Controls.Add("Forms.TextBox.1")
      Set ObjLabel = ObjUSF.Designer.Controls.Add("Forms.Label.1")

          Select Case x
            Case 1 To 10
              If x = 1 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft
              VTxbLeft = TxbLeft
            Case 11 To 20
              If x = 11 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 160
              VTxbLeft = TxbLeft + 160
            Case 21 To 30
              If x = 21 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 320
              VTxbLeft = TxbLeft + 320
            Case 31 To 40
              If x = 31 Then TopPlusHeight = LblTop
              VLblLeft = LblLeft + 480
              VTxbLeft = TxbLeft + 480
          End Select


          With ObjLabel
            .Caption = "Label TextBox " & x
            .Left = VLblLeft: .Top = TopPlusHeight: .Width = LblWidth: .Height = LblHeigth
            .Tag = "Thierry's Demo"
            .Name = "LblDemo" & x
          End With
          With ObjTextBox
            .Left = VTxbLeft: .Top = TopPlusHeight: .Width = TxbWidth: .Height = TxbHeigth
            .Tag = "Thierry's Demo"
            .Name = "TxbDemo" & x
            .TextAlign = 3
          End With

        TopPlusHeight = TopPlusHeight + 15
    Next

MyLabelClicks ObjUSF.Name

VBA.UserForms.Add(ObjUSF.Name).Show

Set ObjUSF = Nothing
Set ObjTextBox = Nothing
Set ObjLabel = Nothing

End Sub

Cordialement.

PMO
Patrick Morange
 

cobol80

XLDnaute Nouveau
[Résolu] Re : Nom d'une userform créée automatiquement

Bonjour,

Merci cela fonctionne correctement. :)
Si je comprends bien on ne peut pas avoir le même nom à chaque nouvelle création style ETAGE6, on est obligé de l'associer avec un parametre comme l'heure, le jour...même si on reussi à supprimer l'ancienne.

Encore merci.
:)
 

PMO2

XLDnaute Accro
Re : Nom d'une userform créée automatiquement

Bonjour,

Si je comprends bien on ne peut pas avoir le même nom à chaque nouvelle création style ETAGE6, on est obligé de l'associer avec un paramètre comme l'heure, le jour...même si on reussi à supprimer l'ancienne.

Pour parler franc, je ne suis pas aussi péremptoire. Je n'ai pas connaissance de ce qui se passe en coulisse mais j'ai trouvé la solution à ce problème par un moyen détourné qui a le mérite de faire.

De nombreux programmeurs se sont plaint du grossissement, sans raison apparente, de leur classeur alors qu'ils avaient seulement modifié un petit bout de code. Cela amène à penser qu'Excel, au sein du VBE, laisse subsister des objets invisibles comme dans le cas qui nous préoccupe.

Il y a de forts risques que la méthode que je propose laisse des fantômes qui grossiraient le classeur. Je n'ai pas trouvé mieux. A surveiller donc.

Cordialement.

PMO
Patrick Morange
 

Statistiques des forums

Discussions
312 428
Messages
2 088 336
Membres
103 814
dernier inscrit
Lolo280277