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

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

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

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

Q&A

解決済

1回答

3336閲覧

[VBA]マクロをコンパクトに短くまとめたい

dokoniarukana

総合スコア31

VBA

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

0グッド

1クリップ

投稿2016/08/27 05:20

編集2016/08/27 09:30

質問内容が大きく変わったので修正です。

C列には都道府県名、I列にはURLが記入されています。
以下のコードは、
「C列に"東京"とあるがI列のURLには"tokyo"と含まれていない」
「I列のURLには"tokyo"と含まれているがC列に"東京"ではない」
ときにメッセージボックスを出すものです。

実行できているのはいいのですが、実は東京以外の都道府県もあります。
C列に大阪があればI列にはosakaが含まれていなければならない…という感じです。

このまま同じように書くと長すぎるのでどうにかして
短くまとめられないでしょうか?
Sheet2にURLと都道府県をまとめたリストはあります。

Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long For i = 6 To Worksheets("Sheet1").Range("C" & Cells.Rows.count).End(xlUp).Row If Worksheets("Sheet1").Range("C" & i).Value <> "東京" And InStr(Worksheets("Sheet1").Range("I" & i), "tokyo") > 0 Then MsgBox "※もう一度確認してください。" Exit Sub End If If Worksheets("Sheet1").Range("C" & i).Value = "東京" And Worksheets("Sheet1").Range("I" & i) = "" Then Exit Sub ElseIf Worksheets("Sheet1").Range("C" & i).Value = "東京" And InStr(Worksheets("Sheet1").Range("I" & i), "tokyo") = 0 Then MsgBox "もう一度確認してください。" Exit Sub End If

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

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

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

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

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

sagume

2016/08/27 12:37 編集

例えばsheet1に、C列の値が”東京”の行が複数あるとしたら、その行のI列のURLは すべて同じURL(sheet2の”東京”の行に記載されているURL)であるべきで それ以外をエラーとしたい、とのことでしょうか。 それとも、”http://tokyo001”、"http://tokyo002”のように、 URLの一部に”tokyo”が含まれている異なる文字列が記載されている、ということでしょうか? それとも、sheet1のC列には同じ都道府県名は1回しか出てこなくて、URLは sheet2のものと同一なのでしょうか?
dokoniarukana

2016/08/28 03:00 編集

>例えばsheet1に、C列の値が”東京”の行が複数あるとしたら、その行のI列のURLは すべて同じURL(sheet2の”東京”の行に記載されているURL)であるべきで それ以外をエラーとしたい、とのことでしょうか。 ・ ・ ・ はい、その通りです。逆も然り、URLの一部にtokyoが含まれているにも関わらずその列のC列が「東京」ではない場合もエラーと表記させたいのです。加えてI列にはtokyo01やtokyo02のように一部に"tokyo"が含まれている異なる文字列が入っています。C列に都道府県が1回しか出ないというわけではありません。
guest

回答1

0

ベストアンサー

もっと良いやり方があるかとは思いますが、ひとまず以下のような感じでどうでしょうか。

VBA

1Dim i, j As Integer 2Dim Cval(2) As String 3Dim IVal(2) As String 4 5For i = 1 To 3 6Cval(i - 1) = Worksheets("Sheet2").Cells(i, 3).Value 7IVal(i - 1) = Worksheets("Sheet2").Cells(i, 4).Value 8Next 9 10For i = 1 To 10 11For j = 0 To 2 12If Worksheets("Sheet1").Cells(i, 3) = Cval(j) Then 13 If Worksheets("Sheet1").Cells(i, 9) <> IVal(j) Then 14 Debug.Print ("第" & i & "行目のデータを見直してください") 15 16End If 17End If 18Next j 19Next i

上記は、woksheet2枚目のC行、D行に(東京、tokyo)、(大阪、osaka)、(京都、kyoto)といった形で参照用のデータを入れています。
この参照データを一度Cval、Ivalにそれぞれ格納し、Worksheet1にある10行のデータをそれぞれ比較していくようにしています。
地道な方法で検索時間には時間がかかるかもしれませんが、、、。
ひとまず1次回答です。
ちなみに上記マクロで実行した結果は以下のようになります。
イメージ説明

投稿2016/08/28 02:20

編集2016/08/28 02:28
cesolution

総合スコア217

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

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

dokoniarukana

2016/08/28 03:27

説明足らずで申し訳ありません、 このマクロは今まで入力したデータからエラーを探すためではなく、 これから入力するときに間違えないように注意を促すものとなりますので マクロボタンで実行というよりシート自体にコードを書いてセルが書き換わった瞬間にチェックされるということがしたいのです。
cesolution

2016/08/28 03:39

こちらこそ原文のコードをあまりよく見ておらず失礼いたしました。 元のコードを活かすと、以下のような形でどうでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Dim i, j As Long Dim Cval(2) As String Dim IVal(2) As String For i = 1 To 3 Cval(i - 1) = Worksheets("Sheet2").Cells(i, 3).Value IVal(i - 1) = Worksheets("Sheet2").Cells(i, 4).Value Next For i = 6 To Worksheets("Sheet1").Range("C" & Cells.Rows.Count).End(xlUp).Row For j = 0 To 2 If Worksheets("Sheet1").Cells(i, 3) = Cval(j) Then If Worksheets("Sheet1").Cells(i, 9) <> IVal(j) Then MsgBox "※もう一度確認してください。" Exit Sub End If End If Next j Next i End Sub
dokoniarukana

2016/08/28 03:45

試してみました。 > Cval(i - 1) = Worksheets("Sheet2").Cells(i, 3).Value この部分にインデックスに有効な範囲が無いと言われてしまいました。 シート名、セル名、For i もオリジナルのデータに直しているのですが何故でしょう…?
cesolution

2016/08/28 03:45

追記です。tokyoはtokyo01等、tokyoを含んだ異なる文字列になることもあるということであれば、 If InStr(Worksheets("Sheet1").Cells(i, 9), IVal(j)) = 0 Then の部分は、以下のように変更してみてください。 If InStr(Worksheets("Sheet1").Cells(i, 9), IVal(j)) = 0 Then 宜しくお願いします。
cesolution

2016/08/28 03:48

Sheet2のC列に入っているデータは、何列目~何列目かと、For文のiの範囲、Cvalの部分にどのように記載したかを教えていただけますでしょうか?
cesolution

2016/08/28 03:50

すみません列と書いてしまいました。C列の何行目~何行目にデータが入っているかを教えていただけますでしょうか。
dokoniarukana

2016/08/28 03:53

たびたびすいません、 私の見間違えでして、上記のコードでうまくいけました! 本当にありがとうございました。
cesolution

2016/08/28 03:58

無事解決できたということで安心いたしました。ご連絡ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問