Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
ACCESSからテキストボックスで入力した名前のWORD文書を開く
投稿日時: 22/06/18 12:35:35
投稿者: タイガー777

ACCESSから、テキストボックスの入力文字でWORD文書を保存したり開きたいのですが、
中々、ACCESSからWORDを開いたり保存したりの方法が検索できなくて、やっと
strPath = Doc.Path & "\" & Format$(Now, "yyyymmdd-hhnnss-") & Doc.Name
で今の時刻で名前を付けて保存できることが分かったのですが、、テキストボックスに入力した文字で保存したいのですが、ご教示ください。
また、
 strPath = Application.CurrentProject.Path & "\" & "〇〇○.docx"
と指定して開いてるのですが、ここもテキストボックスの入力文字で開く方法がうまくいかず困っています。
ご教授下さい。

回答
投稿日時: 22/06/19 09:23:53
投稿者: hatena
投稿者のウェブサイトに移動

テキストボックスの名前が「テキスト1」として、下記のコードで、
テキストボックスに入力した名前のファイルになると思います。
 

strPath = Application.CurrentProject.Path & "\" & Me.テキスト1.Value & ".docx"

投稿日時: 22/06/21 11:54:39
投稿者: タイガー777

お世話になります
strPath = Application.CurrentProject.Path & "\" & Me.テキスト1.Value & ".docx"
で、テキスト1で指定したWORDを起動できたのですが、Wordを保存(閉じる)時、accessで下の所でエラーとなります。
 
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)
    Dim strPath As String
  
    'テキスト1の値をファイル名の先頭に付加
    strPath = Application.CurrentProject.Path & "\" & Me.テキスト1.Value & ".docx"
 
 
よろしくお願いします

回答
投稿日時: 22/06/21 12:28:58
投稿者: hatena
投稿者のウェブサイトに移動

引用:
で、テキスト1で指定したWORDを起動できたのですが、Wordを保存(閉じる)時、accessで下の所でエラーとなります。

 
エラーメッセージはなんですか。
またエラーが発生するコードの全体を提示してください。
またエラーが出たとき、デバッグボタンを押すとどの行がハイライト表示されるかも提示してください。

投稿日時: 22/06/21 12:42:40
投稿者: タイガー777

よろしくお願いします
 
コンパイルエラー
メソッドまたはデータメンバーが見つかりません
 
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)
 
がハイライトになります。

回答
投稿日時: 22/06/21 17:52:30
投稿者: hatena
投稿者のウェブサイトに移動

Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)

 
このコードはどこに記述してあるのですか。
Accessですか、Wordですか。
 
 
とりあえず、
 
「テキスト1で指定したWORDを起動できたのですが、」ということなので、
そのコード全体を提示してもらえますか。

投稿日時: 22/06/22 09:19:29
投稿者: タイガー777

お世話になります
 
Option Compare Database
 
Option Explicit
  
' Wordオブジェクト
Private WithEvents WordApp As Word.Application
  
' Word.Documentオブジェクト
Private WordDoc As Word.Document
  
  
'------------------------------------------------------------------------------
' クラス初期化時処理
'------------------------------------------------------------------------------
Private Sub Class_Initialize()
    'word起動
    Set WordApp = CreateObject("Word.application")
End Sub
 
'------------------------------------------------------------------------------
' Word・保存前イベント処理
'------------------------------------------------------------------------------
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)
    Dim strPath As String
  
    'テキスト1の値をファイル名の先頭に付加
    strPath = Application.CurrentProject.Path & "\" & Me.テキスト1.Value & ".docx"
  
    '自分で新しいファイル名でDialogを呼出す
    With WordApp.Dialogs(wdDialogFileSaveAs)
        .Name = strPath
        .Show
    End With
  
    '通常のDialogの非表示
    Cancel = True
End Sub
 
''------------------------------------------------------------------------------
'' Word・終了前イベント処理 ★
''------------------------------------------------------------------------------
'Private Sub WordApp_DocumentBeforeClose(ByVal Doc As Word.Document, Cancel As Boolean)
' ActiveDocument.PrintPreview
'End Sub
  
  
'------------------------------------------------------------------------------
' Word・終了イベント処理
'------------------------------------------------------------------------------
Private Sub WordApp_Quit()
    'Wordオブジェクト解放
    Set WordDoc = Nothing
    Set WordApp = Nothing
End Sub
  
'******************************************************************************
' Word文書オープン処理
'******************************************************************************
' 関数名 : WordOpen()
' 引数 : P_strFileName 'Word文書ファイル名
'   : P_blnVisible '初期表示フラグ
'******************************************************************************
Public Sub WordOpen(ByVal P_strFileName As String, ByVal P_blnVisible As Boolean)
    On Error GoTo Err_WordOpen
      
    'word起動
    If WordApp Is Nothing Then
        Call Class_Initialize
    End If
      
    'ワードファイルを読み込み、文章を編集する状態にする
    Set WordDoc = WordApp.Documents.Open(P_strFileName) '編集モードで開く
      
    If P_blnVisible = True Then
        'Word文書表示処理
        Call WordDisplay
    End If
  
Exit_WordOpen:
    Exit Sub
  
Err_WordOpen:
    MsgBox Err.Description
    Resume Exit_WordOpen
End Sub
  
'******************************************************************************
' Word文書表示処理
'******************************************************************************
' 関数名 : WordDisplay()
'******************************************************************************
Public Sub WordDisplay()
    On Error GoTo Err_WordDisplay
      
    WordApp.Visible = True
    WordApp.Activate
  
Exit_WordDisplay:
    Exit Sub
  
Err_WordDisplay:
    MsgBox Err.Description
    Resume Exit_WordDisplay
End Sub
  
'******************************************************************************
' Word文書クローズ処理
'******************************************************************************
' 関数名 : WordClose()
'******************************************************************************
Public Sub WordClose()
    On Error GoTo Err_WordClose
      
    'word閉じる
    If Not WordDoc Is Nothing Then
        'ドキュメントをSAVE無しで閉じる
        WordDoc.Close False
        Set WordDoc = Nothing
          
        'Wordを閉じる
        WordApp.Quit
        Set WordApp = Nothing
    End If
      
Exit_WordClose:
    Exit Sub
  
Err_WordClose:
    MsgBox Err.Description
    Resume Exit_WordClose
End Sub
 
'******************************************************************************
' Word文書文字列置換処理
'******************************************************************************
' 関数名 : WordReplace()
' 引数 : P_vaKey() '差替KEY文字列の配列
'   : P_vaVal() '差替文字列の配列
'   : P_blnCrLfLeftAlign '左揃えフラグ
'******************************************************************************
Public Sub WordReplace(P_vaKey() As Variant, P_vaVal() As Variant, P_blnCrLfLeftAlign As Boolean)
    On Error GoTo Err_WordReplace
      
    Dim i As Integer
    For i = 0 To UBound(P_vaKey)
      
        If InStr(P_vaVal(i), vbCrLf) = 0 Or P_blnCrLfLeftAlign = False Then
            '置換文字列に改行コードが無い場合、または左揃えフラグがOFF
              
            '文字を検索、置換する
            With WordDoc.Content.Find
                .Text = P_vaKey(i)
                .Forward = True
                .Replacement.Text = Replace(CStr(P_vaVal(i)), vbCrLf, vbCr)
                .Wrap = wdFindContinue
                .MatchFuzzy = True
                .Execute Replace:=wdReplaceAll
            End With
      
        Else
         
 
            With WordApp.Selection.Find
                .Text = P_vaKey(i)
                .Execute
            End With
          
            '文字を検索、置換する
            With WordDoc.Content.Find
                .Text = P_vaKey(i)
                .Forward = True
                .Replacement.Text = ""
                .Wrap = wdFindContinue
                .MatchFuzzy = True
                .Execute Replace:=wdReplaceAll
            End With
          
            Dim arr() As String
            arr = Split(P_vaVal(i), vbCrLf)
              
            '改行で分解した文字列をカーソル位置から順次出力
            Dim ix As Integer
            For ix = 0 To UBound(arr)
                If ix > 0 Then
                    '2個目以降は改行出力
                    WordApp.Selection.TypeText vbCr
                End If
                WordApp.Selection.TypeText arr(ix)
            Next ix
        End If
    Next i
  
Exit_WordReplace:
    Exit Sub
  
Err_WordReplace:
    MsgBox Err.Description
    Resume Exit_WordReplace
End Sub
 
ですが、よろしくお願いします

回答
投稿日時: 22/06/22 14:42:20
投稿者: hatena
投稿者のウェブサイトに移動

'------------------------------------------------------------------------------
' クラス初期化時処理
'------------------------------------------------------------------------------
Private Sub Class_Initialize()

 
ということはこのコードはクラスモジュールということですか?
 
なら、
 
Me.テキスト1.Value

 
でエラーになりますね。だって、クラスにテキストボックスなんてないから。
これは、
 
Forms!フォーム名!テキスト1.Value

 
と書き換えてください。フォーム名は、テキスト1がある実際のフォーム名にしてくださいね。
 
 
 

回答
投稿日時: 22/06/22 16:05:02
投稿者: sk

hatena さんの引用:
クラスモジュール

hatena さんの引用:
Forms!フォーム名!テキスト1.Value

せっかくクラスモジュールを使用しているのに、
特定のフォームと密結合させてしまうのは
OOP の観点からすると流石にまずいのでは……。
 
タイガー777 さんの引用:
'ワードファイルを読み込み、文章を編集する状態にする
Set WordDoc = WordApp.Documents.Open(P_strFileName) '編集モードで開く

タイガー777 さんの引用:
'ドキュメントをSAVE無しで閉じる
WordDoc.Close False

タイガー777 さんの引用:
Private Sub WordApp_DocumentBeforeSave(ByVal Doc As Word.Document, SaveAsUI As Boolean, Cancel As Boolean)

・Word.Application オブジェクトの DocumentBeforeSave イベントは、
 あくまで「開いているいずれかの Word 文書が保存される前」に
 発生するイベントである。
 
・WordDoc の参照先である Word 文書を上書き保存したり、
 別の名前をつけて保存したりする命令を明示的に呼び出している箇所は、
 このクラスモジュール内のどこにも存在しない。
 
タイガー777 さんの引用:
ACCESSからWORDを開いたり保存したりの方法

WordDoc の参照先である文書を、具体的にどのような操作や
コードによって保存しようとしているのかを明らかにするのが
先決でしょう。
現時点では DocumentBeforeSave イベントで実行すべき処理だとは
思えません。

回答
投稿日時: 22/06/23 00:43:24
投稿者: hatena
投稿者のウェブサイトに移動

sk さんの引用:
せっかくクラスモジュールを使用しているのに、
特定のフォームと密結合させてしまうのは
OOP の観点からすると流石にまずいのでは……。

 
おっしゃる通りだと思います。
 
ただ、ここまでのやりとりから、はたしてこのコードを質問者さん自身が書いたものなのか、OOPについて理解できるスキルがあるのか、甚だ疑問だったので、手っ取り早い解決法を提案しました。
 
あとは、skさんにおまかせします。

回答
投稿日時: 22/06/23 11:04:12
投稿者: sk

hatena さんの引用:
ただ、ここまでのやりとりから、はたしてこのコードを
質問者さん自身が書いたものなのか、OOPについて理解できる
スキルがあるのか、甚だ疑問だったので、手っ取り早い解決法を
提案しました。

恐らく、以下のブログエントリーで紹介されている
クラスモジュールをそのまま流用しているだけではないかと。
 
VB.NET-TIPS などプログラミングについて:
https://vbnettips.blog.shinobi.jp/vba/access%20vba%20%E3%81%A7word%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%9D%E5%AD%98
https://vbnettips.blog.shinobi.jp/vba/access%20vba%20%E3%81%A7%E3%81%AEword%E5%87%A6%E7%90%86%E7%94%A8%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90
https://vbnettips.blog.shinobi.jp/vba/access%20vba%20%E3%81%A7%E3%81%AEword%E6%96%87%E6%9B%B8%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E6%A4%9C%E7%B4%A2%E3%81%A8
 
タイガー777 さんの引用:
ACCESSから、テキストボックスの入力文字でWORD文書を保存したり開きたい

1. Word アプリケーションを起動する。
 
2. 何らかの Word 文書(どこに保存されているのかは不明)を開く。
 
3. 開いた文書に対して何らかの変更(変更内容の詳細は不明)を加える。
 
4. 編集した文書に任意の名前(ここでは Access のフォーム上の
   テキストボックスに入力されたファイル名)をつけて保存する。
 
5. 保存した文書を閉じる。
 
6. Word アプリケーションを終了する。
 
という一連の処理をノンストップで実行したいのであれば、
Word アプリケーションの特定のイベントと連動させる
必要はありません。
 
手順 4 に関しては、保存したい Word.Document オブジェクトの
SaveAs2 メソッドを呼び出せば済むことですし、それを clsWord クラスの
機能として実装したいなら、保存先ファイルパスを引数として受け取って
WordDoc の SaveAs2 メソッドを実行するプロシージャを追加なされば
よろしいでしょう。

投稿日時: 22/06/23 12:01:38
投稿者: タイガー777

 DocumentBeforeSaveを削除することで保存が可能となりました。
ありがとうございます