使用Excel作为Word中的模式电子表格控件?

时间:2018-02-27 17:19:04

标签: vba excel-vba word-vba excel

作为替代使用任何不再存在的Grid或Spreadsheet控件或尝试在VBA中编写自己的(糟糕和原始),我想尝试使用Excel本身作为一种GridView控件。这个想法是尝试复制一种模态对话框。我需要这个从Word工作。到目前为止,我到目前为止:

Public Function xlmat() As Variant

    Dim xl As Excel.Application: Set xl = New Excel.Application
    Dim wb As Excel.Workbook: Set wb = xl.Workbooks.Add
    Dim ws As Excel.Worksheet: Set ws = wb.Sheets(1)
    Dim r As Variant
    xl.ShowStartupDialog = False
    xl.Visible = True
    ws.Activate

    On Error GoTo islands

    While -1 <> xl.ActiveSheet.Columns.Count
        r = xl.ActiveSheet.UsedRange.Value
        Sleep 1000
        DoEvents
    Wend

islands:
    Set ws = Nothing
    Set wb = Nothing
    Set xl = Nothing
    xlmat = r

End Function

第三方控制等等。

这个想法是代码启动一个Excel实例(很多工作),然后用户将输入任何数据并关闭Excel。在循环中,代码尝试确定Excel最终死亡,由用户关闭。 xl.ActiveSheet.UsedRange.Value的最新结果的结果将是用户输入的内容和函数的结果。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我执行了以下操作来实现可从Word调用的模式Excel。它的一个缺点是它需要一个微小的Excel插件才能运行。 Excel插件的内容是两个子按钮,在按下OKCancel按钮时调用它们。这些将存储在名为Modal的模块中。

Option Explicit
Public Sub doCancel()
    Application.ActiveWorkbook.CustomDocumentProperties("rc") = 1
End Sub
Public Sub doOk()
    Application.ActiveWorkbook.CustomDocumentProperties("rc") = 2
End Sub

从Word调用模式Excel的函数如下:

Option Explicit

首先,睡眠功能

#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMs As LongPtr) ' 64 bit
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMs As Long) ' 32 bit
#End If

xlmat函数,从问题开始。最重要的是,不使用VBA错误处理。

Public Function xlmat() As String

启动Excel

    Dim xl As Excel.Application: Set xl = New Excel.Application
    Dim wb As Excel.Workbook: Set wb = xl.Workbooks.Add
    Dim ws As Excel.Worksheet: Set ws = wb.Sheets(1)
    Dim addin As Excel.addin
    Dim i As Long
    Dim j As Long
    Dim n As Long
    Dim rc As Integer
    Dim r As String
    Dim t As Variant
    Dim ec(-1 To 0) As String: ec(-1) = ",": ec(0) = ";"

准备Excel以供模态使用。 &#34;独裁&#34;应用程序代码将在这里

    xl.ScreenUpdating = False
    xl.ShowStartupDialog = False
    xl.Visible = True
    ws.Activate

电子表格中的OKCancel按钮。

    ws.Buttons.Add 500, 160, 50, 25
    ws.Buttons.Add 500, 260, 50, 25

必须加载插件本身。我称之为ExcelModal.xlam

    For i = 1 To xl.AddIns.Count
        If xl.AddIns(i).Name = "ExcelModal.xlam" Then
            xl.AddIns(i).Installed = False
            xl.AddIns(i).Installed = True
        End If
    Next i

为按钮指定字幕和操作。请注意,从这里调用插件。

    ws.Buttons(1).Caption = "Cancel"
    ws.Buttons(1).OnAction = "Modal.doCancel"

    ws.Buttons(2).Caption = "OK"
    ws.Buttons(2).OnAction = "Modal.doOk"

我本可以将这个值停放在Excel单元格上,但我更喜欢停放数据 用户无法到达的地方。

    wb.CustomDocumentProperties.Add Name:="rc", LinkToContent:=False, _
        Type:=MsoDocProperties.msoPropertyTypeNumber, Value:=0

Excel电子表格开始在这里使用

    xl.ScreenUpdating = True

此循环具有使Excel模态化的效果。其中一个按钮是 按下,wb.CustomDocumentProperties("rc")不再为零,循环退出

    While 0 = wb.CustomDocumentProperties("rc")
        Sleep 500
        DoEvents
    Wend

取决于rc的值,在按下取消时返回空字符串,或返回电子表格中任何内容的展平字符串版本。适合我。

    rc = wb.CustomDocumentProperties("rc")
    xlmat = ""
    If rc = 2 Then
        t = ws.UsedRange.Value
        For i = 1 To UBound(t, 1)
            n = UBound(t, 2)
            For j = 1 To n
                r = r & t(i, j) & ec(j <> n)
            Next j
        Next i
        xlmat = Left(r, Len(r) - 1)
    End If

关闭并清理

    wb.Close False
    xl.Quit

    Set ws = Nothing
    Set wb = Nothing
    Set xl = Nothing

End Function

我会对消除Excel插件需求的建议感兴趣。