[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA Ifの使い方』(ゆう)
"メニュー"シートのA2より下にシート一覧が記載しています。
B列にフラグを立て、フラグがあるシートは新しいブックへ追加されるコードを作成しました。
B列に何もフラグが立ってないときは、メッセージボックスを出したいのですが、どのようなコードを追加したらよろしいでしょうか?
よろしくお願い致します。
Sub サンプル()
Dim i As Long Dim wb As Workbook
With ThisWorkbook.Worksheets("メニュー")
For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row If .Cells(i, "B") <> "" Then Set wb = Workbooks.Add ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy After:=wb.Sheets(Sheets.Count) End If Next i End With
Application.DisplayAlerts = False
wb.Sheets(1).Delete
Application.DisplayAlerts = True
End Sub
< 使用 Excel:unknown、使用 OS:unknown >
>wb.Sheets(1).Delete
(マナ) 2020/05/05(火) 13:43
質問とは関係ないですが、マナさんの指摘に加えて「Set wb = Workbooks.Add」がループ内にあるで、当初の目的を満たせなくなるのでは?
>B列に何もフラグが立ってないときは、メッセージボックスを出したい。
B列に何か入っているセルの数を数えて0だったらメッセージを表示とすればよいでしょう
(もこな2) 2020/05/05(火) 14:04
>wb.Sheets(1).Deleteはループの外でよいです。
私が書いた位置が間違っていました。
もこな2さん
いつもありがとうございます。
>B列に何か入っているセルの数を数えて0だったらメッセージを表示とすればよいでしょう
そのような方法があるのですね!
この方法でコード考えてみます。
(ゆう) 2020/05/05(火) 14:43
また、B列の最終行をしらべて1行目(項目行)だったら、フラグは無いという判定も可能じゃないでしょうか?
Sub 実験01()
MsgBox WorksheetFunction.CountA(Range("B2:B100")) & "個のセルにフラグがあります。"
If Cells(Rows.Count, "B").End(xlUp).Row = 1 Then MsgBox "フラグがたっているセルはありません。" End If
End Sub
>私が書いた位置が間違っていました。
マナさんの指摘しているほう"だけ"間違えたということなら、いちいち新規ブックを作ってからコピーして、新規ブックを作った時にもともとあったシートを削除するんじゃなくて、挿入先を指定せずにシートをコピーすれば同じことになりません?(前トピックで提示済み)
(もこな2) 2020/05/05(火) 16:25
>B列に何か入っているセルの数を数えて0だったらメッセージを表示とすればよいでしょう
下記コードを作成してみました。
Sub テスト()
Dim n As Long n = WorksheetFunction.CountIf(Range("B2:B1000"), "<>")
If n = "0" Then MsgBox "未入力箇所があります。" End If
End Sub
>挿入先を指定せずにシートをコピーすれば同じことになりません?
もこなさんに教えて頂いたコードに上記をどのように追加すればいいのでしょうか?
Sub ブックに追加する()
Dim i As Long Dim WB As Workbook Stop With ThisWorkbook.Worksheets("メニュー") For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row If .Cells(i, "B") <> "" Then If WB Is Nothing Then ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy Set WB = Workbooks(Workbooks.Count) Else ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy After:=WB.Worksheets(WB.Worksheets.Count) End If End If Next End With End Sub (ゆう) 2020/05/05(火) 16:38
Sub 作成()
Dim i As Long Dim WB As Workbook
Dim n As Long n = WorksheetFunction.CountIf(Range("B2:B1000"), "<>")
If n = "0" Then MsgBox "未入力箇所があります。" Exit Sub
Else
With ThisWorkbook.Worksheets("【シート一覧】") For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row If .Cells(i, "B") <> "" Then If WB Is Nothing Then ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy Set WB = Workbooks(Workbooks.Count) Else ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy After:=WB.Worksheets(WB.Worksheets.Count) End If End If
Next End With End If
End Sub
(ゆう) 2020/05/05(火) 17:38
で実行したらどうなったんですか。不具合があるんですか。
(yu) 2020/05/05(火) 18:23
思う通りに動きました。
いつも教えて頂き、ありがとうございます。
(ゆう) 2020/05/05(火) 19:05
yuさんのコメントに対するレスを拝見する限り、問題がないならそれでよいのではないかと私も思いますが、強いてツッコミをいれるとすれば。
「未入力箇所があります。」ではなく、「どのシートも指定されてません」ではないでしょうか?
インデントの位置はそれで見やすいのでしょうか?
流用されるのは結構なんですが、ステップ実行して、それぞれのコードの意味は理解されてますか? (よくわからないけど動いたのでパクリましたとかであれば、流用するのは止めていただきたいです)
(もこな2) 2020/05/06(水) 00:53
説明不足で申し訳ありません。
私の今回の目標は、フラグが立っているシートを1つのブックにコピーしていくという事でした。
このトピの最初に記載した、新規ブックを作りそのブックにコピーしていき、一番左のシートを削除するというコードはもこなさんのいう通り
>「Set wb = Workbooks.Add」がループ内にあるで、当初の目的を満たせなくなるのでは?
確かにループ内にあれば、目的を満たせません。
もこなさんの指摘で気づきました。
>挿入先を指定せずにシートをコピーすれば同じことになりません?(前トピックで提示済み)
急に流用して申し訳ありません。
(ゆう) 2020/05/06(水) 09:58
>インデントの位置はそれで見やすいのでしょうか?
まだコードを書き慣れていないので、インデックスの位置は今後気にしていくようにします。
>流用されるのは結構なんですが、ステップ実行して、それぞれのコードの意味は理解されてますか?
意味は理解できています。
まだまだ初心者なので今後VBAをもっと学んで参ります。
(ゆう) 2020/05/06(水) 10:02
つまり、複数のシートにフラグがたっている場合、バラバラにブックにされると困るんですね。
その場合、前トピックでご自身が作成されたコードでも正解にたどり着いていましたから、そちらをベースにされてもよかったと思います。
Sub 作成_改() Dim i As Long Dim wb As Workbook Dim 最終行 As Long
With ThisWorkbook.Worksheets("【シート一覧】") 最終行 = .Cells(.Rows.Count, "A").End(xlUp).Row
If 最終行 = 1 Then MsgBox "どのシートも選択されてません" Else
'▼新規ブックを用意して、フラグがたっているシートをコピー挿入する Set wb = Workbooks.Add For i = 2 To 最終行 If .Cells(i, "B") <> "" Then ThisWorkbook.Worksheets(.Cells(i, "A").Value).Copy After:=wb.Sheets(Sheets.Count) End If Next i
'▼用意した新規ブックに元からあったシートを削除する。 Application.DisplayAlerts = False ' メッセージを非表示 For i = Application.SheetsInNewWorkbook To 1 Step -1 wb.Worksheets(i).Delete Next i Application.DisplayAlerts = True ' メッセージを表示 End If End With End Sub
(もこな2) 2020/05/06(水) 14:03
コードご教授いただき、ありがとうございます。
新規ブック作成のコードでもよかったのですね。
このトピ最初に記載したコードでは
Set wb = Workbooks.Add
の位置がループ内でダメだったんですね。
まだまだ知識不足なので、もっと勉強して参ります。
いつもありがとうございます。
(ゆう) 2020/05/06(水) 16:26
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.