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

このQ&Aのポイント
  • Excelで複数の行・複数のセルの一括削除、一括編集の方法を教えて下さい。
  • 住所録の連名づくりに困っています。
  • 名簿が何千件とあるので一つずつこの作業をすると膨大な時間がかかる為、少しでも効率的な作業があれば教えていただきたいのです。
回答を見る
  • ベストアンサー

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つでよかったり、全く連名不要の人もいるので…) これを地道に一つ一つセルを選択して削除していく以外に何か能率のいい方法はないでしょうか? 名簿が何千件とあるので一つずつこの作業をすると膨大な時間がかかる為、少しでも効率的な作業があれば教えていただきたいのです。 前回の質問で、親切な回答者様から「マクロを使えば」と言っていただきましたが、エクセルをそこそこしか使えない(単純な計算やグラフの作成程度)為、どのようにすれば良いかわかりません。 何かアドバイス、ご享受、していただければと思います。 どうか、宜しくお願いいたします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.11

すみません、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

redchiri
質問者

お礼

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

その他の回答 (10)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.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

redchiri
質問者

お礼

お礼が遅くなり、すみませんでした。 会社パソコンでしか使えなかったもので… “オリジナルのデータの配置”というのが何を書けばよかったのかも分からず、どんな情報がいるのか書けずに、推測までさせてすみませんでした。 前提で書いていただいた通りですので、そのままマクロを使わせていただきました。 これで、住所が完全一致のものだけ連名になっているのですよね? 連名の抜粋は、半角より後の文字という認識がされているのですよね? 大変勉強になり、助かりました。 ご丁寧に何度もご回答いただき、お世話になりました。 この度は、本当に、本当にありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.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列になっているみたいですね。

redchiri
質問者

お礼

お礼が遅くなり、すみませんでした。 会社パソコンでしか使えなかったもので… ご回答ありがとうございました! 教えていただいた通り実行したのですが、実行時にエラー(Worksheet FunctionクラスのFindプロパティを取得できません)と出てしまい、何度か試してみたのですができませんでした。 私のやり方に問題があったのかもしれませんが、せっかく教えていただきましたのに、すみません。 また、筆ぐるめに関してもありがとうございます! ≫住所録をCSV形式で保存した場合、連名の列(連名1~5)は ≫AM・AP・AR・AT・AV列になっているみたいですね。 すみません、勉強不足でカンマ切りになるということは知っていたのですが…これでも一応関連付けをきちんとすればできるのですよね? この度は大変勉強になり、助かりました。 いろいろ教えていただきありがとうございました!

  • hananoppo
  • ベストアンサー率46% (109/235)
回答No.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

redchiri
質問者

お礼

お礼が遅くなり、すみませんでした。 会社パソコンでしか使えなかったもので… 教えていただいた通りマクロを実行いたしましたらできました! 筆頭者を見つけることは何千件もあり困難でしたので、結局、同じ家族をまとめて連盟にさえできれば筆頭者は誰でも可、ということでL列は未記入のまま実行したのですが、家族単位になっており、求めていたデータができました。 来年度分はきちんと筆頭者を整理し、また使わせていただきたいと思っております。 この度は大変勉強になり、助かりました。 ご丁寧に何度もご回答いただき、ありがとうございました。 インターネット上で何もお礼ができずに申し訳ないですが、心から感謝しております。 本当に、本当に、ありがとうございました。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.7

>おっしゃっていただいてます通り、G列には全て住所が記入されており、姓と名の間には必ず半角スペースが入っております。 この条件なら、私の提示した数式ですべて実行できます。 >教えていただいた通り実行したのですが、C列の連名が記入されている一番上のセルを選択して上記の数式をコピー&ペーストで入力したのですが、数式がそのままセルに書き込まれてしまい、その先の作業ができませんでした。 数式が表示されるということは、セルの書式が「文字列」になっていると思われます。 C~E列を選択して、右クリックから「セルの書式設定」で「標準」にして、コピー貼り付けしてみてください。 ただし、上記の数式で表示するセルが多くなると(100行以上になるような場合は)、再計算に時間がかかるので(エクセルがハングアップすることもあります)、オートフィルする範囲を限定して、最後の行以外は数式範囲を「値」にしてオートフィル操作を何度かに分けて実行したほうが確実です。

redchiri
質問者

お礼

お礼が遅くなり、すみませんでした。 会社パソコンでしか使えなかったもので… 教えていただいた通り、セルの書式を標準に変更しましたら、数式が実行できました。 しかし、その後オートフィルすると同じ文字(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) となっていました。 けれど、大変勉強になり、助かりました。 ご丁寧に何度もご回答いただき、ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

> ・家族単位にソート > ・筆頭者を家族単位の一番先頭行へ > ・同一住所で家族と判定 > ・筆頭者以外をC、D、E列に転記 > ・筆頭者以外の行を削除 > とするには、どのようにマクロを記述すればいいのでしょうか? 現在のデータがそうなっている(筆頭者が家族単位の一番先頭行にある)とおもっていましたが、そうではないようですね。 同一住所で家族と判定できる、つまり住所は完全一致しているのなら住所でソートをかければ家族単位にはできますね。 でもその中で誰が筆頭者になるのか判別できるキーがありません。 これでは誰もがお手上げです。 > また、上記のようにする場合、筆頭者以外を4人まで連名列を作って転記されたとして、そこに入らなかった人(連名が5以上の場合)の連名にも入らず、行も削除されてしまうのでしょうか? 筆頭者がクリアできた場合、これをどうしたいか決めるのはあなたです。 (最初から予想される最大の人数分、列を用意するとか、あるいは住所の次に備考欄を作って、そっちにもっていくとか) さて、これから夜の出勤です。 では。

redchiri
質問者

お礼

お仕事前のお忙しいときにいろいろ聞いてしまってすみません。 早々のご回答ありがとうございます。 いえもうこの際筆頭者は家族の中で誰でも構いません。 ようは筆頭者のみ姓名両方有り、連名の人だけ名前のみであればいいので。 何とか手作業を省きたい箇所は、同一住所であればまとめることができるか、同一住所で家族として判定してC・D・E列にその住所に人の名前のみを転記できるか、同一住所で筆頭者以外の行を削除できるか、です。 =RIGHT(B2,3)でとっているので、4文字以上の名前の方は消えてしまっていますし、半角スペースや半角スペースより前の文字は不要ですし、何より、連名列を1行ずつ削除していかなければなりません。 自動的に半角より後の文字だけ抜粋できたり、同一住所で判別して連名列に転記してくれれば一番ベストですが、できるのでしょうか? 最大の人数分列を用意さえすれば、転記可能なのでしょうか? 先ほど「筆頭者以外をC、D、E列に(最大4人までの場合ですが)転記」と書かれてましたので、連名は4列までしか不可能なのかと思いましたが、できるのであれば、方法を教えて下さい! もしよろしければ、教えていただければ幸いです。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

> C列にある名前をD列で消して、そのあとにC列・D列にある名前をE列で消す、ということはできないでしょうか? 複雑怪奇でよくわかりません。 それをやったところで、 > このC列とかぶる名前のみを消す、ということができるなら、削除処理はC列だけで済むので、時間が3分の1以下になるのですが… また手作業になるのですよね。 なんだか徒労のような気がしてきました。 それよりも、もともとのデータ(1名1行づつなんですよね?)を最初から ・家族単位にソート ・筆頭者を家族単位の一番先頭行へ (多分、データはもともとそうなっているんでしょうが) ・同一住所で家族と判定 ・筆頭者以外をC、D、E列に(最大4人までの場合ですが)転記 ・筆頭者以外の行を削除 というマクロを書くほうが、よほど早いのではないかと思います。 ANo1さんが書かれた、「関数で処理をしたデータで例示するのではなく」も、多分そういうことを言っているのだと思います。

redchiri
質問者

お礼

丁寧にありがとうございます! お手数をおかけしてすみません、ややこしく考え過ぎていました。 上記でおっしゃっていただいている通りにしたいです。 現在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以上の場合)の連名にも入らず、行も削除されてしまうのでしょうか? 大変お手数をおかけしますが、ご指導宜しくお願いします。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.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!エラーが表示されますので、検索置換、またはオートフィルタでこの値を指定して、空白セルにしてください。

redchiri
質問者

お礼

すみません、そうゆう意味だったんですね。 何が伝わればいいのかがわかっておらず申し訳ないです。 おっしゃっていただいてます通り、G列には全て住所が記入されており、姓と名の間には必ず半角スペースが入っております。 教えていただいた通り実行したのですが、C列の連名が記入されている一番上のセルを選択して上記の数式をコピー&ペーストで入力したのですが、数式がそのままセルに書き込まれてしまい、その先の作業ができませんでした。 現在、全ての列・行に A列:半角でカナ氏名(苗字と名前の間に半角) B列:漢字氏名(苗字と名前の間に半角) C・D・E列:B列の氏名の名前だけを抜き出したかったので、=RIGHT(B2,3)で後ろ3文字を抜き出して値化 F列:郵便番号 G列:住所(ただし、A列の昇順(名前の昇順)にしている為、同じ住所がバラバラの位置にある) すみません、どのようにすれば良いでしょうか? 住所は教えていただいた通り重複する住所を省くことはできたのですが・・・

  • hananoppo
  • ベストアンサー率46% (109/235)
回答No.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

redchiri
質問者

お礼

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

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.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)を選択して実行します。

redchiri
質問者

お礼

ありがとうございます! つたない情報の表記の仕方ですみませんでした。 丁寧にマクロの使用法まで記載いただき、大変助かりました。 おかげ様で、データが半分以下になり、思わずパソコン前で手を合わせてしまいました。 あつかましくて申し訳ないのですが、もう少しお教えいただいてもよろしいでしょうか? ≪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行(空欄)  花子 という風に、同じ行の違う列のものを一括で消すことってできますでしょうか?

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.1

>Excelのデータは一人一人1行ずつで作られている為、このまま筆ぐるめで住所録をつくると同じ住所の家族の年賀状が複数枚できてしまう(父に1枚・娘に1枚・母に1枚、という風に)ので、同じ住所の宛先には連名にして1枚で出したいので、連名列を作り代表者の行に一家族分の連名をまとめる作業で手こずっています。 関数で処理をしたデータで例示するのではなく、上記の元のエクセルファイルのデータの内容とレイアウトを提示されて、それをどのようなレイアウトにしたいのかを説明されたほうが、皆さんから的確な回答が寄せられると思います。

redchiri
質問者

お礼

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

redchiri
質問者

補足

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

関連するQ&A

  • エクセル:複数セルからの参照

    お世話になります。 A,B,C列にデータが入っています。 D,E,F列に参照のためのデータがあります。 A,B,C列はそれぞれD,E,F列に対応しています。 A,B,C列と同じ並びのデータが入っている行をD,E,F列から探し、その隣のG列の値をH列に返す。 D,E,F列の並びが重複する行はありません。 A,D列は場所の名前、B,C,E,F列には数字が入っている。 例) A1に事務室 B1に20 C1に3 が入っているとする。 D/E/F列が 事務室/20/3 の並びになっているのが10行目の場合、H1にG10のセルの値を返す。 この場合、H列にはどんな計算式を入れておけばよいのでしょうか? A,B,C列と同じ並びのデータがD,E,F列で見つからない場合は空白をH列に返す。 ちなみにD/E/F列が 事務室/20/3 の並びになっている行は10行目しかないです。 よろしくお願いします。

  • エクセル 複数行ある同一商品を1行にまとめるには?

    同一内容が入力された複数行の合計を出す方法を教えてください。     エクセルの表でA列に商品名、B列に色の種類、C列~E列にサイズごとの個数がある、まったく同じ商品が、複数行にランダムに掲載されています。 A列、B列で同一の情報を持つ商品について、C列~E列のサイズごとの合計を出したいのです。 例)商品名、色、サイズ個数(C列:Sサイズ、D列:Mサイズ、E列:Lサイズの順です。) A1:Tシャツ B1:ホワイト C1:5 D1:4 E1:3   A2:Tシャツ B2:ブラック C2:3 D2:5 E2:5 A3: Tシャツ B2:ホワイト C3:3 D3:3 E3:2 A4: Tシャツ B2:ブラック C4:3 D4:2 E4:3 各商品が300行程あり、オートサムではやりきれません。 すべての各商品(A列、B列が一致するもの)を1行ごとにまとめたシートを作成するにはどうしたら良いでしょうか?

  • Excelでマクロを使用した削除に関して

    マクロ初心者です。 Excelにて、以下のような表データがあるとします。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50  a   b   c   d 3行  51  e   f    g   h    4行  52  i    j    k   l この表の中で、A列と1行目の値が同じになる交点となるセルの値"以外"を 削除して以下のように表示させたいのですが、 その方法がわかりません。     A列 B列 C列 D列 E列 … 1行      51  50  52  51    2行  50      b       3行  51  e          h    4行  52          k    単純な行削除・列削除ではないため、 頓挫しています。お知恵を拝借したく、よろしくおねがいします。

  • エクセルマクロ、空白行(セル)の挿入

    データがA、B、C、D、E列100行まであります。 このうちD、E列を除き、エクセルのマクロで1行ごとに空白で10行挿入したいです。 (A、B、C、D列のデータに空白セルを10行分挿入し、下にシフトするイメージ。D、E列はそのまま。) ご教授頂きたく、お願いします。

  • excel  複数行をまとめる 一括変換

    データ整理で困っております。 皆様のお知恵を拝借したくお願いいたします。 EXCELシートで次のようなデータがあります。   A B C D E F G H I J K 1 1 あ い 2  う え 3  お か 4  き く 5  け こ 列はA,B,Cのみにデータがあります。 行は1~5にあります。 A1は連番で数字があります。 この5行のデータが400近くあります。(約2,000行) このシートが10ほど存在します。 これらのシートを次のように1行に変換したいのです。   A B C D E F G H I J K 1 1 あ い う え お か き く け こ 2  3  4  5  行2~5はブランクのままでもかまいません。 何卒よろしくお願いいたします。

  • Excelで複数行を1行にするマクロについて

    Excel2000で3行を繰り返し、1つの行にまとめていくマクロの書き方についてご教授ください。 例えば下記のような並びの時、 A B C D E F G H I ..... マクロを使って、 A B C D E F G H I ...... のようにしたいと考えています。

  • エクセル 特定セルの足し算をするマクロ

    C列、D列、E列を足し合計をF列に記入するマクロを教えて下さい。 (3行目から値のある行まで。)  A B  C  D  E   F 1 2 3     24  16  19  59となる様に 4     35  49  41 5     22  19  72 6     ・   ・   ・ 7     ・   ・   ・ 宜しくお願いします。

  • エクセルで列を複数行にしたいのですが

    注文表を商品ごとに集計したいのですが、商品名・数が列の入っています。これを縦にして集計しようと思っているのですが、列を行する方法を教えてください。 エクセルの表で列A・Bを共通にして列C・Dを次の行に、そして列E・Fを次の行にとしたいのですが、教えてください。 列A 列B   列C  列D 列E 列F 001 ○○会社 商品A 10  商品F 14 001 ○○会社 商品C 11  商品A 20 005 ××会社 商品D 32  商品C 25 これを 列A 列B   列C  列D 列E 列F 001 ○○会社 商品A 10  001 ○○会社 商品F 14  001 ○○会社 商品C 11  001 ○○会社 商品A 20  005 ××会社 商品D 32  005 ××会社 商品C 25 よろしくお願いいたします。

  • EXCELでマクロを使用して表を作成するには?

    EXCEL2000にて、“マクロ”を使って必要事項を入力すれば、下記のような流れで自動的に表を作成することは可能でしょうか? 1.必要事項を入力。     A列    B列      C列 A行 (工事名) (名前)  (作業時間) B行  下水    タナカ    10.0 C行  下水    ヤマダ    8.0 D行  上水     スズキ    5.5 E行  道路    スズキ    2.0 F行  道路    タナカ    4.5 G行  上水    カトウ    15.0 2.別のシートに1で入力した内容を集計     A列  B列   C列    D列   E列 A行      タナカ  ヤマダ  スズキ  カトウ  B行  下水  10.0   8.0     0.0    0.0 C行  上水   0.0    0.0     5.5   15.0 D行  道路   4.5    0.0    2.0    0.0 私自身は関数(SUMPRODUCT)かピボットテーブルでなら、どうにか作成できるのですがマクロに関しては初心者で、ほとんどわかりません。 現在、入門書を購入して最初の項目を勉強中ですが、業務上、急いで作成しないといけないため、どなたかお教えいただけないでしょうか? どうぞよろしくお願いいたします。

  • 重複する内容のセルを含む行を削除するには?/excel

    こんにちは。 excelのデータで 例) 名前  中身 ランク  ←タイトル行 天丼  エビ 梅 天丼  エビ 竹 カツ丼 お肉 梅 カツ丼 お肉 松 カツ丼 お肉 竹 のような重複したデータがありまして、"中身"のセルが重複している行のうち、1行だけ残して残りの重複している行を削除したいのです。 例:結果としてこういう形になる方法を探しています) 名前  中身 ランク  ←タイトル行 天丼  エビ 竹 カツ丼 お肉 梅 エクセルの解説本などをいろいろ読んでみたのですがどうにもうまい方法が見つかりません。 なにか良いアイデアお持ちでしたらどうか教えてください。

専門家に質問してみよう