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

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

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

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

マクロ

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

Q&A

解決済

1回答

1010閲覧

VBA 合致したら警告を出し、それ以外は操作を実行したい

omotti

総合スコア14

VBA

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

マクロ

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

0グッド

0クリップ

投稿2017/11/09 07:15

編集2017/11/09 07:17

###前提・実現したいこと
VBAで、既存の売上一覧表をもとに請求内訳書を作成しています。

売上一覧(シート名:データ)の、AQ列に「99」がある場合、警告を出して操作をストップさせたいです。
売上一覧の行数はその時々で増減します。
警告を閉じた後、売上一覧に修正をし、再度実行して「99」がなければ
一連の動作で請求内訳書を作成させたいです。

作成の流れは、新規ブックを作成、ひな形のシートを新規ブックにコピー
そこに、条件ごとにデータを転記します。

↓売上一覧
イメージ説明
###発生している問題・エラーメッセージ
請求内訳書を作成する一連の動きは出来ましたが、
警告を出して操作をストップさせるやり方が分かりません。

###該当のソースコード

OptionExplicit Sub 請求内訳書作成() Application.ScreenUpdating=False Const HinagataWS As String = "ひな形" Const ItiranHinaWS As String = "一覧のひな形" Const DateWS As String = "データ" Const DateMidasi As Integer = 1 'データシートの見出しの行数 Dim lastRow As Long 'ソートで使う変数 Dim UtiwakeWS As Worksheet '「内訳書」シート Dim ItiranWS As Worksheet '「一覧」シート Dim DateKiten As Range 'データシートの転記開始セル Dim AKiten As Range 'A一覧の転記先開始セル Dim BKiten As Range 'B一覧の転記先開始セル Dim i As Long Dim j As Long Dim m As Long Dim Cnt(1To4) As Long Dim c As Integer For c = 1 To 4 Cnt(c)=1 Next c '●新規ブック作成 Workbooks.Add '「一覧のひな形」シートを新規ブックにコピー This Workbook.Worksheets(ItiranHinaWS).Copybefore := ActiveWorkbook.Sheets(1) Set ItiranWS =A ctiveSheet '変数「ItiranWS」をコピーしたシートにセット ItiranWS.Name = "一覧" '「ひな形」シートを新規ブックにコピー ThisWorkbook.Worksheets(HinagataWS).Copybefore:=ActiveWorkbook.Sheets(1) Set UtiwakeWS = ActiveSheet '変数「UtiwakeWS」をコピーしたシートにセット UtiwakeWS.Name="内訳書" '不要なシートを削除 Application.DisplayAlerts=False For i = Sheets.Count To 3 Step -1 ActiveWorkbook.Sheets(i).Delete Nexti Application.DisplayAlerts=True '●転記 '元ブックのデータシートの転記開始セルを設定 Set DateKiten = ThisWorkbook.Worksheets(DateWS).Range("A8") 'Aの転記先開始セルを設定 Set AKiten = ActiveWorkbook.Worksheets("一覧").Range("A3") 'Bの転記先開始セルを設定 Set BKiten = ActiveWorkbook.Worksheets("一覧").Range("L3") 'A転記 For j = 1 To DateKiten.CurrentRegion.Rows.Count - DateMidasi If DateKiten.Cells(j,4).Value = 110000 And_ DateKiten.Cells(j,43).Value >= 1000 And DateKiten.Cells(j,43).Value < 2000Then AKiten.Cells(Cnt(1),1).Value = DateKiten.Cells(j,38).Value '売上金額 Cnt(1) = Cnt(1) + 1 ElseIf DateKiten.Cells(j,4).Value = 110000 And_ DateKiten.Cells(j,43).Value >= 5000 And DateKiten.Cells(j,43).Value < 6000 Then AKiten.Cells(Cnt(2),3).Value = DateKiten.Cells(j,38).Value '売上金額 Cnt(2) = Cnt(2) + 1 End If Next j 'B転記 For m = 1 To DateKiten.CurrentRegion.Rows.Count - DateMidasi If DateKiten.Cells(m,4).Value = 200000 And_ DateKiten.Cells(m,43).Value >= 1000 And DateKiten.Cells(m,43).Value < 2000 Then BKiten.Cells(Cnt(3),1).Value = DateKiten.Cells(m,38).Value '売上金額 Cnt(3) = Cnt(3) + 1 ElseIf DateKiten.Cells(m,4).Valu = 200000 And_ DateKiten.Cells(m,43).Value >= 5000 And DateKiten.Cells(m,43).Value < 6000 Then BKiten.Cells(Cnt(4),3).Value = DateKiten.Cells(m,38).Value '売上金額 Cnt(4) = Cnt(4) + 1 End If Next m Application.ScreenUpdating=True EndSub

(一部省略しています)

###試したこと
ループで、AQ列に99があるか確認し、
IFステートメントで、99があればメッセージボックスを出すというコードを書いてみましたが、
上手くいきませんでした。

知識不足のため、これ以上のやり方が思い浮かびませんでした。
ご教授宜しくお願い致します。

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

mdj

2017/11/09 08:33

メッセージボックスは出せているのでしょうか? 出せているのであれば、直後に「exit sub」したら良いような気がしますがいかがでしょうか。
guest

回答1

0

ベストアンサー

処理の最初の方で新規ブックを作成していますが、AQ列に値が99のセルが存在したらブックの作成もしたくないのですよね。
ですので、新規ブック作成よりも前の処理として99セルのチェックを行ってあげる必要があります。

チェック処理は、

①AQ列の最終データ行を取得する
②AQ列8行目から最終データ行の範囲で99セルを検索する
③99のセルが見つかった場合は処理を終了する

のような流れを作ればいいと思います。

①最終データ行の取得

=Cells(Rows.Count, "AQ").End(xlUp).Rowという式で最終データ行の行番号が取得できます。

解説すると、Rows.CountはそのExcelのバージョンで使用可能な最大の行番号を返すので、Cells(Rows.Count, "AQ")はAQ列の最終行のセルという意味です。
続く.End(xlUp)は、そのセルから[Ctrl+↑]操作をした時のセルを指します。
AQ列最終行のセルから[Ctrl+↑]の操作をすると、AQ列を一番下から順に探していって最初にデータが入力されているセル(つまりAQ列で一番最後にデータ入力されているセル)に移動します。
最後の.Rowでそのセルの行番号が取得されるので、Cells(Rows.Count, "AQ").End(xlUp).RowAQ列で最後にデータが入力されている行番号となるわけです。

②対象範囲を検索

対象範囲から値が一致するセルを検索するにはFind関数を利用します。

Find関数は、検索に一致するセルが見つかるとそのセルを返してくれますが、見つからなかったときはNothingを返します。
検索結果がNothingが否かで対象セルがあったかどうかが判断できるという訳です。

サンプル

AQ列に値が99のセルがあるかどうかを調べるだけの簡単なサンプルを作ってみました。

Sub test() 'AQ列の最終データの行番号を取得 Dim iLastRow As Integer iLastRow = Cells(Rows.Count, "AQ").End(xlUp).Row 'AQ列8行目~最終行の範囲を検索要の範囲に設定 Dim rngSearch As Range Set rngSearch = Range(Cells(8, "AQ"), Cells(iLastRow, "AQ")) '検索範囲で値が99のセルを検索 If Not rngSearch.Find(99) Is Nothing Then 'Nothingでない場合(99のセルが見つかった) MsgBox "見つかりました" Exit Sub Else 'Nothingの場合(99のセルが見つからなかった) MsgBox "見つかりません" End If End Sub

このようなチェック処理を新規ブック作成前に行い、結果に応じてメッセージ出力や処理の中断をすれば目的は達せられルと思いますのでがんばってみてください。

参考になれば幸いです。

投稿2017/11/09 08:33

jawa

総合スコア3013

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

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

omotti

2017/11/10 05:16

希望通りの処理ができました。 解説も丁寧にしていただき感謝です。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問