2017-01-27 3 views
1

У меня есть два макроса: один в Excel и один в Word. Макрос Excel вызывает макрос Word. Мой код выглядит следующим образом:Как вызвать макросы Word из Excel

Excel:

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, или как я могу повторно инициализировать эту переменную? Предпочтительно не устанавливать что-то равное приложению excel, потому что каждый раз, когда я пытаюсь сделать это, он устанавливает его равным Excel 2003, а не 2010 (хотя любые решения для этого также, конечно же, приветствуются).

Спасибо!

ответ

2

Вы не можете использовать глобальные объекты Excel из Word без явной квалификации (они просто там не существуют). В частности, это означает, что вы не можете использовать 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

Я запутался, как 'Set DT1 = wordapp.Documents.Open (WPATH) и' DT1 = ThisDocument' оказываются разные вещи - они не указывают на одно и то же? - но если это помогает, хорошо (что значит «вставить»?). И ... э-э, какой тип переменной был бы cutrange be (является ли это той переменной, которую вы подразумеваете, я должен явно объявить?)? Я действительно не знаю, как работает слово vba, поэтому ближайший я могу догадаться, это строка ... Кроме того, я подумал, что если вы включите библиотеку excel, тогда вы можете использовать такие вещи, как листы и еще много чего. Должен ли я тогда просто разрезать его и вернуть его в макрос 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 
Смежные вопросы