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

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

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

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

Q&A

解決済

3回答

9481閲覧

メッセージボックスで数えた個数を表示したい

hiro.tatsu

総合スコア10

VBA

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

0グッド

0クリップ

投稿2019/04/26 07:48

間違えた個数をカウントして、メッセージボックスで表示したいのですが
WorksheetFunction.CountIfを使用して数えたのですが、1個としか表示されません。
初心者なので、試行錯誤しても解決できません。
どうかよろしくお願いします。

For gyou = GYOU_S To GYOU_E '開始行から終了行まで
For retsu = RETSU_S To RETSU_E '開始列から終了列まで
If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then

errflg = True '同じ位置のセルの値が等しくなければ、そのセルを黄で塗りつぶす。 s1.Cells(gyou, retsu).Interior.Color = rgbYellow End If If s1.Cells(gyou, retsu).Value = s2.Cells(gyou, retsu).Value Then s1.Cells(gyou, retsu).Interior.ColorIndex = 0 End If Next

Next

If errflg = True Then

cnt = WorksheetFunction.CountIf(Range("s1"), "<>s2")

MsgBox cnt & "個未完成です"

Else

     MsgBox "完成です。"

End If

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

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

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

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

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

guest

回答3

0

欲しい結果を得るためにはいろいろな方法論があるとは思いますが、
一例を示します。

VBA

1Option Explicit 2 3Sub test() 4 Dim myFormula As String: myFormula = "=If(XXXX=YYYY,"""",NA())" '仮の数式を変数に代入 5 Dim rngOld As Range '元のデータのセル範囲 6 Dim rngNew As Range '比較するデータのセル範囲 7 Dim rngTemp As Range '一時的に数式を入れるセル範囲 8 Dim rngResult As Range '検索したセル範囲 9 Dim strAddress As String 'セル範囲のアドレスを示す文字列 10 Dim i As Long '見つけたセルの個数 11 Dim sProm As String 'メッセージボックスに表示する文字列 12 13 sProm = "完成" 14 'セル範囲を変数に取得 15 With ThisWorkbook.Worksheets 16 Set rngNew = .Item("Sheet2").UsedRange 17 strAddress = rngNew.Address 18 Set rngOld = .Item("Sheet1").Range(strAddress) 19 Set rngTemp = .Item("Sheet3").Range(strAddress) 20 End With 21 22 '数式内の仮のセルアドレスを実際のものに書き換え一時的な作業用シートに入力 23 myFormula = Replace(myFormula, "XXXX", rngNew(1).Address(False, False, , True)) 24 myFormula = Replace(myFormula, "YYYY", rngOld(1).Address(False, False, , True)) 25 rngTemp.Formula = myFormula 26 27 '検索したセルがみつからないとエラーになるので、えらーを無視する宣言 28 On Error Resume Next 29 '計算結果が、エラーのセルを検索 30 Set rngResult = rngTemp.SpecialCells(xlCellTypeFormulas, xlErrors) 31 '見つけたセルの数を数える 32 i = rngResult.CountLarge 33 '見つけたセルのアドレスを比較するデータのセルのアドレスに適用して黄色を塗る 34 rngNew.Worksheet.Range(rngResult.Address).Interior.Color = vbYellow 35 'エラーの無視を解除 36 On Error GoTo 0 37 38 If i > 0 Then sProm = i & 未入力 39 40 '一時的に入れた数式のクリア 41 rngTemp.ClearContents 42 43 MsgBox sProm 44End Sub

ポイント>>
1)操作対象は最終的にはセル範囲なのだから、変数はセル範囲を入れるものを用意
(各セル範囲はどのシートに属しているかの情報をそれぞれ持っているので、
あえて何度もシートも指定する必要はありません)
2)エクセルでは、作業用の列とか作業用のシートとかを使い、処理の途中経過を
仮に置いておくようにすると、処理の流れを考えることが容易になります。
3)折角エクセルを使っているのだから、エクセル君に出来ることはエクセル君に任せると、
コードが簡便になります。(数式や機能を大いに利用する)
4)セル範囲はRangeプロパティを使うと、文字列(セルのアドレス)でセルを指定できるので、
セル範囲のアドレスを取得して、それを流用すると上手くセル範囲が指定できると思います。

参考URL>>
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

↑を参考にコードを解読してみたり、
ステップインで1行づつ実行しながら、
シート上の様子や、ローカルウィンドウ内の変数の値の変化に注視して、
動作を確認してみてください。
あと、わからない単語・用語などが出てきたらWebで検索して、
それでも解らない場合は、再度、聞いてください。

投稿2019/04/26 12:40

mattuwan

総合スコア2136

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

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

hiro.tatsu

2019/04/29 01:49

ありがとうございます。大変参考になりました。 色々な方法があることを改めて知ることができました。
guest

0

セル一つずつ比較しているので、違った場合は、セルの色を黄色にするだけでなくて、そこでカウントしてしまえばよいのではないでしょうか?

cnt = 0 ' カウンターをリセット For gyou = GYOU_S To GYOU_E '開始行から終了行まで For retsu = RETSU_S To RETSU_E '開始列から終了列まで s1.Cells(gyou, retsu).Interior.ColorIndex = 0   'セルの色をリセット If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then '同じ位置のセルの値が等しくなければ、そのセルを黄で塗りつぶす。 s1.Cells(gyou, retsu).Interior.Color = rgbYellow cnt = cnt + 1 'カウンターに1をたす。 End If next retsu next gyou If cnt > 0 Then MsgBox cnt & "個未完成です" Else MsgBox "完成です。" End If

投稿2019/04/26 07:59

編集2019/04/26 08:01
yukioosawa

総合スコア15

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

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

hiro.tatsu

2019/04/29 01:50

ありがとうございます。とても参考になりました。 そういう方法もあるんですね。勉強になりました。
guest

0

ベストアンサー

CountIfに指定しているs1ってコード内のs1(シート)を指してます?
これでは単にセルS1を指しているだけなので、期待した結果は得られません。
そもそもCountIfでシートを丸ごと比較することは出来ません。

前回からの続きと思いますが、フラグではなくカウンターにすれば簡単です。
以下参考にしてください。

VBA

1Dim cnt As Long 2cnt = 0 3For gyou = GYOU_S To GYOU_E '開始行から終了行まで 4 For retsu = RETSU_S To RETSU_E '開始列から終了列まで 5 If s1.Cells(gyou, retsu).Value <> s2.Cells(gyou, retsu).Value Then 6 7 cnt = cnt + 1 8 9 '同じ位置のセルの値が等しくなければ、そのセルを黄で塗りつぶす。 10 s1.Cells(gyou, retsu).Interior.Color = rgbYellow 11 12 End If 13 14 If s1.Cells(gyou, retsu).Value = s2.Cells(gyou, retsu).Value Then 15 16 s1.Cells(gyou, retsu).Interior.ColorIndex = 0 17 18 End If 19 Next 20Next 21 22If cnt > 0 Then 23 24 MsgBox cnt & "個未完成です" 25 26Else 27 28 MsgBox "完成です。" 29 30End If 31

投稿2019/04/26 07:56

ttyp03

総合スコア16998

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

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

hiro.tatsu

2019/04/29 01:51

前回に引き続き、ありがとうございました。 やっぱり、カウンターするのが一番なんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問