Access (VBA)

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

 
(Windows 10全般 : その他)
Excelの起動
投稿日時: 19/08/11 19:46:15
投稿者: gon_pe

みなさま、宜しくお願いします。
2019年1月に、Windows7→10へ、5月にoffice2010→2019へ変更しました。
officeを変えてから、ACCESSでできていた処理で、エラーが出るようになってしましました。
処理は、データベースの内容をひな型のあるExcelファイルに出力する処理です。
Excelを起動し、ファイルを格納する選択ダイアログを出力させ、ひな型のExcelファイルを起動し出力、保存です。
コードを以下に添付します。長くなりますが宜しくお願いします。
 
'Excel起動
    Call Excel_Init
 
    '出力先ディレクトリを取得する
    Call Output_Dir
    If End_Flg = True Then
        Call Excel_Close
        Exit Sub
    End If
 
 'EXCELファイルOPEN
        Call Excel_Open(FILE_NAME1) ←このモジュールでエラーとなります。
 
◆ここからがプロシージャです
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' EXCEL起動処理
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Excel_Init()
     
    On Error Resume Next
     
    Set ExObj = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then 'Excelが起動されていない
        Set ExObj = CreateObject("Excel.Application")
        ExObj.Visible = True
    End If
     
    On Error GoTo 0
     
End Sub
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 出力先ディレクトリ取得処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Output_Dir()
 
'「フォルダを選択する」ダイアログボックスを開いてフォルダパスを取得する
'(参照ダイアログボックス使用)
 
    Dim objFileDialog As Object 'FileDialog
    Dim stTitle As String 'タイトル
    Dim stInitialFileName As String '初期フォルダパス
     
    Const msoFileDialogFolderPicker = 4 'フォルダの参照
     
    stTitle = "フォルダ参照" '★
    stInitialFileName = "D:\" '★
     
    Set objFileDialog = _
        Application.FileDialog(msoFileDialogFolderPicker)
 
    With objFileDialog
        'ダイアログボックスのタイトル
        .Title = stTitle
        '初期フォルダパス
        .InitialFileName = stInitialFileName
         
        If .Show = False Then
            'キャンセル時
            End_Flg = True
            GoTo Exit_SUB
        Else
            stPath = .SelectedItems(1)
        End If
         
    End With
     
Exit_SUB:
    Set objFileDialog = Nothing
 
End Sub
 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' EXCELファイルOPEN処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Excel_Open(File_name As String)
     
    Dim FILE_PATH As Variant
 
    FILE_PATH = CurrentProject.Path
    ExObj.Workbooks.Open FileName:=FILE_PATH & "\" & File_name
              
End Sub
 
 
赤文字の箇所で以下のエラーとなります。
 「実行時エラー‘91
  オブジェクト変数またはWithブロック変数が設定されていません。」
又、デバックモードで追うと、最初のEXCEL起動処理(Sub Excel_Init())でエラーになっています。
これらのコードは、知人から頂いたものをそのまま使っており、職場や環境が変わっており
自分で解決、解明ががつきません。
丸投げのようで大変申し訳ありませんが、どうか宜しくお願い致します。
丸投げに

回答
投稿日時: 19/08/11 20:17:48
投稿者: よろずや

参照設定で「参照不可」になっているものはありませか?
 
あったら、とりあえず参照のチェックを外してみましょう。
そのうえで、コンパイルをしてみてください。

投稿日時: 19/08/11 21:49:37
投稿者: gon_pe

よろずや様
 早々の回答ありがとうございます。
 「参照不可」はありません。
 実は、少し前までは気になる動きはありましたが、作動していました。
 後、気になる点としては、「OneDriveにサイインしてまんせん」
 記憶が確かではありませんが、そんなメッセージが毎回出てます。
 

投稿日時: 19/08/15 18:52:49
投稿者: gon_pe

回答を頂けないのは、質問内容に不明点や、不備がありますでしょうか?
コメントを頂けますとありがたいです。

回答
投稿日時: 19/08/17 12:24:54
投稿者: よろずや

コンパイルエラーが出ないのであれば、
コードに問題がある様には見えません。
 
OneDrive に関する情報は持っていません。
 
他の識者の回答をお待ちください。

回答
投稿日時: 19/08/18 01:03:56
投稿者: MMYS

 
下記の構文は理解してますか。
・On Error Resume Next
・GetObject
・CreateObject
 
特にOn Error GoTo 0 の記述位置に疑問です。
たとえばCreateObjectでエラーが発生したとき、
つまり、Excelが起動出来ないとき、
このプログラムだと、どこでエラーが出ますか。
 

投稿日時: 19/08/18 15:04:11
投稿者: gon_pe

MMYS 様
 
 コメントありがとうございます。
 ご指摘の通り、友人から提供されたまま、理解せずに使っていました。
 まず、
 ・On Error Resume Next は、「エラーを無視して次のステートメントから実行する」
 ・GetObject は、「ファイルから ActiveX オブジェクトにアクセスして、そのオブジェクトをオブジェク          ト変数に割り当てるために使用されます。」
 ・CreateObject  は、「オートメーションをサポートするアプリケーションはすべて、1 つ以上の型のオ            ブジェクトを提供します。 たとえば、ワード プロセッシング アプリケーション            では、アプリケーション オブジェクト、文書オブジェクト、ツール バー オブ             ジェクトが提供されます。」
 
 GetObject、CreateObjectはAccessのヘルプを参照しましたが、私の知識では
 理解が難しいです。但し、GetObjectの「!注意」という個所に、 
 !注意
 GetObject 関数は、オブジェクトの現在のインスタンスがある場合、または既にファイルが読み込まれた
 状態でオブジェクトを作成する場合に使用します。 現在のインスタンスがなく、ファイルが読み込まれ
 た状態でオブジェクトを起動しない場合は、CreateObject 関数を使用します。
 
 とありました。
 又、持っているVBAの参考書では、
  GetObjectは 「Excelのワークシートからデータを取得する」で使用例があり
  CreateObjectは 「Excelのワークシートにデータを出力する場合」で使用例があります。
 
 On Error GoTo 0 もご指摘のように「On Error Resume Next」と役割的には重なっており、
 記述ヶ所もここでは意味がありません。これは削除ですね。
 
 取り留めのない返事になってしまいましたが、続きのご指導を頂けますでようか。
  

投稿日時: 19/08/18 21:41:54
投稿者: gon_pe

MMYS 様
 
 >このプログラムだと、どこでエラーが出ますか。
 は、多分、エラーが出ても、どこでもひろえません。
 スルーしてしまう、と思います。

回答
投稿日時: 19/08/19 00:16:33
投稿者: MMYS

下記をAccsessからステップ実行したとき、
Excelは起動しますか。
 

Sub Text()
    Dim ExObj As Object
    Set ExObj = CreateObject("Excel.Application")
    ExObj.Visible = True
    Stop
    Set ExObj = Nothing
End Sub

投稿日時: 19/08/20 23:34:23
投稿者: gon_pe

MMYS 様
 
Sub Text()
    Dim ExObj As Object
    Set ExObj = CreateObject("Excel.Application")
  ↑この後Exobjに「Microsoft Excel」が入りました
 
    ExObj.Visible = True
    ↑この後、タスクバーにExcelが表示され起動しました
Stop
    Set ExObj = Nothing
    ↑この後、タスクバーよりExcelが消えました。
 
End Sub
 
教えて頂いたコードを、既存の
 'Excel起動
    Call Excel_Init
の前に入れてみた所、 Excel_InitでもタスクバーにExcelが表示され起動し、
その後の処理が正常に終了しました。
 
このプログラムは無知な私がアレコレ切り貼りした為、無駄な処理が多いです。
今少し、今回の箇所に関してアドバイスが頂けますよう、宜しくお願い致します。

回答
投稿日時: 19/08/21 10:48:43
投稿者: WinArrow
投稿者のウェブサイトに移動

横から失礼します。
 
>ExObj
という変数を、
掲示されたコードの中には宣言している箇所は見当たりませんが、
どこのどのような形で記述しているのでしょうか?

投稿日時: 19/08/21 20:02:31
投稿者: gon_pe

 WinArrow 様
 
 ご質問ありがとうございます。
 使用頻度の多い変数は、標準モジュールで宣言しています。
 ExObjは、「Public ExObj As Object」として宣言しています。
 使用頻度の多いプロシージャは「共通部品」と名付けて標準モジュールにあります。
 今回のCallされているプロシージャは全てそこにあります。
 

投稿日時: 19/08/25 10:53:35
投稿者: gon_pe

皆さまありがとうございました。
とりあえず、月末の処理に間に合いそうです。
まだ幾つか疑問点がありますので、ちょこちょこと掲示板に上げさせていただこうと思います。
その時は、又宜しくお願い致します。