作为使用任何不再存在的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
的最新结果的结果将是用户输入的任何内容和函数的结果。
有一个更好的方法吗?
我执行了以下操作来实现从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以供模态使用。 “独裁者”应用程序代码将在这里
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
为按钮分配标题和操作。注意从这里调用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插件的需要。