2017-01-27 15 views
1

Excelに1つ、Wordに1つのマクロが2つあります。 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には値がありません。私はそれを再初期化しますが、すでに存在するドキュメントを参照する方法はわかりません。オープンするときにそれを1に設定する方法だけです。

どのようにWordマクロに値を渡すか、この変数をどのように再初期化しますか? Excelのアプリケーションと同等のものを設定する必要はありません。なぜなら、毎回試してみると、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がどのように動作するかを本当に知らないので、私が推測できる最も近い文字列は...また、Excelのライブラリをオンにするとシートやその他のものを使うことができると思いました。私はそれをカットして、それをExcelマクロに戻すべきですか? –

+0

申し訳ありませんが、これは(おそらく愚かな)質問がたくさんありますが、私は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 
関連する問題