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

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

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

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

Q&A

解決済

2回答

373閲覧

VBA ワークシート存在チェック

kkk6

総合スコア15

VBA

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

0グッド

0クリップ

投稿2019/07/28 01:21

編集2019/07/28 04:55

Sheet7のA1からA7に下記画像のようにシート名を書き、これらのシートが存在するかチェックし、存在しない場合はSheet1に結果を表示したくて、下記のようにコードを書いたのですが、本当はSheet1のA1にSheet8は存在しませんSheet1のA2にSheet9は存在しませんと表示したいのですが、下記画像のようにSheet9は存在しませんといっぱい表示されてしまいます。どのように直したらいいでしょうか

Sub 存在シートチェック Dim i As Long Dim trgsheet As String Dim ws As Worksheet Dim Row As Long Dim d As Long Row = Worksheets("Sheet7").Cells(Rows.Count, 1).End(xlUp).Row d = 0 For i = 1 To Row trgsheet = Worksheets("Sheet7").Cells(Rows.Count, 1).End(xlUp).Value For Each ws In Worksheets If ws.Name <> trgsheet Then Worksheets("Sheet1").Range("A1").Offset(d, 0) = trgsheet & "は存在しません" d = d + 1 End If Next Next i End Sub

イメージ説明
イメージ説明
イメージ説明

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

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

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

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

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

y_waiwai

2019/07/28 01:28 編集

このままではコードが見れません。 質問を編集し、<code>ボタン、出てきた’’’の枠の中にコードを貼り付けてください
tatsu99

2019/07/28 02:54

コードのおかしいところを指摘したいのですが、画像なので、こちらでコピペして、確認できません。 こちらでも、コピペして動作確認しますので、<code>ボタンをクリックして、その枠の中にコードを張り付けてください。
kkk6

2019/07/28 04:58

修正依頼ありがとうございます。 質問を編集させていただきました。
guest

回答2

0

ベストアンサー

とりあえず、修正しておきました。元のソースと見比べて、不明点があれば、再度質問してください。

VBA

1Sub 存在シートチェック() 2 3 Dim i As Long 4 Dim trgsheet As String 5 Dim ws As Worksheet 6 Dim Row As Long 7 Dim d As Long 8 9 Row = Worksheets("Sheet7").Cells(Rows.Count, 1).End(xlUp).Row 10 d = 0 11 For i = 1 To Row 12 trgsheet = Worksheets("Sheet7").Cells(i, 1).Value 13 Dim flg As Boolean 14 flg = False 15 For Each ws In Worksheets 16 If ws.Name = trgsheet Then 17 flg = True 18 Exit For 19 End If 20 Next 21 If flg = False Then 22 Worksheets("Sheet1").Range("A1").Offset(d, 0) = trgsheet & "は存在しません" 23 d = d + 1 24 End If 25 Next i 26End Sub 27

投稿2019/07/28 05:12

tatsu99

総合スコア5424

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

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

kkk6

2019/07/28 06:54

ご回答ありがとうごさいます。 助かりました。
guest

0

画像を見て判断すると、下記の部分がおかしいですね。

vba

1 '前略 2 3 For i = 1 to Row 4 trgsheet = WorkSheets("Sheet7").Cells(Rows.Count, 1).End(xlup).Value 5 6 '後略

これだと常にA列の最後の行を見ているので、trgsheetには常に"Sheet9"が代入されます。

簡単なことなのでどうしたらいいかは自分で考えてください。
(ヒント: A列の i行目を参照するように書き換える。)


追記

あと、For Each の部分も間違いですね。他の方の回答を参考にしてください。

ワークシートの存在チェックは For Each を使わない方法もありますので、おまけで紹介しておきます。

vba

1Sub 存在シートチェック() 2 Dim i As Long 3 Dim trgsheet As String 4 Dim ws As Worksheet 5 Dim Row As Long 6 Dim d As Long 7 8 Row = Worksheets("Sheet5").Cells(Rows.Count, 1).End(xlUp).Row 9 d = 0 10 For i = 1 To Row 11 trgsheet = Worksheets("Sheet5").Cells(i, 1).Value 12 On Error Resume Next 13 Set ws = Worksheets(trgsheet) 14 If Err.Number <> 0 Then 15 Worksheets("Sheet1").Range("A1").Offset(d, 0).Value = trgsheet & "は存在しません" 16 d = d + 1 17 End If 18 On Error GoTo 0 19 Next i 20End Sub

On Error Resume Nextでエラーを無視して次行へすすめる。
wsにtrgsheetシートを代入する。
もし、trgsheetシートが存在しなければエラーになる。
エラーなら Sheet1 に"存在しません"と出力する。

投稿2019/07/28 04:07

編集2019/07/28 06:32
hatena19

総合スコア33620

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

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

kkk6

2019/07/28 04:57

回答と編集指摘ありがとうございます。
kkk6

2019/07/28 06:52

回答ありがとうごさいます。 やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問