マクロを使用してエクセル2013でセルの値から行を挿入して転記する方法

このQ&Aのポイント
  • エクセル2013で、セルの値から行を挿入して転記するマクロを作成したいです。
  • セルに入力された数字をカンマで区切り、カンマの数に応じて行を挿入し、カンマで区切られた数字を転記します。
  • 配列を使用しない方法でも実現できますが、配列を使用すると効率的に処理できます。どのような方法が最適か、アドバイスをいただきたいです。
回答を見る
  • ベストアンサー

マクロ、セルの値から行挿入して転記する方法

エクセル2013です。 セルA1に 1,8,9,15 セルA2に 7,12 セルA3に 20,14,28 と入力されているとします。 For~Nextで回して セルA1のカンマの数を InStr関数で数えて カンマが3個だから その3を変数に入れて それを利用して A2から3行行挿入します。 で カンマで区切られた順に A1には1 A2には8 A3には9 A4には15 と転記させる カンマは消してしまう で、この時点で 元々セルA2だった所は セルA5になっていて 7,12 が入力されているはずです。 で同じくそこを見させて カンマが1個だから A5の下に1行挿入したうえで A5に7 A6に12 と転記 カンマは消す。 すると元々セルA3だった所は セルA7になっていて そこには20,14,28が入力されているはず ここも同じように処理し 下の列へ進めて行く。 カンマが無いセルは 行挿入せず この処理はしないで A列のデータが有る最終行まで 繰り返す。 と いうマクロを作成したいのですが どういう方法で行えばいいか うまく思いつきません。 配列は苦手でなのですが 配列を使わないと無理でしょうか? どうかよろしくお願いします。

  • gx9wx
  • お礼率95% (440/460)

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7995/17090)
回答No.11

#1 & #6 です。 > すべての行が元々1行名のA1~E1になってしまいます。 これに関しては申し訳ない。改造しておきました。 > そういう意味では全列挿入の方がよかったのかな?です。 これに関しても,そのように改造しておきました。 Sub Sample() Set key = Range("F1") 'カンマの入ったデータ列の最初の行 Set Rng = Range("A1:E1") '同時に行挿入する列の最初の行 Do If key.Value = "" Then Exit Do 'keyが空白ならループ脱出 i = InStr(key, ",") 'keyの最初のカンマの位置を調べる If i <> 0 Then 'keyの中にカンマの位置が見つかれば key.Offset(1).EntireRow.Insert Shift:=xlDown 'keyのセルの1行下に空白行を挿入 kv = key.Value 'keyの値をいったん覚えて key.Value = Left(kv, i - 1) 'keyの値のi-1文字目までをkeyのセルに入れる Set key = key.Offset(1) 'keyを1行下に変更して key.Value = Right(kv, Len(kv) - i) '元のkeyの値のi+1文字目から最後までを新しいkeyのセルに入れる Rng.Copy Rng.Offset(1) 'rngのセルの内容を1行下にコピー Set Rng = Rng.Offset(1) 'rngを1行下に変更 Else 'keyの中にカンマの位置が見つからなければ Set key = key.Offset(1) 'keyを1行下に変更 Set Rng = Rng.Offset(1) 'rngを1行下に変更 End If Loop Application.CutCopyMode = False End Sub

gx9wx
質問者

お礼

ありがとうございます。 手作業と同じイメージで動作します。 また、中身も解読できました。 これなら、私の能力でも多少の改造もできそうですし、 他へ流用も可能そうです。 処理したいエクセルファイルによって違いますが、 データは100~300行でして、 F列の値がカンマ無しの1個だけの行が少なければいいのですが カンマが有る行の多さと、セル内のカンマの数(50個もある場合が) の多さもにも左右され、処理が終わると最終的な行数は、何十倍にもなります。 これを約100ファイルやらなければいけません。 平行で手作業でやってもらっていますが、拉致が空きません。 このコードで、一気に作業が加速すると思います。 ご丁寧に説明していただき、ありがとうございました。

その他の回答 (13)

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.3

No2です。 配列を使わないで > For~Nextで回して > セルA1のカンマの数を > InStr関数で数えて > カンマが3個だから > その3を変数に入れて > それを利用して > A2から3行行挿入します。 このイメージのようにしてみました。 Sub Test2() Dim i As Long, j As Long Dim n As Long, Count As Long Dim mStr As String, buf As String For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 mStr = Cells(i, "A").Value Count = 0: n = 0 Do n = InStr(n + 1, mStr, ",") If n = 0 Then Exit Do Else Count = Count + 1 End If Loop If Count > 0 Then Range(Cells(i, "A"), Cells(i + Count - 1, "A")).Insert (xlShiftDown) mStr = mStr & "," For j = 1 To Count + 1 Cells(i + j - 1, "A").Value = Left(mStr, InStr(mStr, ",") - 1) mStr = Mid(mStr, InStr(mStr, ",") + 1) Next j End If Next i End Sub

gx9wx
質問者

お礼

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

gx9wx
質問者

補足

ありがとうございます。 私の能力では解読に 時間がかかりそうです。 あと大変申し訳ありません。 説明不足でした。 考え方を知りたくて 例 で質問してしまいました。 本番で実行したいのは カンマが入ったデータはF列でして、F列を基準に処理を行うのですが A~E列にも別なデータが有ります。 行挿入したら、A~E列はデータは変化させないで、 そのまま行だけ下がらせたいです。 セルF1に1,2,3 セルA1にあ セルB1に五 セルC1にア セルD1にA セルE1に本 と入力されていたとして F1のセルのカンマは2個ですから 2行下がります。 F1に1 F2に2 F3に3 でももともと1行目にあった各データ をそのまま挿入された行に転記したいので セルA1、A2、A3にあ セルB1、B2、B3に五 セルC1、C2、C3にア セルD1、D2、D3にA セルE1、E2、E3に本 という具合です。 教えていただきました内容を、試しましたが 勿論、質問どうりに正しく動きました。 教えていただいたのはA列を基準ですから B列からF列に仮データを入力して試したのですが A列のみのデータが変化し、B列以降のデータは 行は下がらずそのままの位置に固定されたままです。 キチンと説明しなかったので当然なのですが。 ちょっと、私の能力では、教えていただいたコードを 改造し自分が求めるコードにするのは困難です。 申しわけございません。 処理が理解できた回答NO.1のf272様のコードを 別な処理も含めて改造してみた物の 自分が求める様には改造できませんでした。 最初からきちんと質問すべきで回答していただいた皆様に ご迷惑をおかけしてしまいました。 お手数をおかけして申し訳ございませんでした。 Sub 挿入() Dim 挿入数 Dim 元値 Dim 選択行 Dim 複写行 Range("F4").Select Do 元値 = Selection If 元値 = "" Then Exit Do 'セルの値が空白ならDoを抜ける 挿入数 = InStr(元値, ",") 'カンマの数を数えて挿入数に代入 If 挿入数 <> 0 Then '挿入数が0以外なら処理続行。0ならELSEへ Selection.Offset(1).Insert Shift:=xlDown '行挿入 Selection = Left(元値, 挿入数 - 1) '元値を変換して転記 Selection.Offset(1).Select 選択行 = Selection.Row 複写行 = 選択行 - 1 Range(Cells(複写行, 1), Cells(複写行, 5)).Copy Range(Cells(選択行, 1), Cells(選択行, 5)).PasteSpecial Application.CutCopyMode = False Selection = Right(元値, Len(元値) - 挿入数) '元値から転記済を除いて転記 Else Selection.Offset(1).Select End If Loop End Sub

  • kkkkkm
  • ベストアンサー率65% (1606/2443)
回答No.2

配列を使いますが・・・ Sub Test() Dim mStr As Variant Dim i As Long, j As Long For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 mStr = Split(Cells(i, "A"), ",") If UBound(mStr) > 0 Then Range(Cells(i, "A"), Cells(i + UBound(mStr) - 1, "A")).Insert (xlShiftDown) For j = LBound(mStr) To UBound(mStr) Cells(i + j, "A").Value = mStr(j) Next j End If Next i End Sub

gx9wx
質問者

お礼

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

gx9wx
質問者

補足

ありがとうございます。 やはり配列は、難しいです。 昔1回作成したことが有りますが 今見ると解読できないので まだ身についておりません。 あと大変申し訳ありません。 説明不足でした。 考え方を知りたくて 例 で質問してしまいました。 本番で実行したいのは カンマが入ったデータはF列でして、F列を基準に処理を行うのですが A~E列にも別なデータが有ります。 行挿入したら、A~E列はデータは変化させないで、 そのまま行だけ下がらせたいです。 セルF1に1,2,3 セルA1にあ セルB1に五 セルC1にア セルD1にA セルE1に本 カンマは2個ですから 2行下がります。 F1に1 F2に2 F3に3 セルA1、A2、A3にあ セルB1、B2、B3に五 セルC1、C2、C3にア セルD1、D2、D3にA セルE1、E2、E3に本 という具合です。 教えていただきました内容を、試しましたが 勿論、質問どうりに正しく動きました。 教えていただいたのはA列を基準ですから B列からF列に仮データを入力して試したのですが A列のみのデータが変化し、B列以降のデータは 行は下がらずそのままの位置に固定されたままです。 キチンと説明しなかったので当然なのですが。 ちょっと、私の能力では、教えていただいたコードを 改造し自分が求めるコードにするのは困難です。 申しわけございません。 処理が理解できた回答NO.1のf272様のコードを 別な処理も含めて改造してみた物の 自分が求める様には改造できませんでした。 最初からきちんと質問すべきで回答していただいた皆様に ご迷惑をおかけしてしまいました。 お手数をおかけして申し訳ございませんでした。 Sub 挿入() Dim 挿入数 Dim 元値 Dim 選択行 Dim 複写行 Range("F4").Select Do 元値 = Selection If 元値 = "" Then Exit Do 'セルの値が空白ならDoを抜ける 挿入数 = InStr(元値, ",") 'カンマの数を数えて挿入数に代入 If 挿入数 <> 0 Then '挿入数が0以外なら処理続行。0ならELSEへ Selection.Offset(1).Insert Shift:=xlDown '行挿入 Selection = Left(元値, 挿入数 - 1) '元値を変換して転記 Selection.Offset(1).Select 選択行 = Selection.Row 複写行 = 選択行 - 1 Range(Cells(複写行, 1), Cells(複写行, 5)).Copy Range(Cells(選択行, 1), Cells(選択行, 5)).PasteSpecial Application.CutCopyMode = False Selection = Right(元値, Len(元値) - 挿入数) '元値から転記済を除いて転記 Else Selection.Offset(1).Select End If Loop End Sub

  • f272
  • ベストアンサー率46% (7995/17090)
回答No.1

配列を使いたくないなら,こんな感じ Sub Sample() Range("a1").Select Do a = Selection If a = "" Then Exit Do i = InStr(a, ",") If i <> 0 Then Selection.Offset(1).Insert Shift:=xlDown Selection = Left(a, i - 1) Selection.Offset(1).Select Selection = Right(a, Len(a) - i) Else Selection.Offset(1).Select End If Loop End Sub

gx9wx
質問者

お礼

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

gx9wx
質問者

補足

ありがとうございます。 これでしたら、私でもわかります。 ただ説明不足でした。 考え方を知りたくて例で質問してしまいました。 やりたいのは カンマが入ったデータはF列でして、A~E列にもデータが有ります。 行挿入したら、A~E列も一緒に下がってほしいのですが 教えていただきました内容を、F列に置き換えて 別な処理も含めて作成しましたが F列だけが単独で行挿入されてしまいます。 Selection.Offset(1).Insert Shift:=xlDown の部分を改造しないといけないのかと思っているのですが 思うようにいきません。 考え方を教えてもらい、あとは自力でと 思ったのですが、能力不足でできません。 申しわけございません。 Sub 挿入() Dim 挿入数 Dim 元値 Dim 選択行 Dim 複写行 Range("F4").Select Do 元値 = Selection If 元値 = "" Then Exit Do 'セルの値が空白ならDoを抜ける 挿入数 = InStr(元値, ",") 'カンマの数を数えて挿入数に代入 If 挿入数 <> 0 Then '挿入数が0以外なら処理続行。0ならELSEへ Selection.Offset(1).Insert Shift:=xlDown '行挿入 Selection = Left(元値, 挿入数 - 1) '元値を変換して転記 Selection.Offset(1).Select 選択行 = Selection.Row 複写行 = 選択行 - 1 Range(Cells(複写行, 1), Cells(複写行, 5)).Copy Range(Cells(選択行, 1), Cells(選択行, 5)).PasteSpecial Application.CutCopyMode = False Selection = Right(元値, Len(元値) - 挿入数) '元値から転記済を除いて転記 Else Selection.Offset(1).Select End If Loop End Sub

関連するQ&A

  • 別シートの行を選択し対象列を転記するマクロ

    シート2のA~F列までデータがあります。 行数は10,000行です。(月ごとに100行くらい追加されます。) A列は項目がNO.で半角数字が連番で入力されてます。 セルA2→1 セルA3→2 セルA4→3 . . . セルA10000→9999 セルA10001→10000 という感じです。 シート1の セルI9に番号を入力すると シート2のその番号の行のB~F列の値を シート1のJ9~N9列に転記したいです。 例えば シート1のセルI9に100と入力したら、 シート2のA列が100と入力されているセルはA101ですから 101行目となります。101行目の各列の値を転記します。 ↓ シート1のセルJ9にシート2のセルB101の値を転記 シート1のセルK9にシート2のセルC101の値を転記 シート1のセルL9にシート2のセルD101の値を転記 シート1のセルM9にシート2のセルE101の値を転記 シート1のセルN9にシート2のセルF101の値を転記 シート1もシート2もセルの書式設定は標準。 B,E,F列は半角英数字の組み合わせで C,D列は半角数字のみです。 たまにF列に空白がある行があります。 B,F列は数字のみの場合もあります。 B,C,D,F列は数字のみの場合 「数値が文字列として入力されています」 となっています。 マクロで行いたいのですが記述そのものを教えてください。

  • VBAでの行挿入について

    Excel VBAの条件に合った場合、行挿入&挿入した行のセルに特定の値を入力 VBA初心者です。Excel2007、XPを使用しています。 A列からCK列、平均100行程度の顧客データがあります。 このデータは列数は変わりませんが、行数は毎回異なり、 1行1顧客ではなく、同じ顧客で数行で入ることがあります。 しかしA列の顧客番号で判別できるようにはなっています。 目標は下記の点です。 「BC列」に値がある場合、 1行下へ空白行を挿入(できればA~X、Z~AA、AD~CKは1行上と同じ)。 但し挿入する位置は、顧客情報の一番下(1行の場合は2行目、2行の場合は3行目と)です。 挿入した行のY列に「ポイント利用」と入力。 挿入した行のAC列に「BC列の値」を入力。 挿入した行のAB列に「1」を入力。 「BJ列」に値がある場合、 1行下へ空白行を挿入(できればA~X、Z~AA、AD~CKは1行上と同じ)。 但し挿入する位置は、顧客情報の一番下(1行の場合は2行目、2行の場合は3行目と)です。 挿入した行のY列に「送料」と入力。 挿入した行のAC列に「BJ列の値」を入力。 挿入した行のAB列に「1」を入力。 以降に必要な処理はマクロで作成できたのですが、 その後に上記項目を手作業で処理しているのも限度があるので、 最初に挿入処理できればと思ってます。 分かりづらい説明だとは思いますが、 何卒ご教授頂きたくお願い致します。

  • 文字列の数抽出、行挿入マクロ

    急きょ下記処理を実施することになったのですが、本やネットで下記処理ができるような マクロを色々探していもなかなか見つからず…。(T_T) どなたか詳しい方がいらっしゃいましたら教えていただけませんでしょうか? ・A列に特定の文字列(;)があった場合、その列をコピー。 ・その列の下に文字列(;)の数と同数の行を挿入。 ・挿入した行のAセルに、文字列(;)のすぐ後ろの1ケタを貼り付け。 ・(挿入行が2行の場合) さらに下に挿入した行のAセルに、左から2つ目の文字列(;)の  すぐ後ろの1ケタを貼り付け。 なお、A列の行数は、現時点で500行ほどあり、今後増える可能性もあります。 【処理する前】       A列      B列    C列 1行目  1;32     555   AAA 2行目  29;1;4   222   GGG 3行目  600      111   FFF 【マクロ実行後】       A列    B列   C列 1行目  1     555   AAA 2行目  32    555   AAA 3行目  29    222   GGG 4行目  1     222   GGG 5行目  4     222   GGG  6行目  600   111   FFF どうぞよろしくお願いいたします。

  • エクセルのマクロで転記

    シート1とシート2があり、 シート1の20Aから39Lまでのセルの中に情報を書き込んでいます。 シート1の20Lから39LのL行で、数値が入っているセルがあれば、その行のA、B、I、L列と、J2、A7を取り出し、シート2の2行目から下に転記していくのですが、 シート2のA列にはシート1のJ2を、B列にはシート1のA7を、C列以降は、シート1のA、B、I、Lを入れるようにします。 また同じ条件がシート1で発生すれば、シート2の3行目以降に転記していく感じです。 どのようにすればいいでしょうか。

  • 照合した結果によって決めた値を転記するマクロ

    シート1には A~F列まで値があり、行数は都度相違し約15,000行くらい。 データは2行目から開始です。 シート2には A~AE列まで値があり、行数は都度相違し約5,000~25,000行 あり同じくデータは2行目からです。 シート1の行ごとに A列,B列,C列の順で連結した値と シート2の行ごとに F列,G列,B列の順で連結した値を 照合させます。 その値が (1)シート1にもシート2にもある場合は   シート2のAF列に1と転記 (2)シート1には無いがシート2にはある場合は   シート2のAF列に2と転記 (3)シート1には有るがシート2には無い場合は   シート2のAF列に3と記入 シート2のデータのある行まで 作業を繰り返すマクロの記述を教えてください。 VLOOKUPを使用したマクロを作成しましたが 判定1,2,3の転記がうまく出来ないのと VLOOKUPが重すぎて処理が遅すぎるので 速く処理が出来るとうれしいです。 例 シート1 A2=XXXX B2=1234 C2=5678 シ-ト2 B2=1234 F2=XXXX G2=5678 シート1の値=XXXX12345678 シート2の値=XXXX12345678 照合する ↓(一致なので) シート2のセルAF2に1と転記

  • 行の挿入で数式も自動的に挿入

    C1列に=SUM(A1:B1)を入力し、オートフィルを30行目までかけました。 3行目で行の挿入をした時に 自動的にC列に数式が入力されている状態 (上の行、又は下の行のコピーを挿入) にしたいのですがどうすればよろしいでしょうか? 行をコピー  → コピーしたセルの挿入 以外の方法はあるんでしょうか? よろしくお願い致します。

  • 別シートに任意のセルを転記する方法について

    縦に6行ずつのデータがあり、これを横1行の別シートに転記する際に、 以前こちらで回答頂いた方法を応用したいと考えています。 =IF(INDEX(Sheet1!$Z:$Z,(ROW(A1)-1)*6+COLUMN(A1))=0,"",INDEX(Sheet1!$Z:$Z,(ROW(A1)-1)*6+COLUMN(A1))) アドバイスのとおり、上記の数式で見事に横にデータが転記できました。社員1人につき6行ずつのデータが縦にならんでおり、これを別の社員1人あたり1行で横に並んだデータにしたいというものでした。 1人目のデータは1行目を1列目に、2行目を2列目に・・・2人目のデータである7行目を1列目に、8行目を2列目に・・・3人目は13行目を1列目に・・・となります。 しかし、順次並べるのではなく、転記の必要にないデータを含むシートの任意のセルを選び、別シートの任意のセルへ転記する必要が生じたため、悩んで路頭に迷っております。。。 例えば、6行ずつのデータのうち、いつも3行目を別シートの5列目に。4行目は転記せずに、5行目を6列目に。また、6行目を7列目に転記せずに10列目に転記する。(8・9列目は、別データを入力するため空白にしたい) そして、社員2人目である7行目からは、上記と同じ規則で転記したい。 などというように、選んで転記する方法は何かありますでしょうか?? =INDEX(Sheet1!$Z:$Z,(ROW(B2)-ROW($B$2))*6+IF(COLUMN()=4,MOD(COLUMN(B2)-1,6)+1,MOD(COLUMN(B2)-1,7))) のようにしても上手くいきません。 何卒宜しく御願いいたします。

  • マクロ 値の転記 再度

    マクロ 値の転記 再度 昨日はkyboさんに解答を頂き大変助かりました。 ありがとうございました。 教えて頂いたコードを別のマクロでも活用しよう思ったのですが どのように改変していけばいいのかまた悩んでいます。 度々で申し訳ありませんが、どなたか宜しくお願い致します。 やりたいこと 転記元のBに0以外の数字が入っている場合、転記先のA列に 同じ値を常に5回転記させたい。 "あ"を5回転記→1行あける→"う"を5回転記→(続く・・・) ★Sheet1 転記先(7行目から転記したい)   A ------------------- 7 あ 8 あ 9 あ 10 あ 11 あ -------------------- 12 空行 -------------------- 13 う 14 う 15 う 16 う 17 う -------------------- 18 空行 -------------------- 19 以下 5つの纏まりの枠が300行位まで続く ★Sheet2 転記元(5行目からデータがある)   A    B -------------------- 5 あ 6 あ 7 あ計  100 -------------------- 8 空行 -------------------- 9 い 10 い 11 い 12 い計  0 -------------------- 13 空行 -------------------- 14 う 15 う 16 う 17 う計  500 -------------------- 18 空行 19 (以下、続く) Sub テスト() Dim i As Long '転記元のデータ開始行は5行目 For i = 5 To 300  '転記元のB列が0以外  If Worksheets("転記元").Cells(i, "B") <> 0 Then    Worksheets("転記先").Cells((i - 1) * 5 + 1, "A").Resize(5) _ = Worksheets("転記元").Cells(i, "A")  End If Next i End Sub

  • エクセルマクロで指定したセルの値を表示変更し転記

    エクセルマクロで指定したセルの値を表示変更して指定したセルに転記したい セルA列に書式が標準で 20101117と入っています。 これをB列にセルの値も表示も共に11/27としたいです。 (セルの値は2010/11/17でセルの表示は11/27ではまずいです。) A列にデーターがあるまで繰り返したいです。 行数は作業毎で常に違います。 以下の記述では出来ませんでした。 よろしくお願いします。 Sub 日付() 行 = 2 Do If Cells(行, 1).Value = "" Then Exit Do Cells(行, 2).Value = Mid(行, 1,5,2) &"/"& RIGHT(行, 1,2) 行 = 行 + 1 Loop End Sub

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

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

専門家に質問してみよう