エクセルのマクロに関してです。


ユーザデータが以下のように登録されています。

例)
A(氏名) B(郵便番号)    C(住所)
山田次郎  123456 東京都足立区1-2-3

プレゼントの応募者の情報が記載されているのですが、
過去に当選済みの方のデータが同じ書式で別のブックに存在しており、

Book1(今回の応募者ファイル)
Book2(過去の当選者ファイル)

となっております。
マクロを用いて既に当選したことのあるユーザのデータ(Book2)が
今回の応募者ファイル(Book1)にある場合、Book1の該当行を削除したいと考えております。

名前も住所も少し書き方を変えてしまうと同じものとは認識されないため、
ソート等を使い、手動で行っていたのですが、ある程度割り切って、以下を満たすマクロを作りたいと思っております。

・Book2(過去の当選者ファイル)の氏名の頭2文字及び郵便番号が同じデータが 
 Book1(今回の応募者ファイル)の中に存在すれば、Book1から該当行を削除

マクロを全く作った事がないため、どなたかお願いできませんでしょうか?
どうぞよろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:2008/04/24 10:26:38
  • 終了:2008/05/01 10:30:02

回答(3件)

id:minubow No.1

minubow回答回数216ベストアンサー獲得回数52008/04/25 00:08:38

ポイント23pt

「マクロを作りたい」とのことですが、数式でもできそうなので、

下記答えさせていただきました。

1.Book2の余っている列(例えばP列)を使って、

 =mid(氏名の入っているセル,1,2)&mid(郵便番号の入っているセル,1,3)

 の数式を全データに対してコピーします。

2.Book1の余っている列(例えばR列)を使って、そこにも

 =mid(氏名の入っているセル,1,2)&mid(郵便番号の入っているセル,1,3)

 の数式を全データに対してコピーします。

3.Book1の余っている列(例えばs列)を使い、

 =if(iserror(match(r1,[book2]シート名!P:P,0))=true,0,1)

 の数式を全データに対してコピーし、

 答えが1になっているセルが削除対象となります。

4.Book1のR列とS列をコピーして値にして貼り付けし、

 s列で数値の昇り順で並び替えをしてから、

 s列の値が1になっている行を複数選択して削除します。

そんなに手間はかからないかと思いますが、いかがでしょうか?

id:hatezabi

早速のご返信ありがとうございます。

確認させていただきましたが、

=if(iserror(match(r1,[book2]シート名!P:P,0))=true,0,1)

この行を入力すると、ファイルを開くよう言われますので現在使用中のファイルを開き、

値の更新をするシートを選ぶのですが、どちらを選んでも一致不一致関係なく全ての答えが0で返ってきてしまいます。

何かこちらで値を変更すべきところはありますでしょうか?不勉強で申し訳ありません。

また、今後も継続的に行っていく作業ですので、やはりマクロにて作業をしたいと考えておりますので、

引き続き回答を募集させてください。

2008/04/25 13:26:27
id:ekiryu No.2

ekiryu回答回数37ベストアンサー獲得回数02008/04/25 17:27:08

ポイント22pt

隠す代わりに完全に削除したいなら、隠す処理の行を以下の削除にすると行削除します。

Sheets(1).Cells(i, 1).EntireRow.Delete Shift:=xlUp 'セルを削除

ちなみに、隠したセルを選択対象から外してコピーしたい場合、

[ctrl]+[A]でコピーセルを選択した後、[Alt]+[;]で可視セルのみを選択してコピーします。

id:hatezabi

色々試してみたのですが、削除すべきところが一部残ってしまいます。

変更する点が違うのでしょうか?

よろしければ変更する箇所をお教えいただけませんでしょうか。

お手数をお掛けし、申し訳ありません。

2008/04/26 03:09:46
id:ekiryu No.3

ekiryu回答回数37ベストアンサー獲得回数02008/04/25 17:02:06

ポイント35pt

Bookの比較ではないけど、作ってみました。

シートの1番目、2番目を比較して、シート1のシート2に含まれる行を隠します。

新しいマクロの記録で、適当にMacro1を作成して、自動生成されたModule1の中身を以下のプログラムに置き換えてください。

'マクロです

Sub Macro1()

Dim i As Integer

i = 1

While (Sheets(1).Cells(i, 1).Value <> "")

If Check(Mid(Sheets(1).Cells(i, 1).Text, 1, 2) & Sheets(1).Cells(i, 2).Text) = 1 Then

Sheets(1).Cells(i, 1).EntireRow.Hidden = True 'セルを隠す

Else

Sheets(1).Cells(i, 1).EntireRow.Hidden = False 'セルを再表示

End If

i = i + 1

Wend

End Sub

'チェック関数です

Function Check(CheckText As String)

Dim ans As Integer

Dim i As Integer

ans = 0

i = 1

Do While (Sheets(2).Cells(i, 1).Value <> "")

If Mid(Sheets(2).Cells(i, 1).Text, 1, 2) & Sheets(2).Cells(i, 2).Text = CheckText Then

ans = 1

Exit Do

End If

i = i + 1

Loop

Check = ans

End Function

id:hatezabi

ありがとうございます。

試させて頂きましたが、望んでいた通りの表示ができました!

2008/04/26 03:11:43

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • 第41日 マクロについて 回答が2回までなので、回答締め切るまでコメント付けられないみたいで、 締め切る前にトラックバックが読めるのか知らないけど、ここに書いておきます。 マク
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません