こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

A列文字とE列文字を比較してG列に判定を出力する

エクセルマクロ初心者です。
A列に入力されている文字とE列に入力されている文字を比較して、G列に判定を出力(一致:K 不一致:F)するマクロを考えています。

StrComp関数が返す戻り値を利用して
StrComp(Cells(j, 1), Cells(j, 5), vbTextCompare)
というのを使って比較しようとしましたが、これだと同じ行を参照してしまいます。
A列の方が入力されている行が少ない(例えば:A列は1から10行、E列は1から1000行)ので、A列を基準にE列を比較し、A列が空白行に移った段階で処理を止めたいと思います。
以下に途中まで考えたものを載せます。

j = 1
For j = 1 To Cells(Rows.Count, "E").End(xlUp).Row
Cells(j, 10) = StrComp(Cells(j, 1), Cells(j, 5), vbTextCompare)
   If Cells(j, 10).Value = 0 Then
   Cells(j, 7).Value = "K"
   Else
   Cells(j, 7).Value = "F"
   End If
Next j

ご教示の程、お願いします。

投稿日時 - 2014-06-20 17:23:03

QNo.8646189

困ってます

質問者が選んだベストアンサー

いまE列の最後行までfor nextを廻しているのを,単純にA列最後行までと書き換えるだけです。

sub macro1()
dim i as long

for i = 1 to cells(rows.count "A").end(xlup).row ’Aの最後まで
cells(i, "G") = iif(strcomp(cells(i, "A"), cells(i, "E"), vbtextcompare) = 0, "K", "F")
next i
end sub

投稿日時 - 2014-06-20 18:58:02

お礼

keithinさん

ご回答ありがとうございました。
問題なく解決できました。

行全体の指定方法”A”、”E”、”G”と、Strcompの戻り値の扱いを一行で表現できる所が大変勉強になりました。

ありがとうございました。

投稿日時 - 2014-06-21 08:28:59

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

keithinさんのコードだと同一行の値の検査しかしていませんし、A列が1から10行だった場合E列の10行目以降は検査対象になっていませんが、よろしいのでしょうか。

たとえば
A1とB1にaと入力して
E3とE4にaと入力して
コードを実行すると
G1とG2にはFと表示されます

vesper580109さんはこの場合、Kと表示させたいのだろうと思ったのですが違いましたでしょうか。もしそうだとしたら、思った結果ではない状態で作業を進める事になると思い、追加の回答をさせていただきました。

投稿日時 - 2014-06-21 10:40:39

お礼

kkkkkmさん。

追加のご回答ありがとうございます。
ご両名のご回答内容を自分なりに勉強し、keithinさんの回答がkkkkkmさんのご指摘のとおりとなっていたことを理解しております。ご回答頂いたものをそのまま使用する・・だけでなく、その書かれている意味や内容を理解することが大切だと思い、"A"を”E”に変えてみたりいろいろいじってみて、回答頂いたコードがどのように動くか・・を試してみました。
1つの結果を導くのに、いろんな書き方があることを今回特に勉強させていただきました。

お手数をおかけしました。本当にありがとうございます。

投稿日時 - 2014-06-22 01:03:28

ANo.3

Sub Exampel()
Dim j As Long

For j = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If WorksheetFunction.CountIf(Range("E:E"), Cells(j, "A")) > 0 Then
Cells(j, "G") = "K"
Else
Cells(j, "G") = "F"
End If
Next j
End Sub

こういうことでしょうか。

投稿日時 - 2014-06-20 20:12:50

お礼

mt2008さん

ご回答ありがとうございました。
問題なく結果出力できました。

今回はkeithinさんの回答をベストアンサーにさせて頂きたくご了承下さい。
マクロの処理時間がkeithinさんの方が早かった事があげられます。
記述方法でいろいろ変わってくるのは、初心者なりに何となく分かってはいましたが、
もっと勉強しないといけないなと思っています。

ありがとうございました。

投稿日時 - 2014-06-21 08:14:04

ANo.1

説明を勘違いしているかもしれませんが、E列の文字列がA1:A10に存在していれば「K」、存在していなければ「F」をG列に表示するという事でしょうか?
でしたらこんな感じで良いかも。

Range("G1:G1000").FormulaR1C1 = "=IF(COUNTIF(R1C1:R10C1,RC[-2])>0,""K"",""F"")"
Range("G1:G1000").Value = Range("G1:G1000").Value

投稿日時 - 2014-06-20 17:52:23

お礼

mt2008さん

ご回答ありがとうございました。
解釈頂いた内容で合っており、結果出力できました。

今回はA列、E列共に、何行目まで文字が入っているのか分からない部分でつまづいていました。
何行目までという範囲指定ではなく、列全行を比較範囲にしたかったという意図がありました。

まだ初心者なので、いろんな記述方法を勉強していきたいと思います。

ありがとうございました。

投稿日時 - 2014-06-21 07:59:10

あなたにオススメの質問