【问题标题】:vba excel userform.show not workingvba excel userform.show不工作
【发布时间】:2018-04-15 14:43:47
【问题描述】:

我对VBA有点陌生,我想我对如何使用它有一个基本的了解。我的用户表单运行良好,但在我不喜欢的非常特定的条件下。只有当且仅当我首先运行主代码时,它才能绘制复选框,即使这样,它也只能在第一次运行并且不会根据工作簿中的更改进行更新。我认为这是由于需要运行公共变量,但在测试了该理论之后,问题仍然存在。谁能帮我解决这个问题?这是什么原因造成的?

这是我的主要代码:

Public Allplans As Integer

Sub Compare()

    Allplans = Sheets.Count - 2
    UF1.Show

''''Clear old series
For Each Series In Sheets(2).SeriesCollection
        Sheets(2).SeriesCollection(1).Delete
Next

''''Add new series
For i = 1 To Allplans
    Sheets(2).SeriesCollection.NewSeries
    Sheets(2).SeriesCollection(i).Name = Sheets(i + 2).Range("$A$1")
    Sheets(2).SeriesCollection(i).XValues = Sheets(i + 2).Range("$A$10:$A$23")
    Sheets(2).SeriesCollection(i).Values = Sheets(i + 2).Range("$B$10:$B$23")
Next

End Sub

这是我的用户表单:

Private Sub UF1_Initialize()

Dim i           As Integer
Dim chkBox      As MSForms.CheckBox

For i = 1 To Allplans
    Set chkBox = UF1.Frame1.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)
    chkBox.Caption = Sheets(i + 2).Name
    chkBox.Left = 10
    chkBox.Top = 5 + ((i - 1) * 20)
    chkBox.Value = True
Next

End Sub

【问题讨论】:

  • 什么是UF1_Initialize?如果这是初始化事件,则名称为 UserForm_Initialize,无论表单的名称是什么。你真的在表单的代码里面使用表单的名称:Set chkBox = UF1.Frame1.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)吗?不要那样做!你也不需要一个全局变量,但那是另一回事。最后一点:不要使用用户表单的default instance

标签: vba excel checkbox userform


【解决方案1】:

由于您没有提供太多信息,请尝试对您的代码进行以下更改。将 UF1_Initialize 重命名为 UserForm_Initializ 并在其中使用 Me 关键字

Private Sub UserForm_Initialize()

Dim i           As Integer
Dim chkBox      As MSForms.CheckBox

For i = 1 To Allplans
    Set chkBox = Me.Frame1.Controls.Add("Forms.CheckBox.1", "CheckBox" & i)
    chkBox.Caption = Sheets(i + 2).Name
    chkBox.Left = 10
    chkBox.Top = 5 + ((i - 1) * 20)
    chkBox.Value = True
Next

End Sub

也不要使用用户表单的default instance

Option Explicit

Public Allplans As Integer

Sub Compare()

Dim series
Dim i As Long

    Allplans = Sheets.Count - 2

    Dim myUF1 As New UF1
    myUF1.Show

''''Clear old series
For Each series In Sheets(2).SeriesCollection
        Sheets(2).SeriesCollection(1).Delete
Next

''''Add new series
For i = 1 To Allplans
    Sheets(2).SeriesCollection.NewSeries
    Sheets(2).SeriesCollection(i).Name = Sheets(i + 2).Range("$A$1")
    Sheets(2).SeriesCollection(i).XValues = Sheets(i + 2).Range("$A$10:$A$23")
    Sheets(2).SeriesCollection(i).Values = Sheets(i + 2).Range("$B$10:$B$23")
Next

End Sub

使用Option Explicit也是good practise,也请看看here。您还可以看看this 教程,尤其是为cancelling 表单添加代码的部分

【讨论】:

  • 好的,我回去对默认实例进行了更多研究,因为这是你提到的最令人困惑的事情。 This site 很好地为我解释了这个概念,它帮助我解决了这个问题。
【解决方案2】:

您的表单只初始化一次,因此代码只运行第一次。考虑在什么情况下你想改变表单,然后在那个时候触发你的代码。这意味着从UF1_Initialize 处理程序中取出代码并在表单中的其他事件处理程序下运行它。

您的问题中没有足够的上下文或信息来提供比这更具体的内容!

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多