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

解決済みの質問

Excelで複数行・複数セルの一括削除、マクロ?

Excelで複数の行・複数のセルの一括削除、一括編集の方法を教えて下さい。住所録の連名づくりに困っています。

Microsoft Office Excel 2007ですでに作成された住所録を、筆ぐるめVer.15へ外部読み込みをして年賀状の宛て名をつくって印刷したいと考えています。

Excelのデータは一人一人1行ずつで作られている為、このまま筆ぐるめで住所録をつくると同じ住所の家族の年賀状が複数枚できてしまう(父に1枚・娘に1枚・母に1枚、という風に)ので、同じ住所の宛先には連名にして1枚で出したいので、連名列を作り代表者の行に一家族分の連名をまとめる作業で手こずっています。

同じ行に1家族分のアドレスが入るように(1行に、代表者漢字氏名・母の名前・子の名前・子の名前2・郵便番号・住所、のように)したかったので、
現在は=RIGHT(B1,3)で、B列にある漢字氏名の後ろから3文字だけをC列、D列、E列に一つずつずらした名前が記入されている状態で、表の形としては、

【1行目】
A列:ヤマダ タロウ/B列:山田 太郎/C: 良子/D:由美子/E:本 松/F:〒/G:住所
【2行目】
A列:ヤマダ リョウコ/B列:山田 良子/C:由美子/D:本 松/E:本 竹/F:〒/G:住所
【3行目】
A列:ヤマダ ユミコ/B列:山田 由美子/C:本 松/D:本 竹/E:本 梅/F:〒/G:住所
【4行目】
A列:ヤマモト マツ/B列:山本 松/C:本 竹/D:本 梅/E:本 桜/F:〒/G:住所

という風になっていて、以下のようにしたいのです。

【1行目】
A列:ヤマダ タロウ/B列:山田 太郎/C:良子/D:由美子/E:/F:〒/G:住所
【2行目】
A列:ヤマモト マツ/B列:山本 松/C:竹/D:梅/E:/桜F:〒/G:住所

≪1≫連名にした家族の行は不要なので行自体を削除したい。
≪2≫氏名の後ろから3文字をコピーしているので「 良子」のように半角スペースが入っているものや、「本 竹」のように1文字の名前のため苗字の一部まで入っているものは、その部分を削除して氏名のみにしたい。
≪3≫1行目E列のように、別の家族の名前まで入ってしまっていたり、連名のいらない人の名前を削除したい。(家族によって、連名が3ついるところもあれば、2つでよかったり、全く連名不要の人もいるので…)

これを地道に一つ一つセルを選択して削除していく以外に何か能率のいい方法はないでしょうか?

名簿が何千件とあるので一つずつこの作業をすると膨大な時間がかかる為、少しでも効率的な作業があれば教えていただきたいのです。

前回の質問で、親切な回答者様から「マクロを使えば」と言っていただきましたが、エクセルをそこそこしか使えない(単純な計算やグラフの作成程度)為、どのようにすれば良いかわかりません。

何かアドバイス、ご享受、していただければと思います。
どうか、宜しくお願いいたします。

投稿日時 - 2010-11-24 12:05:53

QNo.6340679

すぐに回答ほしいです

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

すみません、merlionXXです。
やはりまだ酔ってました。
12人と書きながら、1家族最大11人しか対応してませんでした。
あと、修正のついでに高速化を図ってみました。
名簿が何千件もあるなら少しでも早い方がいいですよね。

Sub test03()
  Dim myDic As Object
  Dim myV, myW
  Dim i As Long, n As Long, j As Long
  Dim ws As Worksheet

  With Sheets("Sheet1")
    myV = .Range("A1", .Cells(Rows.Count, "D").End(xlUp)).Value
  End With
 
  Set myDic = CreateObject("Scripting.Dictionary")
  
  ReDim myW(1 To UBound(myV), 1 To 15)
  For i = 2 To UBound(myV)
    If Not myDic.Exists(myV(i, 4)) Then
      j = j + 1
      myDic.Add myV(i, 4), j
      For n = 1 To 2
        myW(j, n) = Trim(myV(i, n))
      Next n
      For n = 3 To 4
        myW(j, n + 11) = Trim(myV(i, n))
      Next n
    Else
      For n = 3 To 13
        If myW(myDic(myV(i, 4)), n) = Empty Then
          myW(myDic(myV(i, 4)), n) = _
          Mid(Trim(myV(i, 2)), InStr(StrConv(Trim(myV(i, 2)), vbNarrow), " ") + 1)
          Exit For
        End If
      Next n
    End If
  Next i
  
  Set ws = Sheets.Add
  ws.Range("A1").Resize(j, UBound(myW, 2)).Value = myW
End Sub

投稿日時 - 2010-11-25 11:40:22

お礼

ありがとうございました!
お仕事でお疲れのところ、わざわざ処理の早いものまで考慮していただき、申し訳なさいっぱいです;;
本当に、お世話になり、ありがとうございました。

投稿日時 - 2010-11-26 16:48:05

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

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

回答(11)

ANo.10

redchiriさんおはようございます。merlionXXです。
まだ朦朧としております。
さて、補足を拝見しました。

> いえもうこの際筆頭者は家族の中で誰でも構いません。

それなら問題ありません。

> 何とか手作業を省きたい箇所は、同一住所であればまとめることができるか、同一住所で家族として判定してC・D・E列にその住所に人の名前のみを転記できるか、同一住所で筆頭者以外の行を削除できるか、です。

可能です。ただし、住所が「完全一致」していることが条件です。
つまり、東京都大田区田園調布八丁目八番八号と東京都大田区田園調布8-8-8と東京都大田区田園調布8の8の8は別住所とみなされます。
東京都大田区田園調布八丁目八番八号と大田区田園調布八丁目八番八号も別住所とみなされます。大丈夫ですか?

> =RIGHT(B2,3)でとっているので、4文字以上の名前の方は消えてしまっていますし、半角スペースや半角スペースより前の文字は不要ですし、何より、連名列を1行ずつ削除していかなければなりません。
> 自動的に半角より後の文字だけ抜粋できたり、同一住所で判別して連名列に転記してくれれば一番ベストですが、できるのでしょうか?

関数を使用する前のオリジナルのデータに対しておこなうマクロですから4文字以上の名前の考慮は不要でいんですよね?
何文字であろうがあくまで半角スペース以降が名前と見ればいいんですね?

> 最大の人数分列を用意さえすれば、転記可能なのでしょうか?
> 先ほど「筆頭者以外をC、D、E列に(最大4人までの場合ですが)転記」と書かれてましたので、連名は4列までしか不可能なのかと思いましたが、できるのであれば、方法を教えて下さい!

はい、一家族の人数ですから何百人もいるはずはないでしょう?
予想最大人数、たとえば12人とか(笑)でやるとすれば、B列~M列の12列を使えば済みます。
この場合、住所は全家族ともN列になります。

ただ、オリジナルのデータの配置が、ひとり1行を使用しているという以外はっきりしませんね。
オリジナルデータでやりたいと言っているのですから、ちゃんと書いてくれればいいのに。

わからないので以下の前提で行きます。

Sheet1のA列にカタカナ、B列に漢字で苗字と名(半角スペースで区切られている)、C列に郵便番号、D列に住所(住所は、同一家族はすべて完全一致している)
1行目がタイトル行(作業対象外)
2行目からデータ(最終行は問わない)

このデータを
・家族単位に住所でソート
・筆頭者が誰になるかは不定(オリジナルデータの名前の順による。)
・筆頭者以外をC~M列に(最大12人まで対応)転記
・筆頭者以外の行を削除というか、削除したかたちで別な追加シートに転記

というマクロを書いてみました。
酔眼にはちとキツかった~。(~▽~;)

Sub test02()
  Dim myDic As Object
  Dim myV, myW
  Dim i As Long, n As Long, j As Long
  Dim ws As Worksheet

  With Sheets("Sheet1")
    myV = .Range("A1", .Cells(Rows.Count, "D").End(xlUp)).Value
  End With
 
  Set myDic = CreateObject("Scripting.Dictionary")
  Set ws = Sheets.Add
  For i = 2 To UBound(myV)
    If Not myDic.Exists(myV(i, 4)) Then
      j = j + 1
      myDic.Add myV(i, 4), j
      For n = 1 To 2
        ws.Cells(j, n) = Trim(myV(i, n))
      Next n
      For n = 3 To 4
        ws.Cells(j, n + 10) = Trim(myV(i, n))
      Next n
      ws.Cells(j, 14) = Trim(myV(i, 4))
    Else
      ws.Cells(myDic(myV(i, 4)), 13).End(xlToLeft).Offset(, 1) = _
      Mid(Trim(myV(i, 2)), InStr(StrConv(Trim(myV(i, 2)), vbNarrow), " ") + 1)
    End If
  Next i
End Sub

投稿日時 - 2010-11-25 10:34:27

お礼

お礼が遅くなり、すみませんでした。
会社パソコンでしか使えなかったもので…

“オリジナルのデータの配置”というのが何を書けばよかったのかも分からず、どんな情報がいるのか書けずに、推測までさせてすみませんでした。
前提で書いていただいた通りですので、そのままマクロを使わせていただきました。

これで、住所が完全一致のものだけ連名になっているのですよね?
連名の抜粋は、半角より後の文字という認識がされているのですよね?

大変勉強になり、助かりました。
ご丁寧に何度もご回答いただき、お世話になりました。
この度は、本当に、本当にありがとうございました。

投稿日時 - 2010-11-26 16:46:24

ANo.9

こんばんは!
横からお邪魔します。
かなり無理やりって感じになります。

連名列が5列までとして、郵便番号がH列・住所がI列にあるものとしています。
まず、連名列(C~G列の半角スペースより前を削除し、次に苗字と連名をつなげたものがB列にあれば
連名をClearして、最後に住所の重複があれば重複行を削除するようにしてみました。

Sub test()
Columns(1).Insert
Dim i, j As Long
Dim str As String
For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row
For j = 4 To 8
Cells(i, 1) = Left(Cells(i, 3), WorksheetFunction.Find(" ", Cells(i, 3)) - 1)
If Cells(i, j) Like "*" & " " & "*" Then
str = Mid(Cells(i, j), WorksheetFunction.Find(" ", Cells(i, j)) + 1, _
Len(Cells(i, j)) - WorksheetFunction.Find(" ", Cells(i, j)))
Cells(i, j) = Replace(Cells(i, j), Cells(i, j), str)
End If
Next j
Next i
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
For j = 4 To 8
If WorksheetFunction.CountIf(Range("C:C"), Cells(i, 1) & " " & Cells(i, j)) = 0 Then
Cells(i, j).Clear
End If
Next j
Next i
For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If WorksheetFunction.CountIf(Range("J:J"), Cells(i, 10)) > 1 Then
Rows(i).Delete (xlUp)
End If
Next i
Columns(1).Delete (xlToLeft)
End Sub

こんな感じではどうでしょうか?
外していたらごめんなさいね。m(__)m

※追伸
余計なお世話かもしれませんが・・・
当方使用の筆ぐるめVer13(←かなり古い!人間も古い!)では
住所録をCSV形式で保存した場合、連名の列(連名1~5)は
AM・AP・AR・AT・AV列になっているみたいですね。

投稿日時 - 2010-11-24 22:37:05

お礼

お礼が遅くなり、すみませんでした。
会社パソコンでしか使えなかったもので…

ご回答ありがとうございました!

教えていただいた通り実行したのですが、実行時にエラー(Worksheet FunctionクラスのFindプロパティを取得できません)と出てしまい、何度か試してみたのですができませんでした。
私のやり方に問題があったのかもしれませんが、せっかく教えていただきましたのに、すみません。

また、筆ぐるめに関してもありがとうございます!
≫住所録をCSV形式で保存した場合、連名の列(連名1~5)は
≫AM・AP・AR・AT・AV列になっているみたいですね。
すみません、勉強不足でカンマ切りになるということは知っていたのですが…これでも一応関連付けをきちんとすればできるのですよね?

この度は大変勉強になり、助かりました。
いろいろ教えていただきありがとうございました!

投稿日時 - 2010-11-26 16:48:50

ANo.8

ANo.3です。ご希望に添うように考えてみました。
まず、C~E列のデータは不用なのでDeleteキーでクリアします。また、家族8人まで対応するようにF列の前に4列挿入します。
次に、K列の住所をキーにして全体を並べ替えます。家族別に分けられるので、L列に家族の筆頭者のみ「1」と入力します。再度、最優先キーをK列の住所、2番目の優先キーをL列に設定して、全体を並べ替えます。これで筆頭者が家族の先頭になります。
後は次のマクロを実行すればよいです。

Sub EditAddList()
Dim rNum As Long
Dim cNum As Integer
Dim FullName As String

Application.ScreenUpdating = False
rNum = 2
Do Until Cells(rNum, 1).Value = ""
If Cells(rNum, 11).Value = Cells(rNum - 1, 11).Value Then
For cNum = 3 To 9
If Cells(rNum - 1, cNum).Value = "" Then
FullName = Cells(rNum, 2).Value
Cells(rNum - 1, cNum).Value = Right(FullName, Len(FullName) - InStr(FullName, " "))
Exit For
End If
Next cNum
Rows(rNum).Delete
Else
rNum = rNum + 1
End If
Loop
Columns("L").Delete
Application.ScreenUpdating = True
End Sub

投稿日時 - 2010-11-24 20:39:44

お礼

お礼が遅くなり、すみませんでした。
会社パソコンでしか使えなかったもので…

教えていただいた通りマクロを実行いたしましたらできました!
筆頭者を見つけることは何千件もあり困難でしたので、結局、同じ家族をまとめて連盟にさえできれば筆頭者は誰でも可、ということでL列は未記入のまま実行したのですが、家族単位になっており、求めていたデータができました。

来年度分はきちんと筆頭者を整理し、また使わせていただきたいと思っております。

この度は大変勉強になり、助かりました。
ご丁寧に何度もご回答いただき、ありがとうございました。
インターネット上で何もお礼ができずに申し訳ないですが、心から感謝しております。
本当に、本当に、ありがとうございました。

投稿日時 - 2010-11-26 16:50:20

ANo.7

>おっしゃっていただいてます通り、G列には全て住所が記入されており、姓と名の間には必ず半角スペースが入っております。

この条件なら、私の提示した数式ですべて実行できます。

>教えていただいた通り実行したのですが、C列の連名が記入されている一番上のセルを選択して上記の数式をコピー&ペーストで入力したのですが、数式がそのままセルに書き込まれてしまい、その先の作業ができませんでした。

数式が表示されるということは、セルの書式が「文字列」になっていると思われます。

C~E列を選択して、右クリックから「セルの書式設定」で「標準」にして、コピー貼り付けしてみてください。

ただし、上記の数式で表示するセルが多くなると(100行以上になるような場合は)、再計算に時間がかかるので(エクセルがハングアップすることもあります)、オートフィルする範囲を限定して、最後の行以外は数式範囲を「値」にしてオートフィル操作を何度かに分けて実行したほうが確実です。

投稿日時 - 2010-11-24 18:44:41

お礼

お礼が遅くなり、すみませんでした。
会社パソコンでしか使えなかったもので…

教えていただいた通り、セルの書式を標準に変更しましたら、数式が実行できました。
しかし、その後オートフィルすると同じ文字(C1が由美子、だとC2もC3もずっと由美子)になってしまいました。
ちなみに、オートフィル後のC2(書式を挿入した次の行)は
=MID(INDEX($B:$B,SMALL(INDEX(($G$2:$G$1000<>$G$2)*1000+ROW($G$2:$G$1000),),COLUMN(B2)))&"",FIND(" ",$B3)+1,10)
となっていました。

けれど、大変勉強になり、助かりました。
ご丁寧に何度もご回答いただき、ありがとうございました。

投稿日時 - 2010-11-26 16:51:08

ANo.6

> ・家族単位にソート
> ・筆頭者を家族単位の一番先頭行へ
> ・同一住所で家族と判定
> ・筆頭者以外をC、D、E列に転記
> ・筆頭者以外の行を削除

> とするには、どのようにマクロを記述すればいいのでしょうか?

現在のデータがそうなっている(筆頭者が家族単位の一番先頭行にある)とおもっていましたが、そうではないようですね。
同一住所で家族と判定できる、つまり住所は完全一致しているのなら住所でソートをかければ家族単位にはできますね。
でもその中で誰が筆頭者になるのか判別できるキーがありません。
これでは誰もがお手上げです。

> また、上記のようにする場合、筆頭者以外を4人まで連名列を作って転記されたとして、そこに入らなかった人(連名が5以上の場合)の連名にも入らず、行も削除されてしまうのでしょうか?

筆頭者がクリアできた場合、これをどうしたいか決めるのはあなたです。
(最初から予想される最大の人数分、列を用意するとか、あるいは住所の次に備考欄を作って、そっちにもっていくとか)

さて、これから夜の出勤です。
では。

投稿日時 - 2010-11-24 18:41:25

お礼

お仕事前のお忙しいときにいろいろ聞いてしまってすみません。
早々のご回答ありがとうございます。

いえもうこの際筆頭者は家族の中で誰でも構いません。
ようは筆頭者のみ姓名両方有り、連名の人だけ名前のみであればいいので。

何とか手作業を省きたい箇所は、同一住所であればまとめることができるか、同一住所で家族として判定してC・D・E列にその住所に人の名前のみを転記できるか、同一住所で筆頭者以外の行を削除できるか、です。

=RIGHT(B2,3)でとっているので、4文字以上の名前の方は消えてしまっていますし、半角スペースや半角スペースより前の文字は不要ですし、何より、連名列を1行ずつ削除していかなければなりません。
自動的に半角より後の文字だけ抜粋できたり、同一住所で判別して連名列に転記してくれれば一番ベストですが、できるのでしょうか?

最大の人数分列を用意さえすれば、転記可能なのでしょうか?
先ほど「筆頭者以外をC、D、E列に(最大4人までの場合ですが)転記」と書かれてましたので、連名は4列までしか不可能なのかと思いましたが、できるのであれば、方法を教えて下さい!

もしよろしければ、教えていただければ幸いです。

投稿日時 - 2010-11-24 19:10:07

ANo.5

> C列にある名前をD列で消して、そのあとにC列・D列にある名前をE列で消す、ということはできないでしょうか?

複雑怪奇でよくわかりません。
それをやったところで、

> このC列とかぶる名前のみを消す、ということができるなら、削除処理はC列だけで済むので、時間が3分の1以下になるのですが…

また手作業になるのですよね。
なんだか徒労のような気がしてきました。

それよりも、もともとのデータ(1名1行づつなんですよね?)を最初から
・家族単位にソート
・筆頭者を家族単位の一番先頭行へ
(多分、データはもともとそうなっているんでしょうが)

・同一住所で家族と判定
・筆頭者以外をC、D、E列に(最大4人までの場合ですが)転記
・筆頭者以外の行を削除

というマクロを書くほうが、よほど早いのではないかと思います。

ANo1さんが書かれた、「関数で処理をしたデータで例示するのではなく」も、多分そういうことを言っているのだと思います。

投稿日時 - 2010-11-24 16:35:01

お礼

丁寧にありがとうございます!
お手数をおかけしてすみません、ややこしく考え過ぎていました。
上記でおっしゃっていただいている通りにしたいです。

現在1行ごとにカナ氏名・漢字氏名・郵便番号・住所と全ての行と列に記入されており、
A列:半角でカナ氏名(昇順。苗字と名前の間に半角)
B列:漢字氏名(苗字と名前の間に半角)
C・D・E列:B列の氏名の名前だけを抜き出したかったので、=RIGHT(B2,3)で後ろ3文字を抜き出して値化
F列:郵便番号
G列:住所(ただし、A列の昇順(名前の昇順)にしている為、同じ住所がバラバラに記載)

希望は、筆ぐるめに変換できるよう、1行に、代表者カナ氏名・代表者漢字氏名・連名1・連名2・連名3・連名4・連名5・郵便番号・住所 と列を作って記入できればなと思っております。

奇麗にまとめていただいてます通り、
・家族単位にソート
・筆頭者を家族単位の一番先頭行へ
・同一住所で家族と判定
・筆頭者以外をC、D、E列に転記
・筆頭者以外の行を削除

とするには、どのようにマクロを記述すればいいのでしょうか?
また、上記のようにする場合、筆頭者以外を4人まで連名列を作って転記されたとして、そこに入らなかった人(連名が5以上の場合)の連名にも入らず、行も削除されてしまうのでしょうか?

大変お手数をおかけしますが、ご指導宜しくお願いします。

投稿日時 - 2010-11-24 18:21:51

ANo.4

現在のリストのレイアウトがいま一つわからないのですが、G列には住所がすべて(重複した住所を含めて)入力されているリストになっていて、姓と名前の間に必ず半角スペースが入っているという条件なら、以下のような操作でご希望の表を作成することができます。

G列のデータ範囲を選択し(またはリスト範囲にG列だけを指定)、データタブの並べ替えとフィルタの「詳細設定」をクリックし、「重複するレコードは無視する」にチェックを入れOKします。

上記の操作で住所に重複のないデータ(代表者)の一覧にすることができますの、このフィルタされたリストのC列のセル(項目名が1行目ならC2セル)に以下のような数式を入力し、右方向および下方向にオートフィルします。

=MID(INDEX($B:$B,SMALL(INDEX(($G$2:$G$1000<>$G$2)*1000+ROW($G$2:$G$1000),),COLUMN(B1)))&"",FIND(" ",$B2)+1,10)
このデータ範囲をコピーして新規シートに、右クリックから「形式を選択して貼り付け」で「値」貼り付けすれば基本は完成です。

最後に、家族データのない部分は#VALUE!エラーが表示されますので、検索置換、またはオートフィルタでこの値を指定して、空白セルにしてください。

投稿日時 - 2010-11-24 16:22:47

お礼

すみません、そうゆう意味だったんですね。
何が伝わればいいのかがわかっておらず申し訳ないです。

おっしゃっていただいてます通り、G列には全て住所が記入されており、姓と名の間には必ず半角スペースが入っております。

教えていただいた通り実行したのですが、C列の連名が記入されている一番上のセルを選択して上記の数式をコピー&ペーストで入力したのですが、数式がそのままセルに書き込まれてしまい、その先の作業ができませんでした。

現在、全ての列・行に
A列:半角でカナ氏名(苗字と名前の間に半角)
B列:漢字氏名(苗字と名前の間に半角)
C・D・E列:B列の氏名の名前だけを抜き出したかったので、=RIGHT(B2,3)で後ろ3文字を抜き出して値化
F列:郵便番号
G列:住所(ただし、A列の昇順(名前の昇順)にしている為、同じ住所がバラバラの位置にある)

すみません、どのようにすれば良いでしょうか?
住所は教えていただいた通り重複する住所を省くことはできたのですが・・・

投稿日時 - 2010-11-24 18:03:38

ANo.3

住所録があるブックに標準モジュールを挿入して、次のコードをコピーしてください。その後、住所録があるワークシートをアクティブにしてこのマクロを実行すれば、ご希望通りの結果になると思います。

Sub Edit()
Dim rNum As Long
Dim cNum As Integer
Dim FullName As String

Columns("C:E").ClearContents
rNum = 2
Do Until Cells(rNum, 1).Value = ""
If Cells(rNum, 7).Value = Cells(rNum - 1, 7).Value Then
For cNum = 3 To 5
If Cells(rNum - 1, cNum).Value = "" Then
FullName = Cells(rNum, 2).Value
Cells(rNum - 1, cNum).Value = Right(FullName, Len(FullName) - InStr(FullName, " "))
Exit For
End If
Next cNum
Rows(rNum).Delete
Else
rNum = rNum + 1
End If
Loop
End Sub

投稿日時 - 2010-11-24 16:03:01

お礼

ありがとうございます!
多分、こちらを実行するには同じ住所を連続させて固めておかなければならなかったんですよね?
まずそこができていなかったようなので、1個ずつ切り貼りするか、なんとか同じ住所に一括で固められないかがんばってみます。

投稿日時 - 2010-11-24 17:39:04

ANo.2

> ≪1≫連名にした家族の行は不要なので行自体を削除したい。

すでに家族単位でデータがソートされており、筆頭者はその一番上の行である。
家族かどうかの判定は、G列の住所が同一という条件で判断する。
これで良いのであれば可能です。

> ≪2≫氏名の後ろから3文字をコピーしているので「 良子」のように半角スペースが入っているものや、「本 竹」のように1文字の名前のため苗字の一部まで入っているものは、その部分を削除して氏名のみにしたい。

C、D、E列のみ、スペースや、それより前の文字を取り除くということなら面倒だけど出来るでしょう。

> ≪3≫1行目E列のように、別の家族の名前まで入ってしまっていたり、連名のいらない人の名前を削除したい。
>(家族によって、連名が3ついるところもあれば、2つでよかったり、全く連名不要の人もいるので…)

どれが別の家族なのか、どれが不要なのか、これはあなた以外には判別が出来ませんね。

よって、1と2の条件でよければ、マクロで出来ますが、3の条件はどうしようもないので手作業でやってくださいね。

まあ、1と2だけでもマクロでやって残りを手作業で、というところでしょうか。

とりあえず、上記、1と2に対応したコードを書いてみました。
データはSheet1にあるものとして書いていますが、シート名が違っていれば直してください。
いきなり書き換えたりはせず、新しいワークシートを追加して、そこに転記するようにしました。
マクロは自分で書けなくとも使い方はわかるんですよね?
以下は、標準モジュールにコピペしてください。

念のため書いておきますと、

1.新しいBOOKを開き、AltキーとF11キー同時に押し(以下Alt+F11キーと記述)て Visual Basic Editor を呼び出します。
2.Visual Basic Editor のメニューから「挿入」、「標準モジュール」で出てきたコードウィンド(右側の白い広い部分)に以下のコード(Sub~End Sub)をコピペします。

'********これより下**********

Sub test01()
  Dim myDic As Object
  Dim myV, myW
  Dim i As Long, n As Long, j As Long
  Dim ws As Worksheet

  With Sheets("Sheet1")
    myV = .Range("A1", .Cells(Rows.Count, "G").End(xlUp)).Value
  End With
  
  ReDim myW(1 To UBound(myV), 1 To 7)
  Set myDic = CreateObject("Scripting.Dictionary")

  For i = 1 To UBound(myV)
    If Not myDic.Exists(myV(i, 7)) Then
      myDic.Add myV(i, 7), ""
      j = j + 1
      For n = 1 To 7
        If n > 2 And n < 6 Then
          myW(j, n) = Mid(Trim(myV(i, n)), InStr(StrConv(Trim(myV(i, n)), vbNarrow), " ") + 1)
        Else
          myW(j, n) = Trim(myV(i, n))
        End If
      Next n
    End If
  Next i
  
  Set ws = Sheets.Add
  ws.Range("A1").Resize(UBound(myW), 7).Value = myW
  
End Sub

'********これより上**********

3.Alt+F11キーでワークシートへもどります。
4.Alt+F8キーで出てきたマクロ名(test01)を選択して実行します。

投稿日時 - 2010-11-24 13:53:26

お礼

ありがとうございます!
つたない情報の表記の仕方ですみませんでした。
丁寧にマクロの使用法まで記載いただき、大変助かりました。
おかげ様で、データが半分以下になり、思わずパソコン前で手を合わせてしまいました。

あつかましくて申し訳ないのですが、もう少しお教えいただいてもよろしいでしょうか?
≪3≫に関してですが、D列はC列を1行上にずらしたもの、E列はD列を1行上にずらしたものなのですが、(C3=D2=E1、C4=D3=E2…ということ)C列にある名前をD列で消して、そのあとにC列・D列にある名前をE列で消す、ということはできないでしょうか?

置換で消そうかとも思ったのですが、それだと他の人の名前まで消えてしまうのでできませんでした。(例えば、C3:花子、D2:花子、E1:花子、なので、D2とE1の花子を消したいけれど、D15も花子でそちらは消したくない、などで、単純に「花子」という文字だけを消すことはできない。しかも、一つ一つ文字を検索して…とするなら普通にセルをクリックして削除する方が早いので意味がない)

このC列とかぶる名前のみを消す、ということができるなら、削除処理はC列だけで済むので、時間が3分の1以下になるのですが…

※ちなみに、C列・D列・E列ともコピーはしましたが値化してあります。

※C列をコピーしてH列に貼り付け、最初の1行目を削除し、D列とズレを同じにしてみました。
例えば…
   H列   D列
1行 花子   花子
2行(空欄)  太郎
3行(空欄)  みき
4行 次郎   次郎
5行(空欄)  花子

という場合、H列の行とD列の行に同じものがあれば消したいので
   H列   D列
1行 花子  (空欄)
2行(空欄)  太郎
3行(空欄)  みき
4行 次郎  (空欄)
5行(空欄)  花子

という風に、同じ行の違う列のものを一括で消すことってできますでしょうか?

投稿日時 - 2010-11-24 15:38:30

ANo.1

>Excelのデータは一人一人1行ずつで作られている為、このまま筆ぐるめで住所録をつくると同じ住所の家族の年賀状が複数枚できてしまう(父に1枚・娘に1枚・母に1枚、という風に)ので、同じ住所の宛先には連名にして1枚で出したいので、連名列を作り代表者の行に一家族分の連名をまとめる作業で手こずっています。

関数で処理をしたデータで例示するのではなく、上記の元のエクセルファイルのデータの内容とレイアウトを提示されて、それをどのようなレイアウトにしたいのかを説明されたほうが、皆さんから的確な回答が寄せられると思います。

投稿日時 - 2010-11-24 12:52:27

補足

ご回答ありがとうございます。
すみません、私の勉強不足で、「元のエクセルファイルのデータの内容とレイアウトを提示されて、それをどのようなレイアウトにしたいのかを説明」をおっしゃっている部分がよく分からず…どのようなものを提示すれば良いでしょうか?
一応、エクセルに現在表記されているものと、結果どうしたいかを記入例であげさせていただいたのですが…
関数で処理したデータ、というのは…?
データの氏名を変えているだけで、上記の通りです。(本物の氏名・住所は個人情報ですので載せることができません)

投稿日時 - 2010-11-24 13:39:22

お礼

今回はてこずらせてしまいすみませんでした;;
どのように書けば質問としてベストなのか、なんとなく理解できました。
ありがとうございました!

投稿日時 - 2010-11-26 16:53:35