- ベストアンサー
空白セル(データ)を含むマッチングについて
はじめまして。vbaや関数などで a列 b列..c列 ... 01 △ 02 △ 05 △ といったexcelデータで空白の列があります。 それを重複を含む一覧よりマッチチングしたら フラグを立てたいのです 1:nです。 関数でcontif,vbaでやってみましたがうまくいきません。 初心者ですみませんが誰がおしえていただけないでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
[Sheet1] A B C D E ・・・ Z AA 1 01 05 06 ・・・ 09 TRUE [Sheet2] A B C D E ・・・ Z 1 01 01 01 02 ・・・ 2 01 05 01 ・・・ 09 3 01 05 06 ・・・ 09 4 01 01 01 02 ・・・ の状態を想定します。 Sheet1のAA1にユーザー定義関数をセットします。式は、 AA1: =fn_HaniHikaku(A1:Z1,Sheet2!A1:Z4) 最初の解答とが違い、ユーザー定義関数で指定範囲全てを調べています。 第1引数と第2引数の列数は同じとしています。 第1引数は調べる元のセル範囲、第2引数は一覧のセル範囲。見つからなければFalseが表示されます。 下のユーザー定義関数は標準モジュールに貼り付けます。 Function fn_HaniHikaku(Rng1 As Range, Rng2 As Range) Dim rg As Range '// セル Dim rw As Long '// 行カウンタ Dim col As Integer '// 列カウンタ Dim judge As Boolean '// 判定 For rw = 1 To Rng2.Rows.Count judge = True For col = 1 To Rng2.Columns.Count '// 行rwの各要素を比較する If Rng1.Cells(1, col) <> Rng2.Cells(rw, col) Then '// 一つでも違えば不一致 judge = False Exit For End If Next '// 1行でも全要素が一致すればいい If judge = True Then Exit For End If Next '// 結果を返す fn_HaniHikaku = judge End Function
その他の回答 (4)
- nishi6
- ベストアンサー率67% (869/1280)
A B C D E ・・・ Z AA 1 01 05 06 ・・・ 09 TRUE 2 01 01 01 02 ・・・ 0 3 01 05 01 ・・・ 09 0 4 01 05 06 ・・・ 09 1 5 01 01 01 02 ・・・ 0 質問の意味を掴むのが一番難しいのですが・・・ 上のようになった表で、1行目A列~Z列の内容が 2行目から5行目でA列~Z列と全て等しいなら『1』をAA列に書いてみます。 AA列の2行目以下でどこかに『1』があれば、一致する行があることになります。 力技で各セルをセル単位に照合すればできますが、ばかばかしいので、ユーザー定義関数を作ってみます。 AA2セルに =fn_HaniHikaku($A$1:$Z$1,A2:Z2) として、AA3以下はこれをコピーします。 (Z列まで使ったのは例です) AA1セルに =IF(SUM(AA2:AA5)>0,TRUE,FALSE) とします。 質問の意味を捉えていればいいんですが・・・ 質問に書いてあることをそのままコードに書いたつもりです。参考にして下さい。 Function fn_HaniHikaku(Rng1 As Range, Rng2 As Range) Dim rg As Range '// セル Dim col As Integer '// 列カウンタ Dim judge As Integer '// 判定 judge = 1 For col = 1 To Rng1.Columns.Count '// 各要素を比較する If Rng1.Cells(1, col) <> Rng2.Cells(1, col) Then '// 一つでも違えば不一致 judge = 0 Exit For End If Next '// 結果を返す fn_HaniHikaku = judge End Function
補足
ありがとうございます。検索元のデータは別シートで 対象範囲のシートからマッチングして結果を返したいのですがコードはどのようにかえればよいのでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
出来ない(「複雑でいやになっちゃう」も含めて)と思います。下記をご参考にしてください。 (1)エクセル関数では、セルの、1つの文字列にしないと、それを対象にしてしか検索できない。 (2)セルの文字列の結合において「各列定幅(桁)性」を持たせないと比較ができない。A列「AB」B列「C」を結合して「ABC」、A列「A」B列「BC」も結合して「ABC」。両者が等しくなっては(一般的には)困るので、例えばA列は固定4桁、B列は固定3桁とか、合理的に各列の桁数を決めて結合しないといけない。AB・・C・・(・はスペースなど)後者ではA・・・BC・のように。 しかしフィールドが多くなるとそれを作る関数式が結構面倒である。 同じく「検索のために指定する値」もそのフィールド桁数ルールを守って入力しないといけない。結構神経を使う。 (3)空白列の存在に対処するのも(2)と似ていて 全行と決まっておれば、空白の場合は何桁かを決める必要がある。 (4)救いの手は、簡単なVBAを使い、ユーザー関数を作る ことでしょう。 Function ketugou(a) r = a.Row l = Array(4, 3, 5, 3, 4) sl = 0 For i = 0 To UBound(l) sl = sl + l(i) Next i s = String(sl, "-") '---- p = 1 For i = 0 To UBound(l) Mid(s, p, Len(Cells(r, i + 1))) = Cells(r, i + 1) p = p + l(i) Next i ketugou = s End Function 例えば A列 B列 C列 D列 E列 ab (空白) xyz (空白) ijk cdf (空白) v (空白) jkll 4 3 5 3 4 最下行の桁数で桁数幅を考えた時 F1に=ketugou(A1)と入れると ab-----xyz-----ijk- F2に=ketugou(A2)と入れると cdf----v-------jkll がセットされると言う風に。(スペースでは桁が判りにくいので、判りやすいように-にした) (5)後はF1をF2セル以下複写すればF列に望みの 検索される方の文字列が出来る。 (6)ここを対象にしてVLOOKUP関数で検索する。 しかしVlookup関数の検索される列は最左列でないといけなかったと思うので、取りたい情報(例えば会社名)はF列より右にあるかF列をA列(列挿入した後のA列)にもってくる必要がある。 Match関数ならそのような心配はない。
- papayuka
- ベストアンサー率45% (1388/3066)
スペースとは、半角又は全角の文字が入っているって事? 01△05△△06△09 は 「01 05 06 09」? 検索範囲のデータはそれぞれ別の列に入ってる? A1に01、B1は全角1文字、C1は05、D1は全角1文字・・・・ それとも A1に01、B1は空、C1は05、D1は空・・・・ とりあえずデータを結合してMatch関数やVLOOKUP関数を使えば良いのでは? 検索範囲の列を結合したデータを作る。 =A1&B1&C1&D1&E1 もし空白文字を含まない列を含むなら結合データ作成を工夫する。 =if(A1=""," ",A1) & if(B1=""," ",B1) & ...... そのうえで、検索データのセルとマッチさせる。 =Match(検索データ,検索範囲,FALSE)
- papayuka
- ベストアンサー率45% (1388/3066)
ちょっと意味が掴み難いです。 何処と何処をどうマッチさせ、どんな結果を得たいのかサンプル値でも良いので実例を上げた方が良いのでは?
補足
わかりにくくてすみません。 このようなことがしたいのです。 検索データ:01△05△△06△09 ========================================== 検索範囲: 01△01△01△02 01△05△△01△09 01△05△△06△09 01△01△01△02 . . . ========================================= 結果 データがマッチしからtrueやなければflase を返す excel関数でなんとかしたいです。 検索データにはスペースを含みます。 △はスペースです。 探索先(範囲)には検索したいデータは必ずあるのが前提ですがなれればエラーを返すようにしたいです(優先度は低いです) また検索範囲内でデータ重複があります。 マッチして時点でtrueが返ればいいです。
お礼
大変お役にたちました。 こんなやり方(考え方)もあるんですね。 ありがとうございました。