vba excel userform.show 不工作

vba excel userform.show not working

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

这是我的主要代码:

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")
    Sheets(2).SeriesCollection(i).XValues = Sheets(i + 2).Range("$A:$A")
    Sheets(2).SeriesCollection(i).Values = Sheets(i + 2).Range("$B:$B")
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 处理程序中取出代码,并 运行 它在表单中的其他事件处理程序下。

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

由于您没有提供那么多信息,请尝试对您的代码进行以下更改。将 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")
    Sheets(2).SeriesCollection(i).XValues = Sheets(i + 2).Range("$A:$A")
    Sheets(2).SeriesCollection(i).Values = Sheets(i + 2).Range("$B:$B")
Next

End Sub

也是good practise to use Option Explicit, just please also have a look here. You might also have a look at this tutorial, especially the part to add code for cancelling形式