忍者ブログ

エクセルファイルに追記して保存するワードマクロ

2024年05月27日
文書番号をエクセルを使ってNAS上で管理すると、ファイルを開きっぱなしにする輩が現れてマジで困る。

前々回の記事で、読み取り専用を強要する案を出したけど、wordからexcelを呼び出して自動的に番号取得してくれたら楽だなということで作ってみた。

今どきエクセル管理なんてやってるところはないと思うけど。。。





ベースとしたのは、Wordの表をエクセルに書き出すマクロ。

wordの表をエクセルに張り付ける

Wordマクロにはエクセルオブジェクトがないので、アプリとブックを定義して、シートを指定して記述。


Dim xlApp As Object, myBook As Object
Set xlApp = CreateObject("Excel.Application")

Set myBook = xlApp.Workbooks.Open(ファイルパス) 



With myBook.sheets("01議事録")  'シート指定

     処理内容を記載
end with



今回のハマりポイントは、最終行の取得処理。
エクセルマクロで以下の記述が常套手段だけど、ワードマクロでエラーが出る。

Cells(xlApp.Rows.Count, "C").End(xlup).Row

よく考えたら、xlupってエクセルマクロで定義された定数だから、Wordマクロには定義されていないのね。

対策は以下の通り。

Cells(xlApp.Rows.Count, "C").End(-4162).Row
'定数:xlup=-4162     'https://shikumika.org/entry/word-vba-xlup

どうやらxlupの値は-4162らしい。


ひとまず目的の動作をすることを確認したけど、エクセルが編集中のときにどんなエラーが出るか、どう対策するかは今後の課題。


最後にグリップボードにファイル名を保存する処理を入れたけど、保存操作もだるいので推奨ファイル名で別名保存することにした。

そんな感じで、以下ソース。


Option Explicit
Const cnst
所属課 = "xx"
Const cnst
文書管理番号ファイル = "xxx\文書番号管理簿.xlsx"


 


Sub ◆文書番号を取得する()
    
    Dim strToday As String: strToday = Format(Now, "YYYYMMDD")      'Year(Now) & Format(Month(Now), "00") & Format(Day(Now), "00") '
    Dim strContents As String: strContents = InputBox("
本日の日付で文書番号を取得します。文書名を入力してください。", "文書名を入力", cnst所属課 & "打ち合わせ議事録_" & strToday)
    If strContents = "" Then Call errorEnd("
キャンセルしました。")
    
    '
エクセルオブジェクト
    Dim xlApp As Object, myBook As Object
    
    'Excel
が起動中かどうかを判定
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    
    'Excel
が起動していない場合にExcelを起動する
    If Err.Number <> 0 Then
        Err.Clear
        Set xlApp = CreateObject("Excel.Application")
        DoEvents
    End If
    On Error GoTo 0
    
    'xlApp.Visible = True
    Set myBook = xlApp.Workbooks.Open(cnst
文書管理番号ファイル) 'ブックを開く
    
    With myBook.sheets("11
議事録")  'シート指定
        Dim tarGyo As Long: tarGyo = .Cells(xlApp.Rows.Count, "C").End(-4162).Row + 1     '
定数:xlup=-4162     'https://shikumika.org/entry/word-vba-xlup
        .Cells(tarGyo, "C") = strContents   '
内容
        .Cells(tarGyo, "D") = Format(Now, "yyyy/mm/dd") '
作成日
        .Cells(tarGyo, "E") = 
名前(Environ("USERNAME"))   '担当者 ログインIDから取得
        Dim strRecoName As String: strRecoName = .Cells(tarGyo, "F")  '
推奨ファイル名
        
        .Activate
        .Cells(tarGyo, "C").Select  '
表示用に選択
        'Dim RC As Long: RC = MsgBox("
文書番号を取得しました。保存して終了します。", vbOKCancel)
        'If RC = vbCancel Then errorEnd ("
キャンセルしました。")
        myBook.Save
        myBook.Close
    End With
    
    'Call TextCopy(strRecoName)  '
コピー
    'MsgBox "
文書番号を取得し、以下の推奨ファイル名をクリップボードにコピーしました。" & Chr(10) & Chr(10) & strRecoName
    ActiveDocument.SaveAs2 ActiveDocument.Path & "\" & strRecoName
    
    '
オブジェクト変数の解放
    Set myBook = Nothing
    Set xlApp = Nothing
  
End Sub


 


Function 名前(ユーザ名 As String) As String
    'Dim tmpName As String
    Select Case 
ユーザ名
        Case "700001":     
名前 = "矢吹"
    Case Else
        
名前 = "登録なし" & ユーザ名
    End Select
End Function


 


'クリップボードへコピー 'https://zero0nine.com/archives/3359    を改良
Sub TextCopy(sText As String)
    With CreateObject("Forms.TextBox.1")
       .MultiLine = True
       .Text = sText             'TextBox
へコピーする文字列設定
       .SelStart = 0
       .SelLength = .TextLength
       .Copy
    End With
End Sub
Sub errorEnd(msg)
    MsgBox msg
    End
End Sub

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字