|
▼こるぎ さん:
おはようございます。ichinoseと申します。
普段、WORD VBAの掲示板は、あまり閲覧していないのですが、気になる内容だったので
投稿しました。
時間が経ってしまったので、ご覧になってもらえないかもしれませんが・・。
>私は、コードを書き換えるために、エクスポートして、そのファイルを
>外付けHDD等に定期的に保存していますが、時々、エクスポート自体を忘れています。
>もし、その間にPCがクラッシュしたら・・・と不安です。
>そこで、コードが格納されているフォルダが分かれば教えていただけないでしょうか。
>そのフォルダごと定期的にバックアップすれば安全ですので。
以下に示すコードの仕様です。
機能:
指定されたフォルダ内にあるWordのDocファイルに含まれるモジュールを指定された
フォルダ内にエクスポートします。
エクスポートファイルは、指定されたフォルダ内に
Docファイル名(拡張子なし)+"exp"という名前のフォルダを
作成し、その中に作成します。
2度、フォルダ選択ダイアログが表示されます。
最初にエクスポート対象のWordDocumentファイルが入っているフォルダ選択
次がエクスポート先フォルダ選択です。
では、コードです。Thisdocumentのモジュールに
'==================================================================
Sub Document_Open()
Dim r_fld
Dim w_fld
Application.ActiveWindow.WindowState = wdWindowStateMinimize
AppActivate Application.Caption
r_fld = get_folder_path("一括エクスポートするWordドキュメントの存在するフォルダを選択して下さい")
If VarType(r_fld) <> vbBoolean Then
w_fld = get_folder_path("エクスポート先フォルダを選択して下さい")
If VarType(w_fld) <> vbBoolean Then
ans = MsgBox("「" & r_fld & "」に存在するワードファイルのVBAコードを「" & w_fld & "」内に作成します。" & vbLf _
& " ・ワードファイル名と同じ名前に「exp」が付いたフォルダが「" & w_fld & "」内に作成されます。" & vbLf _
& " ・このフォルダにエクスポートファイルとログファイルが作成されます", vbOKCancel)
If ans = 1 Then
WordBasic.DisableAutoMacros 1
Call export_proc(r_fld, w_fld)
WordBasic.DisableAutoMacros 0
End If
End If
End If
Application.ActiveWindow.WindowState = wdWindowStateMaximize
End Sub
'==================================================================
Sub export_proc(infld, outfld)
Dim docnm
Dim ex_doc As Document
Dim result
docnm = Dir(infld & "\*.doc")
Do While docnm <> ""
If UCase(infld & "\" & docnm) <> UCase(ThisDocument.FullName) Then
Set ex_doc = doc_open(infld & "\" & docnm)
If Not ex_doc Is Nothing Then
result = export_comp(ex_doc, outfld & "\" & Mid(ex_doc.Name, 1, Len(ex_doc.Name) - 4) & "exp")
If VarType(result) <> vbBoolean Then
Call mk_log(outfld & "\" & Mid(ex_doc.Name, 1, Len(ex_doc.Name) - 4) & "exp", ex_doc, result)
End If
Call doc_close(ex_doc)
DoEvents
End If
End If
docnm = Dir()
Loop
End Sub
'==================================================================
Sub mk_log(foldnm, ex_doc As Document, log_mes)
If open_txt(foldnm & "\" & Mid(ex_doc.Name, 1, Len(ex_doc.Name) - 4) & ".txt") = 0 Then
Call put_txt("エクスポート対象ワードファイル : " & ex_doc.FullName)
For idx = LBound(log_mes) To UBound(log_mes)
Call put_txt(log_mes(idx))
Next idx
Call close_txt
End If
End Sub
'次に標準モジュール(Module1)
'==============================================================
Function doc_open(flnm) As Document
'ドキュメントを開く
'input : flnm ---- オープンするファイルのフルパス
'output : doc_open ----- Documentオブジェクト
On Error Resume Next
Set doc_open = Nothing
Set doc_open = Documents.Open(flnm)
On Error GoTo 0
End Function
'==============================================================
Sub doc_close(doc As Document)
'ドキュメントのクローズ
On Error Resume Next
doc.Close savechanges:=False
On Error GoTo 0
End Sub
'==============================================================
Function mk_folder(foldernm) As Long
'フォルダの作成
On Error Resume Next
mk_folder = 0
MkDir foldernm
mk_folder = Err.Number
On Error GoTo 0
End Function
'==============================================================
Function get_folder_path(mes)
'フォルダ選択処理
'input : mes : 表示メッセージ
Dim fld
Set fld = CreateObject("Shell.Application").BrowseForFolder(0, mes, 2, 17)
On Error Resume Next
If Not fld Is Nothing Then
get_folder_path = fld.items.Item.Path
If Err.Number <> 0 Then
get_folder_path = False
End If
Else
get_folder_path = False
End If
Set fld = Nothing
End Function
'==============================================================
Function export_comp(docu, foldnm)
'指定されたドキュメントのモジュールをエクスポートする
'input : docu : モジュールをエクスポートするDocumentオブジェクト
' foldnm : エクスポートするフォルダ名
'output: export_comp : エクスポートのログメッセージ
' メッセージがないときは、Falseを返す
Dim stt_flg As Boolean
Dim tp As Long
Dim comp As Object
Dim exe As Boolean
Dim log_mes()
Dim retcode As Long
export_comp = False
idx = 1
On Error Resume Next
With docu.VBProject
stt_flg = True
For Each comp In .VBComponents
exe = True
tp = comp.Type
If tp = 100 Then tp = 4
If tp = 4 Then
If comp.CodeModule.CountOfLines <= 0 Then
exe = False
End If
End If
Err.Clear
If exe = True Then
If stt_flg = True Then
retcode = mk_folder(foldnm)
If retcode = 0 Or retcode = 75 Then
stt_flg = False
Else
Exit For
End If
End If
comp.Export foldnm & "\" & comp.Name & Choose(tp, ".bas", ".cls", ".frm", ".cls")
If Err.Number <> 0 Then
mes = comp.Name & ":" & Error(Err.Number)
Else
mes = comp.Name & "エクスポート完了"
End If
ReDim Preserve log_mes(1 To idx)
log_mes(idx) = mes
idx = idx + 1
End If
Next
End With
If idx > 1 Then
export_comp = log_mes()
End If
On Error GoTo 0
End Function
'標準モジュール(Module2)に
'==============================================================
Private fno As Long
'==============================================================
Function open_txt(flnm) As Long
On Error Resume Next
open_txt = 0
fno = FreeFile()
Open flnm For Output As #fno
open_txt = Err.Number
On Error GoTo 0
End Function
'==============================================================
Function put_txt(txt) As Long
On Error Resume Next
put_txt = 0
Print #fno, txt
put_txt = Err.Number
On Error GoTo 0
End Function
'==============================================================
Function close_txt()
On Error Resume Next
Close #fno
On Error GoTo 0
End Function
以上です。自動実行するようになっています。
よかったら、確認してみて下さい。
|
|