質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

VBA 実行時エラー'91'の解決法(2)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,001

score 15

前提・実現したいこと

いつもありがとうございます。
VBAでエクセルの勤務表から勤務日等を抽出し、別のソフトウェアに読み込ませる転換マクロツールを作っています。
以下のVBAを実行したところ、1回目は正常に動作するのですが、2回目以降、初回に読み込んだものと違う階層のエクセルファイルを読み込もうとすると、以下のエラーメッセージが再現性ありで発生します。

発生している問題・エラーメッセージ

実行時エラー'91'
オブジェクト変数またはWithブロック変数が設定されていません。

該当のソースコード

Private Sub btnGetFilePath() 'ファイル選択ダイアログモジュール

Dim fType As Variant
Dim fPath As Variant

'選択できるファイルの種類はすべてのファイル
fType = ""

'ファイル参照ダイアログの表示
fPath = Application.GetOpenFilename(fType, , "") 'fType = fPath。

If fPath = False Then
'ダイアログでキャンセルボタンが押された場合は処理を終了します
End
End If

Dim Target As Workbook 'コンバートモジュール
Set Target = Workbooks.Open(fPath)

'これをセル抜き出しから数値抜出に変更⇔循環小数エラーの解決。
Target.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("A2")
Target.Sheets(1).Range("H2").Copy ThisWorkbook.Sheets(2).Range("A3")

End Sub

試したこと

前回質問したと同一のVBAですが、不要な記述を削除して整形しました。
今回のエラーの再現性から、"1回目にエクセルファイルを開いたときにどこかに値を取得して"しまっていて、"2回目以降、その1回目に取得したパスの値と違う"ことが"実行時エラー'91'"の原因なのではと考えました。
すると例えば、23行End Subの真上に〇〇.Clearと処理完了時に値をクリアする命令文を入れれば解決するのかと思い、該当する記述を調べましたがわかりませんでした。もしおわかりになればお願いします。

補足情報(FW/ツールのバージョンなど)

Excle2016

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • end-u

    2020/04/16 12:43

    Q1)どの行がエラーになるのでしょうか?
    Q2)
    >前回質問したと同一のVBAですが、不要な記述を削除して整形しました。
    その整形後のコードだけでエラーになりますか?
    Q3)そのコードは標準モジュールに書かれたものですか?&そのモジュールに他のプロシージャはありますか?

    キャンセル

  • r_o_234

    2020/04/16 13:10

    end-uさん
    情報追記します。

    Q1)どの行がエラーになるのでしょうか?
     21行目のTarget.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("A2")の行です。
    Q2)
    >前回質問したと同一のVBAですが、不要な記述を削除して整形しました。
    その整形後のコードだけでエラーになりますか?
     はい。この成型後のコードだけでエラーになります。
    Q3)そのコードは標準モジュールに書かれたものですか?&そのモジュールに他のプロシージャはありますか?
     このコードは標準モジュールに書かれたものです。このモジュールに他のプロシージャはありません。

    よろしくお願いします。

    キャンセル

回答 2

+1

開くファイルは読み取り専用で良いのですよね?
ちょいと↓のテストお願いします

Private Sub testmacro()
    Dim fType As Variant
    Dim fPath As Variant
    '選択できるファイルの種類はすべてのファイル★Excelファイルに限定していいんじゃ?
    fType = "Excel,*.xls*"
    'ファイル参照ダイアログの表示
    fPath = Application.GetOpenFilename(fType)
    If fPath = False Then
        'ダイアログでキャンセルボタンが押された場合は処理を終了します
        'End は使わない★
        Exit Sub
    End If

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(2)
    Application.EnableEvents = False
    Dim wb As Workbook
    Set wb = Workbooks.Open(fPath, UpdateLinks:=False, ReadOnly:=True)
    Application.EnableEvents = True
    MsgBox wb.Name
    'これをセル抜き出しから数値抜出に変更⇔循環小数エラーの解決。★コメント内容不一致?
    wb.Sheets(1).Range("G2").Copy ws.Range("A2")
    wb.Sheets(1).Range("H2").Copy ws.Range("A3")
End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/16 14:28

    end-uさん
    添削ありがとうございます。
    end-uさんのを実行した所、残念ながら実行時エラー'91'が出ました。
    上記のhatena19さんのコードで解決したので、恐らく、開いたブックを逐次閉じて、変数開放してNothingしクリアする必要があったのだと思います。
    ご協力ありがとうございました!

    キャンセル

checkベストアンサー

0

エラーの解決になるかどうかはわかりませんが、ちょっと気になったところを修正してみました。

Private Sub btnGetFilePath() 'ファイル選択ダイアログモジュール

    Dim fType As Variant
    Dim fPath As Variant

'※選択できるファイルの種類はエクセルファイルのみ
    fType = "Microsoft Excelブック,*.xls?" '※

'ファイル参照ダイアログの表示
    fPath = Application.GetOpenFilename(fType, , "") 'fType = fPath。
    Debug.Print fPath
    If fPath = False Then
'ダイアログでキャンセルボタンが押された場合は処理を終了します
       Exit Sub 'Endで強制終了はよろしくない
    End If

    Dim Target As Workbook 'コンバートモジュール
    Set Target = Workbooks.Open(fPath)

    'これをセル抜き出しから数値抜出に変更⇔循環小数エラーの解決。
    Target.Sheets(1).Range("G2").Copy ThisWorkbook.Sheets(2).Range("A2")
    Target.Sheets(1).Range("H2").Copy ThisWorkbook.Sheets(2).Range("A3")

     Target.Close '※開いたブックは閉じておく
     Set Target = Nothing '念のため、変数開放

End Sub

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/16 14:22

    hatena19さん
    修正ありがとうございます。エラー解消して動くようになりました!

    1,選択をエクセルに限定。2,Endで終了する前にExitする。3,Taget.Closeでブックを閉じる。4,変数開放する。の4点の修正を施して頂いたと思いますが、恐らく特に3,4,の修正が原因を解決したのではと思います。

    ありがとうございました!もっとVBAのレベルを高めます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る