[[20170102222222]] 『Aから始まる2文字が入っていたらそのセルの色を塗』(vo) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Aから始まる2文字が入っていたらそのセルの色を塗る』(vo)

こんばんわ!今年もよろしくお願いします!
教えてください。

T列のセルにアルファベットと数字を用いた2文字が半角の空白を挟みランダムに入っているとします。

セルT1:AE 5H EA BA
セルT2:3Q HA
セルT3:1Q AF LK
セルT4:GH JK AF
という具合に以下T6000くらいまで続きます。

Aから始まる2文字が入っていないのはセルT2なのでこの場合T1.T3.T4が塗
れればokです。

しかし自分が考えたコードだとセルの最初か最後にAから始まる2文字が入っていないと塗れません。
つまりT3が塗れないのです。

以下のコードをどう直せばよいでしょうか?

Sub test2()

Dim source As Worksheet

Set source = ActiveWorkbook.Worksheets(1)

i = 0

Do While source.Cells(1 + i, 20).Value <> ""

If source.Cells(1 + i, 20).Value Like "*A?" Then

    Cells(1 + i, 20).Interior.Color = RGB(200, 200, 200)

        ElseIf source.Cells(1 + i, 20).Value Like "A*" Then
        Cells(1 + i, 20).Interior.Color = RGB(200, 200, 200)

  End If

 i = i + 1

Loop

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


"* A?*"

では?

(マナ) 2017/01/02(月) 22:58


"*A[0-9A-Z]*"

でもいいかも

(マナ) 2017/01/02(月) 23:10


できました!うれしい!!
ありがとうございます〜(^^♪
(vo) 2017/01/02(月) 23:39

こんばんわ!
ここに書くべきか新規投稿すべきか迷いましたがこちらに書かせていただきます!
教えてください!

例えばセルに"1H"、"2H"、"3H"という文字列のどれか一つが入っていたら、
必ず同じセルに"HK"という文字が入っていなければならないとします。
この条件に反したセルを見つけた場合に行番号をメッセージボックスで出す。
というマクロの組み立て方がわかりません。
以下の文をどのように直せばよいでしょうか?

Sub Htest()

Dim source As Worksheet
Set source = ActiveWorkbook.Worksheets(1)
i = 0
Do While source.Cells(1 + i, 20).Value <> ""

    If source.Cells(1 + i, 20).Value Like "*1H*" Then
        If Not source.Cells(1 + i, 20).Value Like "*HK*" Then
            MsgBox Cells(1 + i, 20).Row

        End If
    End If

    i = i + 1
Loop 
End Sub
(vo) 2017/01/05(木) 20:54

 こういうこと?

     If source.Cells(1 + i, 20).Value Like "*[1-3]H*" Then
(seiya) 2017/01/05(木) 21:07

 まぁ、別物なので新規のほうがいいと思うけど。

 セルに とあるけど、コードでは T列だけを対象にしてますね?
 それでいいということですね?

 それと、セル内に 1HK と連続した文字列があったとして、これはOKということですか?
 それとも 1H とは別に HK が必要ですか?

(β) 2017/01/05(木) 21:10


seiyaさん
できました!ありがとうございます!

βさん
そうです!T列のセルが対象で、
1Hとは別にHKが必要なんです。
(vo) 2017/01/05(木) 21:56


 >>1Hとは別にHKが必要なんです。

 であれば、元コードの最初の比較部分を seiyaさん回答のコードに変更したとしても
 次の、元々のコードが 

 If Not source.Cells(1 + i, 20).Value Like "*HK*" Then

 ですから 1HK と連続して文字列が存在するものも OK になってしまいますね。

(β) 2017/01/05(木) 22:33


 1H とは別に HK があることがOKである条件ということで、たとえば。

 Sub Test()
    Dim c As Range
    Dim s As String
    Dim ng As Boolean

    For Each c In Range("T1", Range("T" & Rows.Count).End(xlUp))
        ng = True
        s = Replace(c.Value, "HK", "")
        If Len(s) <> Len(c.Value) Then
            If s Like "*[1-3]H*" Then ng = False
        End If
        If ng Then MsgBox c.Row
    Next

 End Sub

(β) 2017/01/05(木) 22:43


 単純に
     If Source.Cells(1 + i, 20).Value Like "*[1-3]H*" Then
        If (Not Source.Cells(1 + i, 20).Value Like "*HK*[1-3]H*") * (Not Source.Cells(1 + i, 20).Value Like "*[1-3]H*HK*") Then
            MsgBox Cells(1 + i, 20).Row
        End If
    End If
(seiya) 2017/01/05(木) 22:59

 To βさん

 >1HK と連続して文字列が存在するものも OK になってしまいますね。

 1HK は3文字になるので、質問者さんの以下の条件ではあり得ないので、seiyaさんの初めの回答で大丈夫と思いますよ。

 >アルファベットと数字を用いた2文字が半角の空白を挟み

(sy) 2017/01/05(木) 23:02


βさん syさん

どうもすみません!
新規投稿で元の条件など最初から書けば誤解を与えなかったと思います(>_<)

すみません、もう一点教えてください!
1H 2H 3Hのような規則性がある場合はseiyaさんの仰るとおり
"*[1-3]H*" のような書き方ができますが、
例えば全く規則性の無い場合はどう書けばよいのでしょうか?

例えば YJ 9F D4 のどれかが入っていた場合にHKが入っていなければならないとしたら?

今一つLike演算子の記事を探してもわからないんです。
(vo) 2017/01/06(金) 00:27


Excel VBAのLike文の正規表現は貧弱なので、OR条件は書けないのですよ。ワイルドカードだけよりマシ、という程度と思ってください。

なので、1回のIf文では3種類同時判定はできないので、3回に分けて判定するか、または CreateObject("VBScript.RegExp") で、より高度な正規表現が扱えるオブジェクトを呼び出して使う事になります。 興味があれば調べてみてください。
(???) 2017/01/06(金) 09:19


>例えばセルに"1H"、"2H"、"3H"という文字列のどれか一つが入っていたら、
>必ず同じセルに"HK"という文字が入っていなければならないとします。
>この条件に反したセルを見つけた場合に行番号をメッセージボックスで出す。
文字列の中に既定の文字が含まれるかを調べるには、
InStr関数を使う手もあると思いますが。。。。

これであってるのかなぁ。。。(テスト不十分です^^;)

Sub test()

    Const cKW1 As String = "1H 2H 3H"
    Const cKW2 As String = "HK"
    Dim v As Variant
    Dim c As Range
    Dim s As String

    For Each c In Range("T1:T" & Cells(Rows.Count, "T").End(xlUp).Row)
        s = c.Value
        For Each v In Split(cKW1, " ")
            If InStr(1, s, v) > 0 Then
                If InStr(1, s, cKW2) > 0 Then
                    Exit For
                Else
                    c.Select
                    MsgBox c.Address(False, False)
                End If
            End If
        Next
    Next
End Sub

>例えば YJ 9F D4 のどれかが入っていた場合にHKが入っていなければならないとしたら?
これは、いつどのように与えられるのでしょう?
例えば、シート上のセルに入力する?

(まっつわん) 2017/01/06(金) 10:11


 >>アルファベットと数字を用いた2文字が半角の空白を挟み

 すっかり見落としてました!

 >>例えば YJ 9F D4 のどれかが入っていた場合にHKが入っていなければならないとしたら? 

 正規表現も含めて、いろんな書き方があると思いますが、素直に、かつ単純に

 Sub Test2()
    Dim c As Range

    For Each c In Range("T1", Range("T" & Rows.Count).End(xlUp))
        If c.Value Like "*YJ*" Or c.Value Like "*9F*" Or c.Value Like "*D4*" Then
            If Not c.Value Like "*HK*" Then MsgBox c.Row
        End If
    Next

 End Sub

 こんなのでいいのではないですか?

(β) 2017/01/06(金) 14:09


???さん βさん

ありがとうございます!
OR条件が書けないとしつつも、βさんのような使い方であればORが書けるんですね。
べんきょうします!

まっつわんさん

ありがとうございます!
>これは、いつどのように与えられるのでしょう?
>例えば、シート上のセルに入力する?
いえ、入力するのではなく、もともとT列に入っている文字なんです。
元素材というか、これから色々な条件で必要な情報だけ抜き出す方法を知りたくて。

まっつわんさんとβさんのコード、どちらも正しく同じ結果が出せました!

(vo) 2017/01/07(土) 00:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.