Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1434 / 13646 ツリー ←次へ | 前へ→

【74515】条件に合うセルをチェック 13/7/8(月) 18:01 質問[未読]
【74516】Re:条件に合うセルをチェック kanabun 13/7/8(月) 19:11 発言[未読]
【74518】Re:条件に合うセルをチェック 13/7/9(火) 13:39 発言[未読]
【74519】Re:条件に合うセルをチェック kanabun 13/7/9(火) 17:28 発言[未読]
【74520】Re:条件に合うセルをチェック 13/7/9(火) 18:04 発言[未読]
【74521】Re:条件に合うセルをチェック kanabun 13/7/10(水) 7:15 発言[未読]
【74522】Re:条件に合うセルをチェック kanabun 13/7/10(水) 9:00 発言[未読]
【74523】Re:条件に合うセルをチェック 13/7/11(木) 18:18 発言[未読]
【74524】Re:条件に合うセルをチェック 13/7/12(金) 15:38 お礼[未読]
【74525】Re:条件に合うセルをチェック kanabun 13/7/12(金) 17:47 発言[未読]
【74526】Re:条件に合うセルをチェック 13/7/12(金) 18:31 お礼[未読]

【74515】条件に合うセルをチェック
質問    - 13/7/8(月) 18:01 -

引用なし
パスワード
   どうかご教授願います。

二つの異なるデータベースの情報が正しく入力されているか
色付けにてチェックするマクロを作成したいです。

処理は以下の通りです。

*-------------【処理】-----------------*
・Aシート:U6の値を取得

[U6値がある場合]
Bシート:(B列)を検索、
・・HIT 色無し1. end
・・MISS ↓へ
Aシート:A6の値を取得し、Bシート:AK列を検索、
・・・HIT 色有り2. end
・・・MISS 色有り3. end


[U6空白の場合]
Aシート:A6の値を取得し、Bシート:AK列を検索、
・・HIT 色有り2. end
・・MISS 色無し1. end

上記処理のA,U6〜最下行まで同じ処理を繰り返す。
*------------------------------------*

当方、VBAは開く/実行くらいしか出来ない初心者です。
過去スレッドで似たような案件がありましたが、
予備知識の無い自分ではうまく転用できませんでした。

どうぞよろしくお願いします。

【74516】Re:条件に合うセルをチェック
発言  kanabun  - 13/7/8(月) 19:11 -

引用なし
パスワード
   ▼白 さん:

>二つの異なるデータベースの情報が正しく入力されているか
>色付けにてチェックするマクロ

日本語の疑似コード、分るところだけ、コード化すると
以下のようになります。


>*-------------【処理】-----------------*
>・Aシート:U6の値を取得
 Dim a
 a = Sheets("A").Range("U6").Value


>[U6値がある場合]
 If Not IsEmpty(a) Then
>   Bシート:(B列)を検索、
>    ・・HIT 色無し1. end
>    ・・MISS ↓へ
>   Aシート:A6の値を取得し、Bシート:AK列を検索、
>    ・・・HIT 色有り2. end
>    ・・・MISS 色有り3. end
>
 Else
> [U6空白の場合]
>   Aシート:A6の値を取得し、Bシート:AK列を検索、
>   ・・HIT 色有り2. end
>   ・・MISS 色無し1. end
>
End If

>上記処理のA,U6〜最下行まで同じ処理を繰り返す。

------------------
If [U6値がある場合] Then
  のときの処理

Else ' [U6空白の場合]
  のときの処理

End If

この
  If  Else
 それぞれのときの------処理内容

を、もう少しコード化しやすく、文章化すれば、
コードは自ずから 現れてきそうな気配です。
もうちょっとですので、がんばって、文章化してください。

【74518】Re:条件に合うセルをチェック
発言    - 13/7/9(火) 13:39 -

引用なし
パスワード
   kanabunさん
レスありがとうございます。
文章化ですか…コードにするには言葉足らずという感じですかね?申し訳ないです、がんばります。
処理部分を修正しました、意図が違う、まだ足りない等ありましたら再度修正致します。
どうぞよろしくお願いします。

*-------------【処理】-----------------*
・Aシート:Uxの値を取得 ※最初のセルはU6
 Dim a
 a = Sheets("A").Range("U6").Value

[U6値がある場合]
 If Not IsEmpty(a) Then
   取得した値をBシートのB列にて検索、
    ・・検索した値が存在する 何もせずend
    ・・検索した値が存在しない 下の処理へ

   AシートでA6の値を新たに取得し、BシートのAK列にて検索、
    ・・・検索した値が存在する Uxセルに色付(青)end
    ・・・検索した値が存在しない Uxセルに色付(赤)end

 Else
 [U6空白(値が無い)の場合]
   AシートでA6の値を取得し、BシートのAK列にて検索、
   ・・検索した値が存在する Uxセルに色付(青)end
   ・・検索した値が存在しない 何もせずend

End If

次はU7の値を取得して同処理を実行、
Ux〜最下行まで同じ処理を繰り返す。

------------------

【74519】Re:条件に合うセルをチェック
発言  kanabun  - 13/7/9(火) 17:28 -

引用なし
パスワード
   ▼白 さん:

>*-------------【処理】-----------------*
>・Aシート:Uxの値を取得 ※最初のセルはU6
 Dim a
 a = Sheets("A").Range("U6").Value
>
>[U6値がある場合]
 If Not IsEmpty(a) Then
>   取得した値をBシートのB列にて検索、
>    ・・検索した値が存在する 何もせずend
>    ・・検索した値が存在しない 下の処理へ
>
>   AシートでA6の値を新たに取得し、BシートのAK列にて検索、
>    ・・・検索した値が存在する Uxセルに色付(青)end
>    ・・・検索した値が存在しない Uxセルに色付(赤)end
>
> Else
> [U6空白(値が無い)の場合]
>   AシートでA6の値を取得し、BシートのAK列にて検索、
>   ・・検索した値が存在する Uxセルに色付(青)end
>   ・・検索した値が存在しない 何もせずend
>
>End If


-------
まず[U6]セルをみて、
値が入っていれば、「B」シートのB列に同じ値があるか、検索
 その結果、同じ値がなければ、以下の処理▼を行う
  処理▼:
  その行のA列,すなわち[A6]の値を「B」シートのAK列で、検索
    検索値が存在したら [U6]セルを(青)で塗りつぶす
    検索値が存在しないときは [U6]を(赤)で塗りつぶす

[U6]に値が入っていないときは、すぐ 処理▼ を実行する
-------
ということですね?
そうすると、処理▼ のとき [A6]に「値が入っていないとき」は
どうしましょ?
そういうことは絶対ないと言えますか?


>次はU7の値を取得して同処理を実行、
>Ux〜最下行まで同じ処理を繰り返す。
>------------------
これですが、[U7]に値が入っていないときは、[U6]が最下行ということで、
[U6]の処理をして終了してしまっていいのですか?
それとも A列の最下行までくりかえす ということですか?

【74520】Re:条件に合うセルをチェック
発言    - 13/7/9(火) 18:04 -

引用なし
パスワード
   kanabunさん
度々のレスありがとうございます。
個別に回答を矢印で追記しております。

>-------
>まず[U6]セルをみて、
>値が入っていれば、「B」シートのB列に同じ値があるか、検索
> その結果、同じ値がなければ、以下の処理▼を行う
>  処理▼:
>  その行のA列,すなわち[A6]の値を「B」シートのAK列で、検索
>    検索値が存在したら [U6]セルを(青)で塗りつぶす
>    検索値が存在しないときは [U6]を(赤)で塗りつぶす
>
>[U6]に値が入っていないときは、すぐ 処理▼ を実行する
>-------
>ということですね?
>そうすると、処理▼ のとき [A6]に「値が入っていないとき」は
>どうしましょ?
>そういうことは絶対ないと言えますか?
→はいそのとおりです、Aシートの[A6]及びA列には100%値が入っています。


>次はU7の値を取得して同処理を実行、
>Ux〜最下行まで同じ処理を繰り返す。
>------------------
>これですが、[U7]に値が入っていないときは、[U6]が最下行ということで、
>[U6]の処理をして終了してしまっていいのですか?
>それとも A列の最下行までくりかえす ということですか?
→あ〜そういう考慮も必要なのですね、思案不足ですいません。
A列なら問題無く最下行まで行けるのでA列でお願いします。


それと一部追記したいです、
[U6]セルを(x)で塗りつぶす→Aシートの[U6]セルを(x)で塗りつぶす

お手数ですが、宜しくお願いします。

【74521】Re:条件に合うセルをチェック
発言  kanabun  - 13/7/10(水) 7:15 -

引用なし
パスワード
   ▼白 さん:

未検証ですが...

Sub Try1()
  Dim valA As Variant
  Dim rngU As Range
  Dim rngB As Range
  Dim rngAK As Range
  Dim i As Long
  Dim m
  
  With Sheets("B")
    Set rngB = .Range("B3", .Cells(.Rows.Count, 2).End(xlUp))
    Set rngAK = .Range("AK3", .Cells(.Rows.Count, "AK").End(xlUp))
  End With
  
  With Sheets("A").Range("A6", Cells(Rows.Count, 1).End(xlUp))
    valA = .Value      'A列の値
    Set rngU = .Offset(, 20) 'U列
  End With
  
  rngU.Interior.ColorIndex = xlNone '始めにU列塗りつぶしなし
  For i = 1 To UBound(valA)
    If Not IsEmpty(rngU.Item(i).Value) Then
      m = Application.Match(rngU.Item(i), rngB, 0)
      If IsError(m) Then 'B列に検索値がなかったとき
        m = Application.Match(valA(i, 1), rngAK, 0)
        If IsNumeric(m) Then
          rngU.Item(i).Interior.Color = vbBlue
        Else
          rngU.Item(i).Interior.Color = vbRed
        End If
      End If
    
    Else '[U6空白(値が無い)の場合]
      m = Application.Match(valA(i, 1), rngAK, 0)
      If IsNumeric(m) Then
        rngU.Item(i).Interior.Color = vbBlue
      End If
         
    End If
  Next
  MsgBox "処理が終わりました"
End Sub

【74522】Re:条件に合うセルをチェック
発言  kanabun  - 13/7/10(水) 9:00 -

引用なし
パスワード
   安全のために

> valA = .Value      'A列の値

 valA = .Value2      'A列の値

に変更しておいてください。
A列のデータが 日付のとき これまでの値(.Value)でのMatch検索は
成功しません。
Match関数は .Value2 を使って検索します。日付データなら、
日付け型ではなく、シリアル値で検索、となります。

【74523】Re:条件に合うセルをチェック
発言    - 13/7/11(木) 18:18 -

引用なし
パスワード
   kanabun様
再三のレスありがとうございます。

本当に申し訳ないのですが、
昨日、今日が仕事で大変ばたばたしており、頂いたマクロを実装できておりません。
明日は何とか時間が取れると思いますので、また後日改めてご報告致します。

【74524】Re:条件に合うセルをチェック
お礼    - 13/7/12(金) 15:38 -

引用なし
パスワード
   kanabun様
本日実装、検証しました所、想定した通りに動きました。
本当にありがとうございます!!

…大変恐縮なのですが、思った以上に条件に一致するデータ多くて困っています
もう一つ機能を追加したいのですがよろしいでしょうか。

>まず[U6]セルをみて、
【追加】[Mx]セルの日付が3ヶ月以上前だったら処理をスキップ
>値が入っていれば、「B」シートのB列に同じ値があるか、検索

どうかよろしくお願いします。

【74525】Re:条件に合うセルをチェック
発言  kanabun  - 13/7/12(金) 17:47 -

引用なし
パスワード
   ▼白 さん:
>思った以上に条件に一致するデータ多くて困っています
>もう一つ機能を追加したいのですがよろしいでしょうか。
>

>【追加】[Mx]セルの日付が3ヶ月以上前だったら処理をスキップ

以下でどうですか?

Sub Try2()
  Dim valA As Variant
  Dim valM As Variant
  Dim rngU As Range
  Dim rngB As Range
  Dim rngAK As Range
  Dim i As Long
  Dim m
  Dim Mday As Date
  Mday = DateAdd("m", -3, Date) '本日より3か月前
  
  With Sheets("B")
    Set rngB = .Range("B3", .Cells(.Rows.Count, 2).End(xlUp))
    Set rngAK = .Range("AK3", .Cells(.Rows.Count, "AK").End(xlUp))
  End With
  
  With Sheets("A").Range("A6", Cells(Rows.Count, 1).End(xlUp))
    valA = .Value2      'A列の値
    valM = .Offset(, 12).Value
    Set rngU = .Offset(, 20) 'U列
  End With
  
  rngU.Interior.ColorIndex = xlNone '始めにU列塗りつぶしなし
  For i = 1 To UBound(valA)

' 【追加】[Mx]セルの日付が3ヶ月以上前だったら処理をスキップ
   If IsDate(valM(i, 1)) Then
    If valM(i, 1) > Mday Then
     With rngU.Item(i)
       If Not IsEmpty(.Value) Then
         m = Application.Match(.Cells, rngB, 0)
         If IsError(m) Then 'B列に検索値がなかったとき
           m = Application.Match(valA(i, 1), rngAK, 0)
           If IsNumeric(m) Then
             .Interior.Color = vbBlue
           Else
             .Interior.Color = vbRed
           End If
         End If
     
       Else '[U6空白(値が無い)の場合]
         m = Application.Match(valA(i, 1), rngAK, 0)
         If IsNumeric(m) Then
           .Interior.Color = vbBlue
         End If
          
       End If
     End With
    End If
   End If
  Next
  MsgBox "処理が終わりました"
End Sub

【74526】Re:条件に合うセルをチェック
お礼    - 13/7/12(金) 18:31 -

引用なし
パスワード
   kanabun様
再度実装してみました、無事やりたい事が完璧に出来ました。
ご教授本当にありがとうございました。

全ソース頂いて大変恐縮です、自分でもマクロ触れるようになりたいと思いました、
少しずつですが、理解していけるよう頑張りたいと思います。

重ね重ねお礼を申し上げます、ありがとうございました。

1434 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free