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

问题描述 投票:1回答:1

作为使用任何不再存在的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的最新结果的结果将是用户输入的任何内容和函数的结果。

有一个更好的方法吗?

vba excel-vba word-vba excel
1个回答
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以供模态使用。 “独裁者”应用程序代码将在这里

    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

为按钮分配标题和操作。注意从这里调用addin。

    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插件的需要。

© www.soinside.com 2019 - 2024. All rights reserved.