将用户表单直接放在Excel工作表上

时间:2011-05-05 22:09:58

标签: excel vba

有没有办法直接在Excel工作表上插入用户表单?

我们可以添加内置控件以及活动x控件。我不明白为什么我们不能在同一个工作簿中添加用户表单。

由于

4 个答案:

答案 0 :(得分:2)

不,我不认为这是可能的。

Userforms只是容纳ActiveX控件的容器。电子表格也是ActiveX控件容器,所以我不确定容器中容器的好处是什么。

您可以轻松地将一组单元格着色为看起来像用户窗体,并将ActiveX控件放在该范围内。这将模拟电子表格中嵌入的用户表单。您将缺少用户表单级事件以及其他一些事情。但如果你想要那些东西,你可能只是使用用户形式。

如果您想要做的事我想失踪,请告诉我。

答案 1 :(得分:1)

将其放在WorkSheet模块中 VB:

Private Sub Worksheet_Activate()     UserForm1.Show 结束子

答案 2 :(得分:1)

我意识到这是一个过时的帖子,以前可能没有此解决方案,但是您可以插入ActiveX控件元素并使用“ Microsoft Forms 2.0 Frame”来控制信息。

您还需要创建一个自定义类来处理按钮的按下,因为您不能像普通按钮一样将宏直接附加到它们上。

这是我的一个例子:

buttonEventHandler

DECLARE @array VARCHAR(100) = '1001, 3, 1003';

WITH 
    cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)), 
    cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b),
    cte_Tally (n) AS (
        SELECT TOP (LEN(@array))
            ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM
            cte_n2 a CROSS JOIN cte_n2 b
        ),
    cte_starts AS (
        SELECT 
            n = 1
        UNION ALL 
        SELECT 
            t.n + 2
        FROM
            cte_Tally t
        WHERE
            SUBSTRING(@array, t.n, 2) = ', '
        ),
    cte_split_array AS (
        SELECT 
            s.n,
            partnumber = CONVERT(INT, SUBSTRING(@array, s.n, LEAD(s.n, 1, 8002) OVER (ORDER BY s.n) - s.n - 2))
        FROM
            cte_starts s
        )
SELECT 
    partnumber = ISNULL(bd.partnumber , 0)
FROM
    cte_split_array sa
    LEFT JOIN dbo.bindata bd
        ON sa.partnumber = bd.partnumber
ORDER BY 
    sa.n;

xButton

Option Explicit

Public Sub Click(Sender As Integer)

End Sub

在Microsoft Excel对象中:thisWorkbook

Private WithEvents btn As MSForms.commandButton
Private bEventHandler As buttonEventHandler
Private b As Integer

Public Sub createObject(EventHandlerOf As MSForms.commandButton, EventHandler As buttonEventHandler, xB As Integer)
    Set btn = EventHandlerOf
    Set bEventHandler = EventHandler
    b = xB
End Sub

Private Sub btn_Click()
    If Not bEventHandler Is Nothing Then bEventHandler.Click (b)
End Sub

答案 3 :(得分:0)

您可以将MyForm.Show代码放在Workbook.Open事件上,以便在您打开文件时启动表单...我已经完成了。您甚至可以选择放置表单的位置。

你的愿望,如果可能的话(我非常肯定它不是),可以触发并发的VB代码:例如自动计算单元格和表单代码。这是一个问题,因为XL是单个VBA线程,因此不可能发生两件事。表单正在显示,它的代码正在运行,或XL应用程序正在运行并正在执行单元格/图形/等东西。