用Userform(组合框)替换InputBox?

时间:2016-06-09 18:34:47

标签: vba combobox word-vba

原谅我的诺言。非常感谢帮助!!!!

宏的用途:使用源自指定工作表的Excel工作簿中的文本在Microsoft Word中填写表单。

我的问题:选择所说的工作表从中抽取信息并将结果集成到我的代码中。现在使用InputBox但是想用一个带有ComboBox的UserForm替换所述InputBox-给出工作表名称的预设选择(这些永远不会改变)。

我已经用选项创建了UserForm。如何让我的代码初始化它?如何让我的代码使用ComboBox的结果?

Sub Ooopsie()
Dim objExcel As New Excel.Application
Dim exWb As Excel.Workbook
Dim exSh As Excel.Worksheet
Dim strSheetName As String
Dim strDefaultText As String

strDefaultText = "sheet name here"

strSheetName = InputBox( _
Prompt:="The sheet name is?", _
Title:="Sheet Name?", _
Default:=strDefaultText _
)

If strSheetName = strDefaultText Or strSheetName = vbNullString Then Exit Sub

Set exWb = objExcel.Workbooks.Open("path to worksheet")


ActiveDocument.Tables(1).Rows(3).Cells(1).Range.Text = "Blah: " & exWb.Sheets(strSheetName).Cells(3, 3)
ActiveDocument.Tables(1).Rows(5).Cells(1).Range.Text = "blah blah : " & Chr(11) & "blah: " & exWb.Sheets(strSheetName).Cells(3, 1)
ActiveDocument.Tables(1).Rows(6).Cells(1).Range.Text = "Date de réception : " & Chr(11) & "Date Received : " & exWb.Sheets(strSheetName).Cells(3, 2)
 ActiveDocument.Tables(1).Rows(7).Cells(1).Range.Text = "blah d : " & Chr(11) & "Deadline: " & exWb.Sheets(strSheetName).Cells(3, 4)

exWb.Close

Set exWb = Nothing

End Sub

2 个答案:

答案 0 :(得分:1)

我改进了你的代码。这应该让你开始。我重新设计它,让您更容易看到发生了什么。我没有打开现有的工作簿,而是创建了一个新的工作簿。我将Inputbox留在那里并进行了一些错误处理,以便您了解应该做什么。现在代码从MS Word表到Excel。

Option Explicit

Private Sub CommandButton1_Click()
    Dim xlApp, xlWB, xlWS
    Dim strSheetName As String, strDefaultText As String
    Dim tbl As Table

    strDefaultText = "Sheet1"
    strSheetName = InputBox( _
                   Prompt:="The sheet name is?", _
                   Title:="Sheet Name?", _
                   Default:=strDefaultText)

    Set xlApp = CreateObject("Excel.Application")
    Set xlWB = xlApp.Workbooks.Add

    On Error Resume Next
    Set xlWS = xlWB.WorkSheets(strSheetName)
    If Err.Number <> 0 Then
        MsgBox "Worksheet [" & strSheetName & " Not Found", vbCritical, "Action Cancelled"
        xlWB.Close False
        xlApp.Quit
        Exit Sub
    End If
    On Error GoTo 0
    xlApp.Visible = True

    On Error Resume Next
    If ActiveDocument.Tables.Count > 0 Then
        Set tbl = ActiveDocument.Tables(1)
        xlWS.Cells(3, 3) = tbl.Rows(3).Cells(1).Range.Text
        xlWS.Cells(3, 1) = tbl.Rows(5).Cells(1).Range.Text
        xlWS.Cells(3, 2) = tbl.Rows(6).Cells(1).Range.Text
        xlWS.Cells(3, 4) = tbl.Rows(7).Cells(1).Range.Text
    End If

    Set xlWB = Nothing
    Set xlApp = Nothing
End Sub

值得注意的是,如果不参考我认为的Microsoft Excel 12.0,你不能从MS Word中实例化Excel吗?

Dim objExcel As New Excel.Application

改为使用

Dim objExcel as Variant
Set objExcel = CreateObject("Excel.Application")

我知道这不是聊天论坛,但我愿意接受意见和建议。毕竟我只是一个爱好者。

更新这里是一种向组合框添加项目的方法

For Each xlSheet In xlWB.Worksheets
    ComboBox1.AddItem xlSheet.Name
Next

答案 1 :(得分:0)

因此,您已创建了一个名为UserForm1的表单。

您可以使用默认实例将其显示为模式对话框:

UserForm1.Show vbModal

但更好的做法是实例化而不是 - 表格毕竟是对象,所以你可以像其他任何类模块一样New

Dim view As UserForm1
Set view = New UserForm1
view.Show vbModal

您可以将属性添加到表单的代码隐藏中,以显示调用代码可以使用的值:

Public Property Get SheetName() As String
    SheetName = ComboBox1.Text
End Property

所以你现在可以编写一个执行此操作的函数:

Private Function GetSheetName() As String
    Dim view As UserForm1
    Set view = New UserForm1
    view.Show vbModal
    GetSheetName = view.SheetName
End Function

现在,您可以通过调用此InputBox函数来替换GetSheetName来电!

当然,您希望处理用户取消表单的情况,但这超出了此问题的范围,并且......已经被问到这个问题网站已经,只搜索,你会发现!