人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelの問題で困っております。
今、以下のようなデータが、A列に5000ほど並んでおります。

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



100
101
102
103


101
102
201
202
203



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

A列はそれぞれ番号であり、重複してはいけません。
なので、重複はないかを調べるため、「=IF(COUNTIF($A$1:$A$5000,A1)>=2,"×","○")」という関数を、適当な列に入力し、オートフィルで5000行まで(「=IF(COUNTIF($A$1:$A$5000,A5000)>=2,"×","○")」)割り当てました。
これで、重複が出た時は「×」印を出してくれるようにしました。

例えば上記の例においては、重複した「102」に、×印が出ます。
ところが、「違いが半角か全角」でしかない「101」「101」は、違うものとして扱われ、どちらも「〇」印が出てしまうのです(>_<)

どうにかして、半角も全角も区別せずに、「101」と「101」があれば×印を出すような関数およびマクロを、教えていただけないでしょうか?
よろしくお願いします<m(__)m>

●質問者: moon-fondu
●カテゴリ:コンピュータ
✍キーワード:A1 Excel データ フィル マクロ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● doxas
●20ポイント

ひと手間踏んでもよければ、ASC関数を使うか、あるいはJIS関数ですね。

ASCは全角でも半角でも表記できる文字を全て半角に変換した結果を返します。

JISはその逆です。どちらかに統一するという意味であればどちらでもいいでしょう。

どこか適当な列にASCなどの関数を用いて半角に変換したデータをまずは抜き出し、そのデータに対してCOUNTIFの数式を当て込めれば、問題は解決すると思います。

これはマクロを使うまでも無いでしょう。

◎質問者からの返答

なるほどです、その手があったんですね!


2 ● Mook
●100ポイント ベストアンサー

こんな形でどうでしょうか。

全角は半角としてから処理し、空白も取り除いた形でチェックしています。


重複しているA列に色を塗るのと同時に、作業列(B列)に最初にある位置のデータを書くようにしてみました。

Sub checkA()
'// 重複していた時の塗りつぶし色
 Const DColor = 38 '// ピンク
 Dim objDic
 Set objDic = CreateObject("Scripting.Dictionary")

 Dim lastRow As Integer
 lastRow = Range("A" & Rows.Count).End(xlUp).Row

 Range("A1:A" & lastRow).Interior.ColorIndex = xlNone
 Columns("B").Insert
 
 Dim s As String
 For r = 1 To lastRow
'// 半角、空白を除去してから確認
 s = Trim(StrConv(CStr(Cells(r, "A").Value), vbNarrow))
 If objDic.Exists(s) = False Then
 objDic.Add s, r
 Else
 If Range("A" & objDic.Item(s)).Interior.ColorIndex = xlNone Then
 Range("A" & objDic.Item(s)).Interior.ColorIndex = DColor
 End If
 Range("A" & r).Interior.ColorIndex = DColor
 Range("B" & r).Value = "A" & objDic.Item(s)
 End If
 Next
End Sub
◎質問者からの返答

すごいです、うまくいきました!

ありがとうございます(^_^;)


3 ● たか
●15ポイント

=ASC(A1)という関数をB1に入れて5000行コピーします。

ASC(文字列)関数は2バイト文字を1バイト文字に変換します。

よって全角101を半角101に変えてくれます。


ちなみに逆の半角→全角変換はJIS(文字列)関数です。

◎質問者からの返答

ありがとうございます!


4 ● nepia11
●15ポイント

テキストを半角に変換する「ASC関数」もしくは、

逆に全角にする「JIS関数」がいいと思います。


B列に「=ASC(A1)」でオートフィルで5000列目まで。

その後に、C列に

=IF(COUNTIF($B$1:$B$5000,B1)>=2,"×","○")でオートフィルで5000列目まで。

これでいいと思います。

◎質問者からの返答

ありがとうございます、気づきませんでした(>_<)


5 ● Grossauge
●15ポイント

日本版のエクセルをお使いならば、一列追加して、ASC関数で全角を半角に変換して、その列に対して同じcountifの関数を適用しみてはどうでしょうか?

http://pc.nikkeibp.co.jp/pc21/tech/excel36/28/

◎質問者からの返答

JIS(ジス)関数もASC(アスキー)関数も初めて知りました、ありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ