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

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

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

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

Q&A

解決済

3回答

475閲覧

VBA if文での条件分岐を行いたい

taka-hoop

総合スコア14

VBA

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

0グッド

0クリップ

投稿2020/07/30 01:55

お疲れ様です。

先日質問させて頂いた続きになるのですが

Sheet1がある時はSheet1のみをPDF出力し、Sheet1がない場合はSheet2,Sheet3,Sheet4,Sheet5,Sheet6の複数のシートを一つにして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 29 Do While ExFileName <> "" '読み込むファイルがなくなるまで繰り返す。 30 31##########今回追加したコード部分############# 32 If Worksheets = ("Sheet1") Then 33 34     Worksheets("Sheet1").ExportAsFixedFormat _ 35      Type:=xlTypePDF, _ 36      fileName:=ExcelFilePath & ExFileName, _ 37      OpenAfterPublish:=True 38    Else 39 40   Worksheets(Array("SHeet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")).Select 41    ActiveSheet.ExportAsFixedFormat _ 42    Type:=xlTypePDF, _ 43    fileName:=ExcelFilePath & ExFileName, _ 44    OpenAfterPublish:=True 45 46    End If 47########################### 48 49 ActiveWindow.Close '読み込んだファイルを閉じます。 50 51 ExFileName = Dir() '次のファイルを指定する。 52 53 Loop 54 55 MsgBox "PDFファイルに一括変換しました。" 56 Else 57 MsgBox "処理を中断します" 58 End If 59 60 Application.DisplayAlerts = True '確認メッセージを有効化します。 61 62End Sub 63 64

こちらを実行するとコンパイルエラーが出てしまいます。
If Worksheets = ("Sheet1") Then この部分でWorksheetsとSheet1が一致していればif文に入る
と思ったのですが上手く動作しません。

まだまだ検索不足かもしれないですが、ワークシートと条件が一致していればという条件分岐の書き方が知りたいです。
初歩的な質問で大変恐縮ですが、宜しくお願い致します。

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

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

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

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

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

DreamTheater

2020/07/30 02:03

文法的な誤り以前に、Sheet2~Sheet6はいかなる場合も存在するのですか?
taka-hoop

2020/07/30 02:10 編集

ご回答ありがとうございます。 Sheet1が存在する箇所には存在しないです。
mako1972

2020/07/30 02:20 編集

worksheet名をindex番号で取得するのか、名前で取得するのかぶれていませんか?? シート名を取得する場合は sub test() dim myname as string myname=ActiveSheet.Name if myname="sheet1" then XX endif end sub とかの記述のようなものが必要な気がします。
DreamTheater

2020/07/30 02:20

質問を変更します。 Sheet1が存在しない場合、Sheet2~Sheet6は必ず存在するのですね? 質問の意図は、Sheet2~Sheet6がオンコーディング(ハードコーディング)で決め打ちされているからです。 Sheet1とSheet6が存在しない状態で実行すれば、当然エラーとなるので。
taka-hoop

2020/07/30 02:35

返答ありがとうございます! はい、Sheet1が存在しない場合、Sheet2~Sheet6は必ず存在しております!
mako1972

2020/07/30 02:50

議論が活性化してきて、詳しい方がどんどん来ました!宜しくお願い致します。
guest

回答3

0

以下参考
Excel VBAでシートの存在有無を判定するのにループはいらない。On Errorステートメントを使おう
ブック・シートが存在するか調べる

必ずとちらかのパターンになるとは限らない(Sheetが揃っているとは限らない)なら、結局ループ処理した方が良いかと思いますが。

投稿2020/07/30 02:08

編集2020/07/30 02:27
sazi

総合スコア25188

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

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

mako1972

2020/07/30 02:13

シート名の取得に失敗していることを教えてあげないとダメです。
taka-hoop

2020/07/30 02:14

ご回答ありがとうございます。 ありがたく拝見させて頂きます!
mako1972

2020/07/30 02:15

おっ、余計なことをいいました。申し訳ありません。
sazi

2020/07/30 02:18

@mako1972さん 質問のコメントに書かれているような事ですか? ActiveSheet前提とは限らないのではないですか? なら結局リンク先の処理のようになると思いますけど。
mako1972

2020/07/30 02:22 編集

なるほど、確かに! 少し色々まじってきたでコメント控えます。
guest

0

ベストアンサー

Sheet1の存在チェックはsaziさんの回答を参考にされれば解決できると思います。

ただ質問者さんのシート名判定方法が出鱈目すぎるので、Worksheetsを始めとする各オブジェクトの
どのメソッドなりプロパティを使用(参照)すべきかという学習が必要ですね。
ググればオブジェクトの用法くらいすぐ見つかりますから暗記しなくてもOKです。

投稿2020/07/30 02:47

DreamTheater

総合スコア1095

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

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

sazi

2020/07/30 02:56 編集

同じサンプルコードを見ても、基礎が分かっているかどうかで理解や応用に差が出ますしね。 質問者さんには、精進して欲しいところです。
taka-hoop

2020/07/30 03:00

ご返答ありがとうございます! 先日より突然業務で扱う事になり、訳がわかないまま質問してしまっていました。 そんな中丁寧にご回答頂きありがとうございました! 一旦落ち着いて基礎的な情報さらってみようと思います!
guest

0

すみません。精査はしていません。配列を入れたことで
Active.workbookの記述が抜けている気がしますが・・。

投稿2020/07/30 02:03

mako1972

総合スコア383

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

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

taka-hoop

2020/07/30 02:32

ご回答ありがとうございます! シート名取得後 以下のように書き換えると Dim Sheet As Variant Sheet = ActiveSheet.Name If Sheet = Worksheets("Sheet1") Then Worksheets("Sheet1").ExportAsFixedFormat _ Type:=xlTypePDF, _ fileName:=ExcelFilePath & ExFileName, _ OpenAfterPublish:=True Else Worksheets(Array("Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6")).Select ActiveSheet.ExportAsFixedFormat _ Type:=xlTypePDF, _ fileName:=ExcelFilePath & ExFileName, _ OpenAfterPublish:=True End If 実行エラー9のインデックスが有効範囲にないとのエラーが出ました。 これがworksheet名をindex番号で取得するのか、名前で取得するのかぶれていると言うことでしょうか?
mako1972

2020/07/30 02:47 編集

シート名を配列に しているのですからループでsheet1じゃなければなど 配列をまわさないといけないと思います。 ネットでサンプルがあると思います。
taka-hoop

2020/07/30 05:05

ご回答ありがとうございます! 実行エラー9の内容はWorkSheets("Sheet1")は見つかりませんよ のような意味だとは思ってたんですが間違いでしょうか? 配列を回すのはdo while文の中ででしょうか? 重ね重ねかつ的外れな質問でしたら申し訳ないですが、宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問