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

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

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

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

Q&A

解決済

1回答

2272閲覧

VBA シート名にDBを含むシートは除いて、すべてをPDF出力したい

taka-hoop

総合スコア14

VBA

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

0グッド

0クリップ

投稿2020/08/04 06:25

編集2020/08/04 09:19

先日から何度も質問させて頂いている件の続きなのですが、
PDF一括出力するシートがかなりの量あることが判明致しました。

そこでシート名にDBを含むシートは除いて、すべてをPDF出力すると言うコードにしたく以下のように書き直してみました。

VBA

1 2Sub EXCELファイルPDF化03() 'フォルダのEXCELファイルの一括変換 3 4 Dim Button, T, I, L As Integer 5 Dim OpenExcelFileName, ExcelFileName, ExcelFilePath, ExFileName As String 6 7 Application.DisplayAlerts = False '確認メッセージを無効化します。 8 9 10 Button = MsgBox("EXCEファイルの一括PDF変を行いますか?", vbYesNo + vbQuestion, "確認") 11 If Button = vbYes Then 12 13 OpenExcelFileName = Application.GetOpenFilename 'ダイアログを表示取り込むフォルダーにあるファイルを選択します。 14 15 If OpenExcelFileName <> "False" Then 16 ExcelFileName = Dir(OpenExcelFileName) '指定したファイルパスからファイル名を代入します。 17 ExcelFilePath = Replace(OpenExcelFileName, ExcelFileName, "") '指定したファイルパスを指定します。(ファイルパスからファイル名を取り除く) 18 19 MsgBox ExcelFilePath & "この選択フォルダからPDFに変換します。" 20 Else 21 MsgBox "キャンセルされました" 22 Exit Sub 'キャンセルでプログラムを終了します。 23 24 End If 25 26 ExFileName = Dir(ExcelFilePath & "*.xls?") '指定したフォルダーから一件目のEXCELファイルを指定します。 27 28 Dim WB As Workbook 29 Dim Sh As Worksheet 'シートの変数 30 Dim ArrayShName() As String 'シート名を格納する箱(配列) 31 Dim k As Long 32 33 Set WB = Workbooks(ExFileName) 34 35 '箱の初期化 36 ReDim ArrayShName(0) 37 38 For Each Sh In WB.Worksheets 39 If Not Sh.Name Like "DB*" Then 40 '配列の内容を保持したままシート名を配列に追加する 41 ReDim Preserve ArrayShName(k) 42 ArrayShName(k) = Sh.Name 43 k = k + 1 44 End If 45 Next Sh 46 '指定した名前のシートがあるか確認 47 If ArrayShName(0) = "" Then 48 49 Exit Sub 50 End If 51 'シート名を格納した配列変数を指定してSelect 52 Worksheets(ArrayShName).Select 53 54 ActiveWindow.Close '読み込んだファイルを閉じます。 55 56 ExFileName = Dir() '次のファイルを指定する。 57 58 59 60 MsgBox "PDFファイルに一括変換しました。" 61 Else 62 MsgBox "処理を中断します" 63 End If 64 65 Application.DisplayAlerts = True '確認メッセージを有効化します。 66 67End Sub 68 69

出力したいシート数は格ファイルバラバラです。
DBと○○○があったりDB2と○○○と○○○であったりDBはなくてシートがたくさんあったり等

なのでこう言ったところをみた方が良い
もっと簡単な書き方がある等なにかこの状況を打開できるヒント等頂けると本当に嬉しいです。

度々未熟な質問をさせて頂き大変恐縮ですが宜しくお願い致します。

参考記事:https://www.moug.net/tech/exvba/0040032.html
:http://luster.fem.jp/blog/2014/08/post-7.html

OS:macOS Catalina バージョン10.15.3
Excelバージョン: Microsoft Excel for Mac バージョン16.39

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

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

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

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

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

hatena19

2020/08/04 06:52

「そこで指定した複数のシートDBとDB2以外のシート全てをPDF出力すると言うコードにしたく」 これでは何をしたいのか分かりません。仕様が正確に誤解なく伝わるように書いてください。 例えば、 「シート名が DB で始まるシートのうち「DB2」というシートは除いて、すべてをPDF出力したい」 とか。
taka-hoop

2020/08/04 07:18 編集

ご指摘ありがとうございます! 伝わりにくく大変申し訳ありません。 修正完了しております。 シート名にDBを含むシートは除いて、すべてをPDF出力です。
mdj

2020/08/04 08:03

エラーについては Set WB = ExFileName → Set WB = Workbooks(ExFileName) で良いような。
taka-hoop

2020/08/04 08:17

ご返答ありがとうございます! 確かに教えて頂いたコードを記述してみたところ質問のエラー自体はなくなりました! ありがとうございます!
guest

回答1

0

ベストアンサー

えっと、この辺で一旦「PDFを」というテーマは置いておいて、
「VBAを学ぶ」ということに主眼を置いた方がいいと思います。

で、今回のテーマは、
「意図する名前のシートだけをグループ化する」
だと思います。
まずはこれができるようにならないと前に進まないでしょう。

VBA シートのグループ化

などで検索してみるとよいでしょう。
それから、
構造化という言葉も調べてみるといいと思います。
簡単に言うと「機能別にプロシーシャを分ける」
ということになります。こういう言葉でも検索して調べてみるといいでしょう。
http://home.att.ne.jp/zeta/gen/excel/c03p06.htm
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_110.html

思いついたことをだらだらと追記していくと後で読みにくくメンテナンスが
難しくなります。
今はいいですが、
半年後、メンテナンスしたくなった時に今のコードを読み返すと、
たぶん意味や処理の流れを読み解くのに困難になり、結局一から作るという羽目になると思います。

機能別にプロシージャを作り、
作った機能を組み合わせて、最終的にやりたいことを実現するように考えてみてください。

以下、今回のでーま、
「意図する名前のシートだけをグループ化する」
のサンプルです。

テスト用のブックを開いてからお試しください。

ExcelVBA

1Option Explicit 2 3Sub testメイン() 4 Dim sProm As String 5 6 'シートのグループ化 7 If シートのグループ化(Workbooks(2), "DB*") = True Then 8 sProm = "グループ化完了" 9 Else 10 sProm = "グループ化未完" 11 End If 12 13 MsgBox sProm 14End Sub 15 16'***************************************************************************** 17'指定したブック内の指定した名前以外のシートをグループ化する関数 18'第一引数 myBook:指定のワークブックオブジェクト 19'第二引数 sNotKeyWord:選択しないシート名(ワイルドカード使用可) 20'返り値:選択できるシートがあったかどうかのフラグ 21'***************************************************************************** 22Private Function シートのグループ化(ByRef myBook As Workbook, _ 23 ByVal sNotKeyWord As String) As Boolean 24 Dim ws As Worksheet 25 Dim flg As Boolean 26 27 flg = True 28 For Each ws In myBook.Worksheets 29 If ws.Name Like sNotKeyWord Then 30 ws.Select flg 31 flg = False 32 End If 33 Next 34 35 シートのグループ化 = Not flg 36End Function 37'********************************************************************************* 38

※動作確認してないので、うまく動かなかったらごめんなさいです。
(VBAに慣れても、バグのないプログラムを一発で書くのは難しいです。
デバッグの仕方もいろいろ質問して覚えましょう)

投稿2020/08/04 08:02

編集2020/08/04 08:05
mattuwan

総合スコア2163

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

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

taka-hoop

2020/08/04 08:16

ご回答ありがとうございます! そうですよね....基礎的?な部分がかなり足りていないんだなと実感致しました。 先週から業務で初めてのVBAで納期が今日まででしたのでずっと焦って作業してしまってました。 とりあえず残りVBA シートのグループ化をとことん調べてみてちょっとでも進めるよう頑張ってみます! 丁寧な解説と参考コードもとても助かりますし勉強になります!ありがとうございます! 色々触らせて頂きます! 将来的なアドバイスもありがとうございます!!
mattuwan

2020/08/04 13:11

初めてのVBAで1週間はきついです。 200時間VBAを学んだあと、 開発に2週間は動作確認も含めて欲しいかと。 書籍をチラ見した程度だと、マクロを作れば瞬時に仕事が終わると錯覚しますが、 それまでに開発にどれだけ時間がかかるかを誰もが忘れている気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問