2016-06-09 2 views
-1

내 멍청한 놈을 용서해. 도움 크게 감사!InputBox를 Userform (콤보 박스)으로 교체 하시겠습니까?

목적 : 지정된 워크 시트의 Excel 통합 문서에서 시작하는 텍스트로 Microsoft Word에서 양식을 채 웁니다.

내 문제 : 해당 정보를 그려 내 결과를 내 코드에 통합하려면 워크 시트를 선택하십시오. 지금은 InputBox를 사용하고 있지만, InputBox를 UserForm으로 바꾸고 싶습니다. ComboBox는 워크 시트 이름에 대해 미리 설정 한 선택 사항입니다.

나는 선택 항목이있는 사용자 정의 폼을 만들었습니다. 내 코드를 초기화하려면 어떻게해야합니까? 그리고 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 
+0

코드에서'Box' 방법은 무엇에 항목을 추가하는 방법이다? 그것은 VBA가 내장되어 있지 않습니다. 사용자 정의 폼의 이름은 무엇입니까? 콤보 박스 (Combobox) 컨트롤의 이름은 무엇입니까? –

+0

불리는 양식은 무엇입니까? 'New '는 그것의'Show' 메소드를 호출합니다 ... 그 코드는 그 질문과 관련이 없습니다. –

답변

0

그래서 UserForm1이라는 양식을 만들었습니다.

당신은 기본 인스턴스 사용하여 모달 대화 상자로 표시 할 수 있습니다

UserForm1.Show vbModal 

을하지만 더 나은 연습 인스턴스화하는 것 그것을 대신 - 당신이 그들을 New 수 있도록 형태의 객체는 결국 있습니다 다른 클래스 모듈처럼 :

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

당신은 양식의로을 속성을 추가 할 수 있습니다 값을 표시 할 수 숨김 코드는 호출 코드를 사용할 수 있습니다

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

통화에와 InputBox 전화를 대체 할 수

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

그래서 지금이 수행하는 기능을 쓸 수 있습니다 이 GetSheetName 기능!

물론 사용자가 양식을 취소했지만이 질문의 범위를 벗어나는 경우를 처리하는 것이 좋습니다 ...이 사이트에서 이미 검색을 요청하면 발견!

+0

테스트하지 않았습니다. 어쨌든 그것은 예시입니다. 원한다면 작업 코드로 편집하십시오.이 스 니펫을 copy-pasta'd로 제공하지 않고 그대로 사용하십시오. –

+0

Excel에서 작동했는데 사과드립니다. 나는 아직도 이것을하는 이점을 보지 못한다. 그러나 내가 가진 것은 응용 프로그램이 최적화를 시도하는 방법에 대한 가정입니다. –

+0

어쨌든이 "this"는 무엇입니까? 객체 인스턴스로 작업 하시겠습니까? 양식 객체에 모델 속성을 추가 하시겠습니까? 여기서 OP에서 MVP 패턴을 던지기를 원하지 않았지만 이러한 * 모델 * 속성은 문제를 더 잘 구분하기 위해 쉽게 자체 클래스에 추출 할 수있었습니다. 어떤 부분이 모범 사례를 위반합니까? –

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

감사합니다. –

관련 문제