こんにちは、よろしくお願いします。
Excel-vbaを使用してWord文書を開き、新しい名前で保存しています。これは実際には正常に機能しています。
ただし、新しい名前のWord文書が既に開かれていると、問題が発生します。
スクリプトを実行するためのボタンがあり、ユーザーが2回目にスクリプトを実行し、作成されたファイルを開いたままにしているとします。ユーザーはExcelで何かを変更する可能性があり、新しいWord文書があとがきのように見えるかどうかを確認したいと考えています。彼はもう一度ボタンをクリックします。テンプレートを開いて(すべての変更を行い)保存しようとしますが、既に開いているためできません。このドキュメントは、新しいファイルではなく古い名前(テンプレート)で保存される可能性があります。そのため、テンプレートファイルを上書きして破棄します(テスト中にこれを数回取得しました)。
したがって、適切なコードとより優れたエラー処理が必要です。私の最初の考えは、ファイル名の付いたドキュメントがすでに存在するかどうかを確認することです。しかし、それはその仕事を完全には行いません:
Sub CreateWordDocument()
Dim TemplName, CurrentLocation, DocumentName, Document As String
Dim WordDoc, WordApp, OutApp As Object
With table1
TemplName = table1.Range("A1").Value 'Get selected template name
CurrentLocation = Application.ActiveWorkbook.Path 'working folder
Template = CurrentLocation + "\" + TemplName
DocumentName = .Range("A2").Value
Document = CurrentLocation + "\" + DocumentName + ".docx"
'Open Word Template
On Error Resume Next 'if Word is already running
Set WordApp = GetObject("Word.Application")
If Err.Number <> 0 Then
'Launch a new instance of Word
Err.Clear
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True 'Make the application visible to the user
End If
'if document is already opened in word than close it
'if its not possible to close it - end application to prevent any damage to the template
On Error GoTo notOpen
Set WordDoc = WordApp.Documents(DocumentName + ".docx")
On Error GoTo closeError
WordDoc.Close
notOpen:
'Open the template
Set WordDoc = WordApp.Documents.Open(Filename:=Template, ReadOnly:=False) 'Open Template
'save with new name
WordDoc.SaveAs Document
closeError:
'open a message box and tell user to close and run again.
現在の段階では、「Set WordDoc = WordApp ....」からnotOpenedにジャンプします。この問題を解決する方法について何か提案はありますか?
この関数を追加します。
Public Function FileIsOpen(FullFilePath As String) As Boolean
Dim ff As Long
On Error Resume Next
ff = FreeFile()
Open FullFilePath For Input Lock Read As #ff
Close ff
FileIsOpen = (Err.Number <> 0)
On Error GoTo 0
End Function
次に、コードで使用します。
If Not FileIsOpen(DocumentName & ".docx") Then
Set WordDoc = WordApp.Documents.Open(Filename:=Template, ReadOnly:=False)
Else
'Do something else because the file is already open.
End If
ドキュメント名は、ドキュメントへのフルパスである必要があります。
他のいくつか:
Document
は文字列のみでOutApp
あり、オブジェクトです。他のすべての変数はVariants
です。
Dim TemplName, CurrentLocation, DocumentName, Document As String
Dim WordDoc, WordApp, OutApp As Object
そのはず:
Dim TemplName As String, CurrentLocation As String, DocumentName As String, Document As String
Dim WordDoc As Object, WordApp As Object, OutApp As Object
VBAは通常+
、加算と&
連結に使用します。
DocumentName + ".docx"
次のように書く方が良いでしょう
DocumentName & ".docx"
ドキュメントはの予約語ですWord
。コードが含まれているので、ここではそれほど問題にはならないはずですがExcel
、覚えておくべきことがあります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加