作为替代使用任何不再存在的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
的最新结果的结果将是用户输入的内容和函数的结果。
有更好的方法吗?
答案 0 :(得分:0)
我执行了以下操作来实现可从Word调用的模式Excel。它的一个缺点是它需要一个微小的Excel插件才能运行。 Excel插件的内容是两个子按钮,在按下OK
和Cancel
按钮时调用它们。这些将存储在名为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
电子表格中的OK
和Cancel
按钮。
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插件需求的建议感兴趣。