以编程方式将文本添加到现有用户窗体时出错

时间:2015-06-15 18:49:56

标签: excel vba excel-vba

我想在预先存在的用户表单中添加一个文本框,并在VBA Excel 2010中更改用户表单的高度。我希望添加文本框,并在设计时更改高度但我需要制作它与代码。以下代码是我目前所拥有的。

Sub Practice()
Dim hght As Single
Dim NameUserForm As String
Dim MyUserForm As Object

'Name of userform
NameUserForm = "test"

Set MyUserForm = ThisWorkbook.VBProject _
.VBComponents(NameUserForm)

hght = MyUserForm.Properties("Height")

With MyUserForm

    .Properties("Height") = hght + 25

End With

Set NewTextBox = MyUserForm.Designer.Controls.Add("Forms.TextBox.1")

    With NewTextBox
        .TextAlign = fmTextAlignCenter
        .Width = 66
        .Height = 18
        .Left = 40
        .Top = hght
    End With
test.Show

End Sub

我在以下一行收到错误

Set NewTextBox = MyUserForm.Designer.Controls.Add("Forms.TextBox.1")

错误读作:

  

运行时错误'-2147319767(80028029)'无效的前向引用或对未编译类型的引用。

我不知道我做错了什么。我也在mrexcel.com上问了同样的问题,这里有一个链接http://www.mrexcel.com/forum/excel-questions/861582-use-visual-basic-applications-add-textbox-existing-userform.html

3 个答案:

答案 0 :(得分:1)

我知道这是一个旧线程,但是我也遇到了此错误。莫名其妙,该错误使您无法回弹正在发生的事情。在我的方案中,我以编程方式添加了数据透视图。奇怪的是,我知道工作代码。我正在不相关的区域中进行更新,而我的工作代码开始显示此错误。我不知道发生了什么,所以我开始逐步浏览连接对象。最终,当通过ListObjects枚举时,我再次犯了这个错误。

Sub ViewListObjectsWithQueryTables()
Dim sh, itm
For Each sh In ActiveWorkbook.Sheets
    Dim i
    i = 1
    Do While i <= sh.ListObjects.Count
        itm = sh.ListObjects.Item(i)
        If sh.ListObjects.Item(i).SourceType = xlSrcQuery Then
            itm = sh.ListObjects.Item(i)
        End If
        i = i + 1
    Loop
Next
End Sub

在...处插入换行符

i = i +1

...并检查值。

原来,当我点击某个特定的工作表并尝试读取ListObjects.Count时,会收到错误消息。它与我自己的代码无关。

解决方案

  1. 删除旧版电子表格
  2. 重新创建

这解决了我的问题。并可能解释了为什么@Jonny Oliver能够修复,但不知道为什么。工作表处于混乱状态。可能在他进行故障排除期间,幕后的参考文献可能已更改。至于他的代码,似乎没有任何理由可以证明他的原始代码与修改后的代码有什么不同。

希望这会有所帮助。

答案 1 :(得分:0)

如果要将用户窗体的属性更改为Show窗体的代码的一部分,则需要在运行时进行更改。我认为您的代码混合了对保存的表单设计的设计进行更改,并对表单的当前实例进行了更改。

下面的代码将userform作为对象处理。新文本框将添加到表单的临时实例中。

Sub Practice()
Dim hght As Single
Dim MyUserForm As testUserForm
Dim NewTextBox As Control

    Set MyUserForm = New testUserForm

    hght = MyUserForm.Height

    With MyUserForm

        .Height = hght + 25

    End With

    Set NewTextBox = MyUserForm.Controls.Add("Forms.TextBox.1")

    With NewTextBox
        .TextAlign = fmTextAlignCenter
        .Width = 66
        .Height = 18
        .Left = 40
        .Top = hght
    End With
    MyUserForm.Show

    ' Do something with the form, user clicks Ok or close button
    Set MyUserForm = Nothing
End Sub

答案 2 :(得分:0)

我有一些工作要做。我不知道我做了什么修复它,但这里是为了其他任何在同样的事情上挣扎的人。 (注意:我对变量名做了一些更改)

Sub DesignTimeTxtBox()

Dim txtBox As Variant
Dim NameUserForm As String
Dim hght As Single

NameUserForm = "test"

Set MyUserForm = ThisWorkbook.VBProject _
    .VBComponents(NameUserForm)

hght = MyUserForm.Properties("Height") + 25
MyUserForm.Properties("Height") = hght

Set txtBox = ThisWorkbook.VBProject.VBComponents(NameUserForm).Designer.Controls.Add("Forms.TextBox.1")
With txtBox
    .Width = 66
    .Top = 133
    .Left = 42
End With
End Sub