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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

5回答

10032閲覧

VBAで複数のExcelファイルを印刷するマクロについて

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2018/06/14 13:17

編集2018/07/01 23:39

前提・実現したいこと

VBAでフォームのリストボックス内にダイアログで選択したExcelファイル(複数)を表示させ。
①リストボックス内のExcelファイル(複数)をブック全体で印刷させたい。
(リストボックス内のファイルをループでアクティブにする方法orその他のやりかた)
②ファイル選択ボタン押下でダイアログボックスのカレントディレクトリを指定したい
③印刷した際に開いたファイルを開きっぱなしではなく自動で閉じるようにしたい
④リストボックス内のファイルを印刷した後にリストボックス内に選択したファイルの表示を残す方法

現在の状況

フォームのファイル選択ボタン押下でダイアログを開き、印刷したいExcelファイル(複数)を選択し、
リストボックスに選択したExcelファイル(複数)を表示させることはできましたが、
印刷ボタンでリストボックス内のExcelファイル(複数)を印刷しようとしたのですが、
複数印刷することができず、最初に選んだアクティブ(?)のExcelファイルだけが印刷できる状態です。(うまくいかなかったのでソースの記載なし)

ThisWorkBook

VBA

1Option Explicit 2 Sub Workbook_Open() 3 MainForm.Show 4End Sub

MainForm

VBA

1Option Explicit 2 'インスタンス生成 3 Dim CFileMgr As New FileMgr 4 '読み込みボタン押下時 5Private Sub btn_FileOpen_Click() 6 CFileMgr.OpenFile 7End Sub 8 '印刷ボタン押下時 9Private Sub btn_FilePrint_Click() 10 CFileMgr.OpenFile 11End Sub

GrobalDate

VBA

1Option Explicit 2'ユーザ定義型 3 Public Type FileData 4 FilePath As String 5 BookName As String 6 SheetName As String 7 End Type 8'グローバル変数定義 9Public ListInput() As FileData 'ファイルデータリスト 10Public ListIndex As Integer 'リスト内現在位置

FileMgr

VBA

1Option Explicit 2 Dim OpenFileName As Variant 'ファイル格納用 3 Dim Count As Interger 'ファイル数 4 Public isCansel As Boolean 'キャンセルフラグ 5'コンストラクタ 6 Private Sub Class_Initialize() 7 isCansel = False 8 Count = 0 9 ChDir (ThisWorkbook.Path) 10End Sub 11'ダイアログボックスから選択したファイルとパス取得 12Public Sub OpenFile() 13 Dim Target As Variant 14 Dim i As Integer 15 Dim isNew,isAddList As Boolean 16 isCansel = False 17 isAddList = False 18'選択ファイルを開いて名前を格納する 19 OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?",MultiSelect:=True) 20'ファイル選択時の処理 21 If IsArray(OpenFileName) Then 22 For Each Target In OpenFileName 23'初回時 24 If Sgn(ListInput) = 0 Then 25'リストにファイル情報を格納 26 ReDim Preserve ListInput(Count) 27 ListInput(Count).BookName = dir(Target) 28 ListInput(Count).FilePath = Target 29'カウンタ加算 30 Count = Count + 1 31'リスト追加フラグ 32 isAddList = True 33Else 34'フラグ初期化 35 isNew = True 36'重複チェック 37 For i = 0 To UBound(ListInput) 38 If ListInput(i).BookName = dir(Target) Then 39 isNew = False 40 Exit For 41 End If 42 Next i 43'新規登録 44 If isNew Then 45'リストにファイル情報を格納 46 ReDim Preserve ListInput(Count) 47 ListInput(Count).BookName = dir(Target) 48 ListInput(Count).FilePath = Target 49'カウンタ加算 50 Count = Count + 1 51’リスト追加フラグオン 52 isAddList = True 53 End If 54 End If 55 Next Target 56 Else 57'キャンセル時 58 isCansel = True 59 Exit Sub 60 End If 61'新規追加時のみリスト登録処理 62 If isAddList Then SetListInput() 63End Sub 64'リストに登録 65Private Sub SetListInput() 66 Dim i As Long 67'リストボックスクリア 68 MainForm.BookInput.Clear 69'登録 70 For i = 0 To UBound(ListInput) 71 MainForm.BookInput.AddItem ListInput(i).BookName 72Next i 73End Sub 74

よろしくお願いいたします。

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

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

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

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

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

s8_chu

2018/06/30 08:26 編集

1つ質問なのですが、これはBootstrapについての質問なのですか?
s8_chu

2018/06/30 08:40

退会しちゃうのか・・・。
guest

回答5

0

親フォルダがあり

子フォルダAフォルダ、Bフォルダ、Cフォルダ…があった際にCフォルダのファイルを除くAフォルダのファイルCフォルダのファイルを選択するのはどういった方法で選択すれば良いでしょうか?

.AllowMultiSelect = False ←ここをTrueにしたら複数選択できますので、
返り値を配列で返すように関数を変更したらいいと思います。

http://stabucky.com/wp/archives/1507
↑この辺を見て直せそうでしょうか?

投稿2018/06/20 06:11

mattuwan

総合スコア2136

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

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

0

ああああ!
一つ大事なことを書き忘れてました。

上記のコードを実行するとき、
ユーザーフォームをモーダルで表示すると、
プレビューが表示されたとき、どこも触れなくて固まったような状態になります。
この時は、タスクバーから該当ブックを閉じるようにしていただくと、
プログラムが先に進みます。

よろしくお願いします。

投稿2018/06/19 23:44

mattuwan

総合スコア2136

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

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

0

あ、サブフォルダも検索しちゃいますけど、
問題ないですかね?
あんまり難しく考えなくてもいいと思いますが。。。
一例です。

VBA

1Option Explicit 2 3'「File System Object」 を利用するので「Microsoft Scripting Runtime」を参照設定すること 4Dim mobjFSO As FileSystemObject 5 6Private Sub CommandButton1_Click() 7 Dim i As Long 8 Dim wb As Workbook 9 Dim lb As MSForms.ListBox 10 11 Set lb = Me.ListBox1 12 For i = 0 To lb.ListCount - 1 13 If lb.Selected(i) Then 14 With Workbooks.Open(lb.List(i, 0)) 15 Application.StatusBar = .Name & "印刷中" 16 'PrintOut '←①ブック全体の印刷(ブックに対してPrintOutメソッド実行) 17 .PrintPreview 18 .Close False '←③開いたブックを閉じる 19 End With 20 End If 21 Next 22 Application.StatusBar = False 23End Sub 24 25Private Sub UserForm_Initialize() 26 Dim vList() As String 27 Set mobjFSO = New FileSystemObject 28 ReDim vList(0 To 1, 0 To 5000) 29 30 With Me.ListBox1 31 If GetFileList(vList) Then 32 .List = WorksheetFunction.Transpose(vList) 33 End If 34 .ColumnCount = 2 35 .ColumnWidths = "0" 36 .MultiSelect = fmMultiSelectExtended 37 End With 38End Sub 39 40Private Function GetFileList(ByRef pList() As String, _ 41 Optional ByVal sFolderPath As String = "", _ 42 Optional ByRef ix As Long = 0) As Boolean 43 Dim oFile As File 44 Dim oFolder As Folder 45 Dim oSubFolder As Folder 46 Dim i As Long 47 Dim flg As Boolean 48 49 If Len(sFolderPath) = 0 Then 50 If GetFolderPath(sFolderPath) = False Then Exit Function 51 flg = True 52 End If 53 54 Set oFolder = mobjFSO.GetFolder(sFolderPath) 55 For Each oSubFolder In oFolder.SubFolders 56 If GetFileList(pList, oSubFolder.Path, ix) = False Then GoTo ErrH 57 Next 58 59 For Each oFile In oFolder.Files 60 If ix > UBound(pList, 2) Then GoTo ErrH 61 If mobjFSO.GetExtensionName(oFile) = "xlsx" Or _ 62 mobjFSO.GetExtensionName(oFile) = "xls" Then 63 pList(0, ix) = oFile.Path 64 pList(1, ix) = oFile.Name 65 Application.StatusBar = pList(1, ix) 66 ix = ix + 1 67 End If 68 Next 69 70 GetFileList = True 71 If flg Then 72 ReDim Preserve pList(0 To 1, 0 To ix - 1) 73 Application.StatusBar = False 74 End If 75 Exit Function 76ErrH: 77 GetFileList = False 78End Function 79 80Private Function GetFolderPath(ByRef s As String) As String 81 With Application.FileDialog(msoFileDialogFolderPicker) 82 .InitialFileName = "D:\" '←②初期表示ディレクトリ指定 83 .AllowMultiSelect = False 84 .Title = "フォルダの選択" 85 If .Show Then 86 s = .SelectedItems(1) 87 GetFolderPath = True 88 End If 89 End With 90End Function

④は特に何もしなくても選択はそのままです。

投稿2018/06/19 07:25

mattuwan

総合スコア2136

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

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

退会済みユーザー

退会済みユーザー

2018/06/20 05:56

mattuwanさん 回答ありがとうございます。 試して見ました。 親フォルダ内、または子フォルダ内のExcelファイルを選択するやり方はできました。 親フォルダがあり 子フォルダAフォルダ、Bフォルダ、Cフォルダ…があった際にCフォルダのファイルを除くAフォルダのファイルCフォルダのファイルを選択するのはどういった方法で選択すれば良いでしょうか?
guest

0

ベストアンサー

ユーザーフォームに依存するコードをクラスモジュールにする意味とか、複雑なコードにする意味が不明ですので、
カレントディレクトリの指定、リストボックスにダイアログで選択したファイル名の表示、
リストボックスに表示されているすべてのブック全体を印刷して閉じる、
というシンプルなコード例を提示しておきます。

vba

1Private Sub btn_FileOpen_Click() 2 Dim OpenFileName As Variant, Target As Variant 3 'カレントディレクトリを指定 4 ChDrive "C" 5 ChDir "C:\test" 6 7 OpenFileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", _ 8 MultiSelect:=True) 9 If IsArray(OpenFileName) Then 10 With Me.BookInput 11 .Clear 12 'リストボックスにファイル名を表示 13 For Each Target In OpenFileName 14 .AddItem Dir(Target) 15 Next Target 16 'ファイルのあるフォルダーのパスをラベルに表示 17 Me.lblPath.Caption = Replace(OpenFileName(1), .List(0, 0), "") 18 End With 19 Else 20 MsgBox "キャンセルされました" 21 End If 22 23End Sub 24 25Private Sub btn_FilePrint_Click() 26 Dim wb As Workbook 27 Dim Fn As Variant, i As Long 28 Application.ScreenUpdating = False 29 With Me.BookInput 30 For i = 0 To .ListCount - 1 31 Set wb = Workbooks.Open(Me.lblPath.Caption & .List(i, 0)) 32 wb.PrintOut 'ブック全体を印刷 33 wb.Close 34 Next 35 End With 36 Application.ScreenUpdating = True 37End Sub 38 39Private Sub UserForm_Initialize() 40 Me.lblPath.Caption = "" 41End Sub 42

投稿2018/06/15 01:13

hatena19

総合スコア33620

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

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

退会済みユーザー

退会済みユーザー

2018/06/19 03:35

hatena19さん 回答ありがとうございます。 〉ユーザーフォームに依存するコードをクラ 〉スモジュールにする意味とか、複雑なコー 〉ドにする意味が不明ですので、 ユーザーフォームに依存するコードをクラスモジュールに書いたのは、後々追加したい処理が出てきた時に分けておくと便利だと思ったからです。複雑なのは申し訳ありません特に意味はないです。 回答して頂いたコードを試して実現したいことはできたのですが一点気になることがあるのですが、ファイルを複数選択した時に違うフォルダ内のファイルも同時に選択するにはどうすれば良いのでしょうか? 例) AフォルダのA1ファイル、A2ファイル… BフォルダのB1ファイル、B2ファイル… を選択したい時 よろしくお願い致します。
guest

0

なぜか問題ないソースは掲示され、うまく動かないソースの提示がないので、
どの部分ができないのかわかりませんが、
とりあえずブックを開いて全シートを印刷して閉じるファンクションをのせておきますの、
for each とかでリストの項目を回して下記のファンクションに投げればいいのではないでしょうか。

Function allprint(itm As String) Set procworkbook = Workbooks.Open(itm) sheetscnt = procworkbook.Worksheets.Count For i = 1 To sheetscnt procworkbook.Worksheets(i).PrintOut Next i procworkbook.Close End Function

投稿2018/06/14 13:53

shinobu_osaka

総合スコア456

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

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

退会済みユーザー

退会済みユーザー

2018/06/19 03:40

shinobu_osakaさん 回答ありがとうございます。 ご指摘頂いた通りに上手くいかなかったソースも記載すれば良かったですね。 Functionを使ったやりたかがあったんですね。 勉強になります。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問