|
▼β さん:
たとえばなのですが、Sheet1のA列に以下のように入力されていて、Sheet4のA列、B列に以下のように入力されていました
*Shhet1
いちご
りんご
ぶどう
みかん
めろん
*Sheet4
いちご 赤
りんご 赤
ぶどう 紫
みかん オレンジ
めろん 緑
もも ピンク
ばなな 黄
このときSheet1のなかに”もも”と”ばなな”がありません。
で、一致しなかったこの二つのB列の”ピンク”と”黄”というのを結果で表示したいです。
頭が固いもので、一致条件でつくっていたコードをどう変更すれば一致しなかったものを表示するようにできるかと・・・
今までのは一致したものをカウントし、結果表示させましたが、逆に一致しなかったものをカウントさせ、それを結果表示させる、という展開がうまくいきません・・・
>▼あや さん:
>
>よく考えますと、あやさんも言っている通り、今までのコードで検索を行っており
>その中で見つかった場合、見つからなかった場合の条件判定をしているのですから
>とくにわからないところはないのでは? と思います。
>具体的に、どこがわからないのかな?
>
>以下は、あくまでサンプルです。
>新規ブックのSheet1のA列にA1から適当な文字列をいれ
>またSheet4のA列にA1から、これまた適当な文字列をいれて
>以下実行してみてください。
>Sheet4のB列に、見つかった、見つからない の判定を記載します・
>
>基本、これ以上でもこれ以下でもないと思いますので
>これを参考に、対処できませんか?
>
>やはり壁があればSOSください。
>
>Sub Sample()
> Dim r As Range
> Dim c As Range
> Dim f As Range
>
> With Sheets("Sheet1")
> Set r = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
> End With
>
> With Sheets("Sheet4")
> For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
> Set f = r.Find(What:=c.Value, LookAt:=xlWhole)
> If f Is Nothing Then
> c.Offset(, 1).Value = "見つかりません"
> Else
> c.Offset(, 1).Value = "見つかりました"
> End If
> Next
> End With
>End Sub
>>▼β さん:
>>お久しぶりです。
>>下記の回答ありがとうございました。
>>お礼が遅くなり申し訳ありません。
>>
>>今回またで申し訳ありませんが、質問をさせてください。
>>以前作っていただいたコードは一致している文字列を探し、一致しているものがあればそのセルを赤くし、別sheetの一致した文字列の隣の列のセルを結果として表示する、というものでしたが、今回その一致条件を探す前に、無いものを探す、ということを行いたいです。
>>
>>例えばですが、Sheet4のA列にいろいろと文字列を入れておき、Sheet4のA列に入力している文字列が一致検索で探していたところと同じところに1つでも一致しないものがあれば、Shhet4のA列で一致しなかったものの隣のB列の結果を表示する、
>>というふうに処理がしたいのですが・・・
>>
>>一致しているものを探す、の逆で一致していないものを探す、なので一致しているものを探すコードを利用して、無いものを探すコードに変えられれば
>>・・・と思い試行錯誤しているのですが、〜がなければというコードをつくるのが上手くいきません・・・
>>
>>処理としては、Sheet4のA列に書いてある文字列がSheet2のA列に無いものがないか調べる
>>→全て一致していることを確認できたら:以前作成した一致するものをさがす処理をする
>>→もし一つでもないものが見つかれば:Sheet4の見つからなかったものの隣のB列に書いてあることを結果として表示する
>>
>>どうか教えていただけないでしょうか。
>>
>>>▼あや さん:
>>>
>>>こんにちは
>>>
>>>アップされたコードにはいくつか(たくさん?)問題があります。
>>>
>>>1.領域.Find で、その領域の中を捜すわけですが、Cells と指定すると
>>> シート全体の領域になりますから、A列以外にあってもマッチします。
>>>2.で、After は、その領域内の検索開始セルですが、領域が Cellsなら
>>> ActivesCell は当然シート内ですからOKですが、領域をA列にすると
>>> もし、A列以外が選択されている状態ならエラーになります。
>>> 指定するならA列内のセル(A1 とか)か、あるいは指定しない(こちらを推奨)
>>> 指定がなければ指定領域の先頭のセルから とみなしてくれますので。
>>>3.「大文字の」という条件ですよね。
>>> ところが、MatchCase:=False 。これは大文字/小文字を区別しないという意味です。
>>> MatchCase:=True とする必要があります。
>>>4.Findメソッドを実行すると、検索が成功(マッチ)した場合は、そのセルオブジェクトが
>>> 返されますが、失敗(アンマッチ)した場合は「Nothing」になります。
>>> この「Nothing」になっているオブジェクトは、参照できません。
>>> 参照しようとするとエラーになります。(参照できないので Select もできません)
>>>5.そのFIndメソッドの結果を受ける変数を oRange としていますが、この oRange は
>>> どこでも参照していません。かわりに Set c = Selection とした結果の c を参照。
>>> きっと 領域.Find(条件).Select として、その Selectされたセル(Selection)を
>>> 使おうとしたんだと思いますが、検索失敗のことを考えると、領域.Find(条件).Select は
>>> 使ってはいけない構文です。(だから使っていないんですよね)
>>>6.c という セルオブジェクトのプロパティに ColorIndex というものはありません。
>>> あるのは、Interior (ほかにもたくさんありますが)
>>> で、ColorIndex は、Interior のプロパティです。
>>> ですから、c.Interior.ColorIndex です。c.ColorIndex だと、実行時にエラーになります。
>>>7.さらに、その ColorIndex ですが、これは 1〜56。(その他に塗りつぶしなしの xlNone もありますが)
>>> で、これで指定するなら、ColorIndex = 3 です。
>>> 一方、vbRed はインデックスではなく「色番号」で、実態は 255 です。
>>> ColorIndex に 255 を与えると、実行時エラーになります。
>>> vbRed で指定するなら Color = vbRed になります。
>>>
>>>これらを加味してたとえば
>>>
>>>Private Sub AAA_Click()
>>> Dim c As Range
>>>
>>> Set c = Columns("A").Find(What:="*AAA*" _
>>> , LookIn:=xlFormulas _
>>> , LookAt:=xlWhole _
>>> , SearchOrder:=xlByRows _
>>> , SearchDirection:=xlNext _
>>> , MatchCase:=True _
>>> , MatchByte:=False _
>>> , SearchFormat:=False)
>>>
>>>
>>> If c Is Nothing Then
>>> MsgBox "AAAはありませんでした"
>>> Else
>>> c.Interior.Color = vbRed
>>> MsgBox "AAAがありました"
>>> End If
>>>
>>>End Sub
|
|