2016-06-09 12 views
-1

Verzeihen Sie meine Noob-ery. Hilfe sehr geschätzt !!!!Ersetzen einer InputBox durch eine Benutzerform (Combobox)?

Zweck des Makros: Füllen Sie Formular in Microsoft Word mit Text aus einer bestimmten Arbeitsblatt in einer Excel-Arbeitsmappe.

Mein Problem: Auswählen des Arbeitsblatts, um diese Informationen aus dem Code zu ziehen und in meinen Code zu integrieren. Eine InputBox für jetzt verwenden, aber die InputBox durch eine UserForm mit einer ComboBox ersetzen wollen, die eine voreingestellte Auswahl für Arbeitsblattnamen vorgibt (diese ändern sich nie).

Ich habe das UserForm mit den Möglichkeiten erstellt. Wie bekomme ich meinen Code, um es zu initialisieren? Und wie bekomme ich meinen Code, um das Ergebnis von der ComboBox zu verwenden?

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 
+0

Was ist das 'Box' Methode in Ihrem Code Artikel zu einer Combobox hinzufügen? Das ist kein eingebauter VBA. Wie lautet der Name Ihrer UserForm? Wie heißt das Combobox-Steuerelement? –

+0

Wie heißt das Formular? 'New' it up und rufen Sie seine' Show' Methode ... keiner dieser Code scheint relevant für die Frage. –

Antwort

0

Sie haben also ein Formular namens UserForm1 erstellt.

Sie können es als modaler Dialog angezeigt mit der Standardinstanz:

UserForm1.Show vbModal 

Aber eine bessere Praxis zu instantiate wäre es statt - Formen sind Objekte nach allem, damit Sie sie New können up wie jede andere Klasse-Modul:

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

können Sie Eigenschaften zum Formular des hinzufügen Code-behind auf Werte der anrufende Code kann aussetzen verwenden:

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

So können Sie jetzt eine Funktion schreiben, die tut dies:

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

Jetzt können Sie Ihre InputBox Anruf mit einem Aufruf ersetzen diese GetSheetName Funktion!

Natürlich wollen Sie den Fall behandeln, wo der Benutzer aus dem Formular absagt, aber das ist außerhalb des Umfangs dieser Frage, und ... es wurde bereits auf dieser Website gefragt, nur suchen und du wirst finden!

+0

Habe es nicht getestet, nein. Es ist sowieso veranschaulichend, der Punkt gilt. Bearbeiten Sie es in Arbeitscode, wenn Sie möchten, ich habe dieses Snippet nicht zur Verfügung gestellt, um kopiert und verwendet zu werden, wie es ist ... –

+0

Entschuldigung, es hat in Excel funktioniert. Ich sehe immer noch nicht den Vorteil, dies zu tun. Aber alles, was ich habe, sind Annahmen darüber, wie Anwendungen versuchen, zu optimieren. –

+0

Was ist das "das" überhaupt? Mit Objektinstanzen arbeiten? Hinzufügen von Modelleigenschaften zum Formularobjekt? Ich wollte hier kein MVP-Muster am OP werfen, aber dann könnten diese * Modell * -Eigenschaften leicht in ihre eigene Klasse extrahiert werden, um Probleme * besser zu trennen. Welcher Teil verletzt Best Practice? –

1

Ich habe Ihren Code etwas verfeinert. Dies sollte Ihnen den Einstieg erleichtern. Ich habe es überarbeitet, damit Sie leichter sehen können, was vor sich geht. Anstatt eine vorhandene Arbeitsmappe zu öffnen, erstelle ich eine neue Arbeitsmappe. Ich habe die Inputbox mit einer Fehlerbehandlung verlassen, damit Sie eine Vorstellung davon bekommen, was Sie tun sollten. Der Code jetzt direkt aus der MS Word Tabelle nach 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 

Es ist erwähnenswert, dass Sie Excel von MS Word wie dies ohne einen Verweis auf die Microsoft Excel 12.0 nicht instanziiert kann ich denken ist?

Dim objExcel As New Excel.Application 

verwenden stattdessen

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

Ich weiß, dass dies nicht ein Chat-Forum, aber ich bin offen für Meinungen und Ratschläge. Ich bin doch nur ein Hobbist.

aktualisiert hier ist, wie ein Weg

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

Sieht gut aus, danke! –