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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

Q&A

解決済

2回答

2898閲覧

指定したフォルダ内に存在するエクセルファイルのうち、指定したシートのみをすべて印刷したい。

onionion

総合スコア13

VBA

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

0グッド

0クリップ

投稿2018/09/07 08:17

前提・実現したいこと

excel vbaで印刷用のマクロを作成しています。
J9に印刷するフォルダのディレクトリ、
I15に印刷するシートの名前、
I17に印刷するシートの番号
を記入する場所を設けています。

J9、I15には文字列が入ります。
I17には数字が入ります。
また、スクショでは両方に記述していますが、
実際に使用する際にはI15とI17はいずれか一つのみを記入します。
イメージ説明
例えば「D:\●\Desktop\ファイル」内に存在する「01.xls」「02.xls」「03.xls」(それぞれ複数のシート持ち)のうち
①すべてのエクセル内の「ああああ」シートを印刷する場合
<準備>J9に「D:\●\Desktop\ファイル」、I15に「ああああ」を入力し、マクロを起動する。
<結果>「01.xls」「02.xls」「03.xls」の「ああああ」という名前のシートのみが印刷される。
②すべてのエクセル内のsheet1に当たるシートを印刷する場合
<準備>J9に「D:\●\Desktop\ファイル」、I17に「1」を入力し、マクロを起動する。
<結果>「01.xls」「02.xls」「03.xls」のsheet1のみが印刷される。
という動作ができるようにしたいです。

ちなみにフォルダ検索にあるフォルダマークにはファイルの場所を指定してJ9に転記するマクロが、
③の「印刷」ボタンでは下記のマクロが登録されています。

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

I15に文字を入力して動かすと
Set sheetname = Sheets(ThisWorkbook.Worksheets("印刷").Range("I15").Value)
で「型が一致しません」エラーが発生し、
無視してI17に進むと
Set sheetname = Sheet & ThisWorbook.Worksheets("印刷").Range("I17").Value
で「オブジェクトが必要です」エラーが発生します。

シートを指定しない場合は印刷できましたので、
コメント「集計先のシートを指定し、変数に入れる」
の記述に誤りがあると思うのですが。。。
知恵をお貸しいただければと思います。

該当のソースコード

Sub 印刷() '更新非表示 Application.DisplayAlerts = False 'フォルダの場所を変数に入れる Dim Folder_path As String Folder_path = Worksheets("印刷").Range("J9").Value '集計先のシートを指定し、変数に入れる Dim sheetname As Worksheet If Worksheets("印刷").Range("I15").Value <> "" Then Set sheetname = Sheets(ThisWorkbook.Worksheets("印刷").Range("I15").Value) ElseIf Worksheets("印刷").Range("I17").Value <> "" Then Set sheetname = Sheet & ThisWorbook.Worksheets("印刷").Range("I17").Value Else MsgBox "シートを選択してください" End If '集計するブックを変数に入れ、指定のシートを開く Dim Merge_book As String Merge_book = Dir(Folder_path & "*.xls*") sheetname.Select '指定したフォルダから、Excelファイルを探して開く Do Until Merge_book = "" Workbooks.Open Filename:=Folder_path & "\" & Merge_book '指定したシートを印刷 Workbooks(Merge_book).PrintOut '集計するブックを閉じる Workbooks(Merge_book).Close '次のファイルを探しに行く Merge_book = Dir() Loop '更新表示 Application.DisplayAlerts = True End Sub

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

Windows7 32bit Excel2010での環境です。

もし記述不足等ありましたら補足いたしますので、どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

sheetname変数がWorksheetで宣言されていますが混乱の元になるのでWorksheetだと分かる名前に変更することをおすすめします。

それはさておき

set sheetname = Sheets(ThisWorkbook.Worksheets("印刷").Range("I15").Value)

の箇所が「型が一致しません」のエラーに成っている件ですが、下記に変更してみてはいかがでしょうか。

set sheetname = thisWorkbook.Worksheets(ThisWorkbook.Worksheets("印刷").Range("I15").Value)

また、無視して進んだ場合に下記コードでエラーに成ったとの事ですが。

Set sheetname = Sheet & ThisWorbook.Worksheets("印刷").Range("I17").Value

sheetnameはWorksheetしか受け付けないため、エラーになります。

投稿2018/09/07 09:31

n_takapyon

総合スコア443

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

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

onionion

2018/09/10 03:07

記述を変更しましたが「オブジェクトが必要です」エラーで動かず... もう少し自分でも考えてみます。お手数をおかけしました。
guest

0

hisWorkbook.Worksheets("印刷")

の取得に失敗している可能性が考えられます。
シートの名称をコピーして貼り付け直してみてください。

もしくは下記のようにシートの指定を番号に変更してみるのも手です。

ThisWorkbook.Worksheets(1)

投稿2018/09/07 08:30

編集2018/09/07 08:34
n_takapyon

総合スコア443

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

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

onionion

2018/09/07 09:07

シート名のコピー及び番号参照を試してみましたが、改善せず。。。 Folder_path = Worksheets("印刷").Range("J9").Valueの部分は機能していると考えられるため、 ここが問題とは考えにくいです。
n_takapyon

2018/09/07 09:20 編集

すみません原因は別なようです。別解答を書きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問