• ベストアンサー

エクセルでできるでしょうか?

お世話になります。 仮にC1からC30までのC列の範囲で、重複する数値が入力された場合、 一番上(行番号が最小の)のセルのみ残し、他は消す(空欄にする) ということはできるでしょうか? 例:C1,C2,C3にそれぞれ1、C4,C5,にそれぞれ2、C6に3が入っているき、   C1は1、C4は2、C6は3 になり C2,C3,C5は空欄にする ちなみに「入っているとき」という表現にしたのは他のところからカット&ペーストでC1:C30に貼り付けるということを念頭においているためです。 列全体を指定すれば入力規則でできるらしいのですが、あくまでC1からC30まで というように対象範囲を指定したいのです。ちなみにこの範囲は不変です。 計算式でできたらよいのですが、マクロでもいいです。 よろしくお願いします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

Sheet1で行う例でマクロを書いてみました。 質問にある通りに消して(消去して)います。カット&ペースト、個々のセルへの入力、どちらでも機能するはずです。 ツール→マクロ→Visual Basic Editor でVBE画面に移り、 表示→プロジェクトエクスプローラでプロジェクトエクスプローラを表示します。 プロジェクトエクスプローラのSheet1をダブルクリック。出てきたコードウインドウに下記マクロをコピーして貼り付けます。 Excel2000です。ご参考に。 ここから ↓ Const CheckArea = "C1:C30" 'チェックする範囲 Private Sub Worksheet_Change(ByVal Target As Range)   Dim rgArea As Range '変更セルとチェックする範囲の共通部分   Dim rg As Range '単一セル   Dim Txt(30) As String 'チェックする範囲の内容(文字列で取得)   Dim rw As Integer '行カウンタ   Dim c As Integer 'チェック用行カウンタ   On Error GoTo ErrorHandler 'エラー対応   Set rgArea = Intersect(Range(CheckArea), Target)   'チェックする範囲に変更があったら   If Not rgArea Is Nothing Then     'マクロで書き換えても再度このマクロに入らないようにする     Application.EnableEvents = False     'どのセルを変更してもチェックする範囲を全て調べる     For Each rg In Range(CheckArea)       rw = rw + 1: Txt(rw) = rg.Text       '今までのセルと同じ値なら消す       For c = 1 To rw - 1         If Txt(rw) = Txt(c) Then           rg = ""           Exit For         End If       Next     Next     Application.EnableEvents = True   End If   Exit Sub ErrorHandler:   Application.EnableEvents = True 'エラー対応 End Sub

HGK
質問者

お礼

すばらしかったです。マクロの保存方法すら知らなかったので会社の人に教えてもらいながらやりましたが・・・。ありがとうございまいた。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

下記は、本日他の質問に答えて、1つしか現われないキーの行を省くテクニックとして考えたものですが、解答を締めきられてしまいました。この逆ですので、後半にダブり行分を省く方法に修正したものを説明します。 ----- 私が仕事に使った方法を説明します。 第2行目以下にデータが入っているものとします。(第1行目からデータが始まるときは、第1行目にブラ ンク行を挿入してください。そうしないと下記関数式がエラーが起こるため。) 何もデータが入って無い列をX,Y列と仮定します。 A。(当初データ順序の保存のため付番)  もし順序が壊れても、復元不要なら下記1、2は省略する。  1.X2に1、X3に2を入力する。  2.X2とX3を範囲指定し、+ハンドルで、終わりの行まで引っ張り連番を振る。 B.(コード列でソート)  ソート済みのとは下記1は省略する。   1.問題にしているコードの入っている列で、ソートをする。仮にB列とする。 C.(単独行のサインをセット)  1.Y2に「=IF(B2=B1,0、IF(B2=B3,0,1))」と式を入れる。(0,1はなんでも良い)  2.+ハンドルでY3からデータ最終行まで式を複写する。Y列には0か1が入る。    同じコードで前後が続いている行は0、そうでないコードが単独の行は1が入る。   3.Y列でソートする。  4.複数行あるものは上部へ、単独行はしたに固まって集まる。  5.単独行の塊は、抹消するか無視する。 抹消していない時、当初のデータの並び順に戻すなら、X列でソートすれば良い。 ------- 上記の逆を考えます。 上記C-1の式をY2に「=IF(B2=B1,1,0)」と式を入れる。上記C-4では、Y列が0のもののみ上部に集まるので、1がセットされた行の塊(下部)は無視し0の部分を見れば良い。  

HGK
質問者

お礼

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

回答No.2

とりあえずC2に次のような条件付書式を入れます。 その際に書式設定は白文字にします。 それによって字を見えなくできます。 C2の条件付書式の数式で「=(MATCH(C2,$C$1:C1,0)>0)」です。 これをC30まで書式だけコピー&ペーストしましょう これで見た目上消えた形になります。

HGK
質問者

お礼

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

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

結果をD列に作る,というのでいいのなら, d1「=c1」 d2「=if(c2=c1,"",c2)」 として,d2セルをD30までコピーすればできます. ただし,ソートされていることを前提としました.

HGK
質問者

お礼

ありがとうございます。ソートしているので問題ないです。理想の結果になりました。やっぱりC列のなかでは循環参照になって無理なんでしょうかね。

関連するQ&A

専門家に質問してみよう