2017-01-27 1 views
1

두 매크로, Excel 및 Word에서 두 가지 매크로가 있습니다. Excel 매크로는 Word 매크로를 호출합니다. 다음과 같이 내 코드는 다음과 같습니다Excel에서 Word 매크로를 호출하는 방법

엑셀 :

Public wb1 As Workbook 
Public dt1 As Document 

Sub openword() 
Dim wpath, epath As String  'where the word document will be opened and where the excel sheet will be saved 
Dim wordapp As Object   'preparing to open word 
Set wb1 = ThisWorkbook 

While wb1.Sheets.Count <> 1 
    wb1.Sheets(2).Delete 
Wend 

wpath = "C:\users\GPerry\Desktop\Projects and Work\document.docm" 
Set wordapp = CreateObject("Word.Application") 
'Set wordapp = CreateObject(Shell("C:\Program Files (x86)\Microsoft Office\Office14\WINWORD", vbNormalFocus)) this is one I tried to make work because while word.application seems to work, I don't *understand* it, so if anyone can help, that'd be awesome 
wordapp.Visible = True 
Set dt1 = wordapp.Documents.Open(wpath) 
wordapp.Run "divider", wb1, dt1 
dt1.Close 
wordapp.Quit 
End Sub 

그리고 단어 :

Sub divider(wb1, dt1) 
Set dt1 = ThisDocument 
If dt1.Paragraphs.Count > 65000 Then 
    Set cutrange = dt1.Range(dt1.Paragraphs(1).Range.Start, dt1.Paragraphs(65000).Range.End) 
    If wb1.Sheets(Sheets.Count).Cells(1, 1) <> "" Then 
     wb1.Sheets.Add After:=Sheets.Count 
    End If 
Else 
    Set cutrange = dt1.Content 
    If wb1.Sheets(Sheets.Count).Cells(1, 1) <> "" Then 
     wb1.Sheets.Add After:=Sheets.Count 
    End If 
End If 
    cutrange.Cut Destination:=wb1.Sheets(wb1.Sheets(Sheets.Count)).Cells(1, 1) 
    wb1.Sheets(Sheets.Count).Cells(1, 1).TextToColumns Destination:=wb1.Sheets(1).Cells(1, 1) 
End Sub 

내 문제가 변수 WB1 그들 사이에서 전달 받고되지 않는 것입니다. 매크로에 보낼 변수 목록에 wb1을 넣었지만 문서에 도착하면 wb1에는 매크로 내부에 값이 없습니다. 다시 초기화 할 수는 있지만 기존 문서를 참조하는 방법을 알지 못합니다.이 문서를 열 때 해당 문서를 하나의 파일로 설정하는 방법 만 있습니다.

그래서 Word 매크로에 값을 전달하거나이 변수를 어떻게 다시 초기화합니까? 엑셀 응용 프로그램과 동등한 것을 설정하지 않고도 가능하면 시도 할 때마다 2010 년이 아니라 Excel 2003과 동일하게 설정되기 때문에 (물론 그 어떤 솔루션도 물론 환영합니다).

감사합니다.

답변

2

명시 적으로 정규화하지 않고도 Word 내부의 Excel 전역 개체를 사용할 수 없습니다 (단순히 존재하지 않음). 특히 Sheets을 사용할 수 없다는 의미입니다. 매개 변수의 변수 유형을 명시 적으로 선언해야합니다. 그렇지 않으면 Variant으로 처리됩니다. 이는 컴파일러가 Set 키워드가 필요하다는 것을 알고 있기 때문에 런타임 유형 오류를 방지하는 데 도움이되므로 참조 유형에서 중요합니다.

Sub divider(wb1 As Object, dt1 As Document) 
    Set dt1 = ThisDocument 
    If dt1.Paragraphs.Count > 65000 Then 
     Set cutrange = dt1.Range(dt1.Paragraphs(1).Range.Start, dt1.Paragraphs(65000).Range.End) 
     If wb1.Sheets(wb1.Sheets.Count).Cells(1, 1) <> "" Then 
      wb1.Sheets.Add After:=wb1.Sheets.Count 
     End If 
    Else 
     Set cutrange = dt1.Content 
     If wb1.Sheets(wb1.Sheets.Count).Cells(1, 1) <> "" Then 
      wb1.Sheets.Add After:=wb1.Sheets.Count 
     End If 
    End If 
    cutrange.Cut Destination:=wb1.Sheets(wb1.Sheets(wb1.Sheets.Count)).Cells(1, 1) 
    wb1.Sheets(wb1.Sheets.Count).Cells(1, 1).TextToColumns Destination:=wb1.Sheets(1).Cells(1, 1) 
End Sub 

주 - 당신은 또한 모든 dt1을 통과 할 필요가 없습니다. 매개 변수에서 값을 사용하지 않고 실제로 다른 값으로 설정합니다. dt1이 암시 적으로 ByRef으로 전달 되었기 때문에 내부 호출을 사용하는 경우 오류의 원인 일 수 있습니다 (Application.Run을 통해 호출 할 때 박스에 넣음). 즉, divider을 호출 할 때마다 호출 코드에서 dt1으로 전달되는 내용이 ThisDocument으로 변경됩니다. 매개 변수를 제거하거나 ByVal으로 지정해야합니다.

+0

나는에 관한 혼란 스러워요 방법'을 설정 DT1 = wordapp.Documents.Open (wpath)'와'DT1 = ThisDocument' 다른 것으로 판명 - 그들은 같은 것을 가리 키지 않는다? -하지만 도움이된다면, 알았습니다 ("박스형"을 얻는 것은 무엇을 의미합니까?). 그리고 ... 어, 어떤 종류의 변수 유형이 단정 할 것입니까? (내가 명시 적으로 선언해야하는 변수입니까?) 나는 단어 vba가 어떻게 작동하는지 정말로 모른다. 그래서 내가 추측 할 수있는 가장 가까운 것은 string이다 ... 또한, 당신이 Excel 라이브러리를 켜면 시트와 겹침 선과 같은 것들을 사용할 수 있다고 생각했다. 그냥 잘라내어 엑셀 매크로로 가져 가야할까요? –

+0

죄송합니다. (어리석은) 많은 질문이긴하지만 죄송 합니다만 이전에 vba를 사용하여 복잡한 것을 시도한 적은 한번도 없었습니다. 전에는 vba를 사용하지 않았기 때문에 약간 압도적입니다. –

+0

변수 'dt1'을 Excel에서 Word로 전달합니다. 제일 먼저 할 일은'ThisDocument'입니다. 그것은 호출 함수에서 무엇을 변경하지 않습니다. – Comintern

0

다른 SO 링크에서 빌려 왔습니다.

Sub Sample() 
    Dim wdApp As Object, newDoc As Object 
    Dim strFile As String 

    strFile = "C:\Some\Folder\MyWordDoc.dotm" 

    '~~> Establish an Word application object 
    On Error Resume Next 
    Set wdApp = GetObject(, "Word.Application") 

    If Err.Number <> 0 Then 
     Set wdApp = CreateObject("Word.Application") 
    End If 
    Err.Clear 
    On Error GoTo 0 

    wdApp.Visible = True 

    Set newDoc = wdApp.Documents.Add(strFile) 

    Call wdApp.Run("YHelloThar", "Hello") 

    ' 
    '~~> Rest of the code 
    ' 
End Sub 
관련 문제