🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

1659閲覧

【VBA】VBEを閉じた状態でマクロ実行、ファイルの読み込み後の処理で失敗する

zeze

総合スコア27

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/03/25 01:17

前提・実現したいこと

VBAでExcelファイルを開き、ファイルの指定箇所を抜き出し、CSVで保存するツールを作成しています。

VBEを開いた状態で実行ボタンを押すと、保存まで問題なく処理が終わりますが。
VBEを閉じた状態(通常)で実行ボタンを押すと、ファイル読み込み後に失敗してしまいます。

原因が分かりません、ご教授願います。

該当のソースコード

'========================= ' 発注書ファイルを読み込む '========================= Public Sub Load_File() Dim ret As Variant Dim objFSO As FileSystemObject Set objFSO = New FileSystemObject ret = Application.GetOpenFilename("エクセルファイル(*.xls*),*.xls*", , "発注書ファイルを選択", , False) 'ダイアログ起動 If ret = False Then Exit Sub End If sh_Main.Unprotect ' 現在のシートの保護を解除する sh_Main.Range("A6").Value = ret ' 取込みファイル名 sh_Main.Range("A8").Value = objFSO.GetParentFolderName(ret) ' 出力フォルダ設定 sh_Main.Protect ' 現在のシートを保護する '# オブジェクト名で発注書のシートを取得する。 Dim readBook As Workbook ' 読み込みブック Dim readSheet As Worksheet ' 読込シート Dim tmp_readSheet As Worksheet Application.DisplayAlerts = False Set readBook = Workbooks.Open(ret) ' 発注書ファイルを開く Application.DisplayAlerts = True 'If InStr(settingSheet.CodeName, CST_SETTING_SHEET_NAME) > 0 Then For Each readSheet In readBook.Worksheets 'MsgBox "OK" If InStr(readSheet.CodeName, "Sheet1") > 0 Then 'ここでfalseになっている。。 'MsgBox "OK" Set tmp_readSheet = readSheet Call Run(tmp_readSheet) End If Next readSheet ' 入力ファイルをCLOSE readBook.Close False ' 発注書ファイルを閉じる Set readSheet = Nothing Set readBook = Nothing Set objFSO = Nothing MsgBox "処理が完了しました。" End Sub

試したこと

読み込みファイルが開けたのは確認済みです。
ファイルのシートのオブジェクト名は、Sheet1になっていることは確認済みです。
If InStr(readSheet.CodeName, "Sheet1") > 0 Then で何故かFalseになります。。

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

Excel バージョン 2101
Microsoft Visual Basic for Applications 7.1

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

VBEを開いていないとCodeNameの取得ができないようですね。

検証コード

For Each readSheet In readBook.Worksheets 'MsgBox "OK" '-- ここから追加 Debug.Print "readSheet.CodeName -> " & readSheet.CodeName Debug.Print "readSheet.Name -> " & readSheet.Name '-- ここまで追加 If InStr(readSheet.CodeName, "Sheet1") > 0 Then 'ここでfalseになっている。。 'MsgBox "OK" Set tmp_readSheet = readSheet 'Call Run(tmp_readSheet) 'Runがないので、コメントアウト End If Next readSheet

VBEを開いているとイミディエイトウィンドウにCodeNameが表示されますが
VBEを閉じて実行すると空っぽになっています。
理由は調べていません。

投稿2021/03/25 01:42

sinya0320

総合スコア211

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zeze

2021/03/25 01:53

回答ありがとうございます。VBEを閉じた状態で空なことって どのように確認されましたか。VBAまだ勉強したてのため教えていただきたいです。
sinya0320

2021/03/25 02:00

`Debug.Print`を使うと、イミディエイトウィンドウに出力できます。 イミディエイトウィンドウは、VBEの表示>イミディエイトウィンドウ または、Ctrl+Gで表示できます。 VBEが開いていても閉じていても、イミディエイトウィンドウに出力してくれるので VBEを閉じる → Alt+F8でマクロ実行 → VBEを開く → イミディエイトウィンドウを見る で、確認できます。
zeze

2021/03/25 02:08

ありがとうございます。 Nameプロパティで問題なく保存されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問