Excel (VBA) |
|
(Windows 11 Pro : Excel 2013)
住所録の連名データを付け加えたい
投稿日時: 26/01/25 13:48:21
投稿者: T_hama
|
|---|---|
|
こんにちは。
|
|
|
|
投稿日時: 26/01/25 19:17:46
投稿者: simple
|
|---|---|
|
こんばんは。
A B C D E F G H I J K 1 No. フリガナ 氏名 連名1 連名2 連名3 連名4 〒 住所1 住所2 会社名 2 100 ヤマダ タロウ 山田 太郎 一郎 二郎 100-0001 XXX YYY ZZZというデータがあったとき、どのようなデータに変更するのか、明示して下さい。 (回答者には、その住所録をどのように使っているのか不明ですから、 どのようにするとよいかまでは回答できません。 それは質問者さんがお考えいただくことです。) 同じ住所録のなかに新しい行を追加するとした場合、 色々なやりかたがあると思いますが、例えば、こんな方針が考えられます。 ・連名があるかどうかを行ごとに判断し、 ・連名があればその下にその連名の個数だけ行を挿入し、 ・そこにいったん現在のデータを仮にコピーします。 ・さらに必要な修正、削除処理を行います。氏名の修正などです。 なお、一人一人にばらした場合、どれがグループに属するかを判定する項目が必要かもしれませんね。 (Noという列がどういう使い方か不明なので、それをどう扱うかも、そちらで決める必要もあるでしょう。) なお、その処理は、最後の行から上に遡って処理すると良いでしょう。 ・上からやっていくと、挿入処理によって作業対象の行番号が変化してしまって、扱いが複雑になります。 ・下から遡って処理していけば、挿入処理による影響が避けられます。 (普通の For k= "最終行の行番号" To 2 Step -1 とすればよいです。) |
|
|
|
投稿日時: 26/01/25 21:09:58
投稿者: T_hama
|
|---|---|
|
simpleさま
|
|
|
|
投稿日時: 26/01/26 09:02:28
投稿者: T_hama
|
|---|---|
|
おはようございます。
No. フリガナ 氏名 連名1 連名2 連名3 連名4 〒 住所1 住所2 会社名 1 ヤマダ タロウ 山田 太郎 一郎 二郎 100-0001 XXX YYY ZZZ 2 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg が元セルとして、其の横へ M N O P Q R S T U V W X No. フリガナ 氏名 連名1 連名2 連名3 連名4 〒 住所1 住所2 会社名 宛名 100 ヤマダ タロウ 山田 太郎 一郎 二郎 100-0001 XXX YYY ZZZ 山田 太郎 100 ヤマダ タロウ 山田 太郎 一郎 二郎 100-0001 XXX YYY ZZZ 山田 一郎 100 ヤマダ タロウ 山田 太郎 一郎 二郎 100-0001 XXX YYY ZZZ 山田 二郎 101 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg 鈴木 花子 101 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg 鈴木 1子 101 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg 鈴木 2子 101 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg 鈴木 3子 101 スズキ ハナコ 鈴木 花子 1子 2子 3子 4子 777-7777 aaa ccc ggg 鈴木 4子 と言う風に、置きたいのですが、マクロが作れません。 何卒よろしくお願いします。 |
|
|
|
投稿日時: 26/01/26 09:28:17
投稿者: simple
|
|---|---|
Sub test()
Dim k As Long, n As Long
Dim j As Long, pos As Long
For k = 3 To 2 Step -1
n = Application.CountA(Cells(k, "D").Resize(1, 4)) '連名の個数
Cells(k, "A").Resize(1, 12).Copy
Cells(k + 1, "A").Resize(n, 12).Insert Shift:=xlDown
'宛先の追加
Cells(k, "L") = Cells(k, "C") '元データへの追加
For j = 1 To n '増幅データへの追加
pos = InStr(Cells(k, "C"), " ")
Cells(k + j, "L") = Left(Cells(k, "C"), pos) & Cells(k + j, 3 + j)
Next
Next
Application.CutCopyMode = False
End Sub連名ありのデータをそのままの列で修正するものです。新たな仕様変更はそちらで対応して下さい。
作成にあたっての考え方も示したのですから、少しはご自分でトライする姿勢くらい見せて欲しかった。 (作成依頼は禁止事項に挙げられています。) T_hamaさんは、2012年10月にコードを作成されたうえで質問されています。(私の記録によるとw) 今後は、それと同じように、トライしたうえで質問して下さい。 作成依頼なら生成AIを使って下さい。 |
|
|
|
投稿日時: 26/01/26 10:47:10
投稿者: T_hama
|
|---|---|
|
simpleさま
|
|
|
|
投稿日時: 26/01/26 11:10:01
投稿者: simple
|
|---|---|
|
1行目は見出し、2行目以下にデータがあり、最終行までが対象範囲なら
For k = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1としてください。 |
|
|
|
投稿日時: 26/01/26 12:31:00
投稿者: T_hama
|
|---|---|
simple さんの引用: お教えの通りにSub test()を Sub test2()として、実行しました。 完璧でした!希望通りになりました。 マクロの記述を見返して、 とても到達できる域ではございません。 この様なマクロが、出来得るには 数千回以上の試行錯誤があって、到達為されたのだと・・・ 本当に、上澄を頂くようで、恐縮です。今後は、 丸投げしないように努めて参ります。お礼申し上げます。 誠にありがとうございました。本当に助かりました。 拝礼させて頂きます。感謝申し上げます。 Sub test2()
Dim k As Long, n As Long
Dim j As Long, pos As Long
For k = Cells(Rows.Count, "A").End(xlUp).Row To 2 Step -1
n = Application.CountA(Cells(k, "D").Resize(1, 4)) '連名の個数
Cells(k, "A").Resize(1, 12).Copy
Cells(k + 1, "A").Resize(n, 12).Insert Shift:=xlDown
'宛先の追加
Cells(k, "L") = Cells(k, "C") '元データへの追加
For j = 1 To n '増幅データへの追加
pos = InStr(Cells(k, "C"), " ")
Cells(k + j, "L") = Left(Cells(k, "C"), pos) & Cells(k + j, 3 + j)
Next
Next
Application.CutCopyMode = False
End Sub
|
|



