質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

511閲覧

【修正】挿入した空白行の各セルに任意のデータを挿入するマクロが知りたいです

baker

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2018/06/10 09:18

編集2018/06/10 11:05

行いたい処理内容

ExcelのB列~I列までが処理対象の列
・B列で「1」が検出された場合、「1」が検出された行の上に空白行を挿入したい
※「1」の値をキーにして空白行を挿入
・挿入された空白行には各列で行いたい処理がある

  • B列:「0」を表記
  • C列/F列:任意の文字列(例:ZZ、XX)を表記
  • D列/E列/G列:処理なし(空白のまま)
  • H列/I列:空白であれば次行の値をコピー

※データの行数は毎回変動するため、最終行を取得しながら処理できたら有難いです。

処理前のデータ例

|A|B|C|D|E|F|G|H|I|
|:--|:--:|--:|
||1|A1|a|a|1A|a|01|11
||2|A2|b|b|2A|b|02|22
||3|A3|c|c|3A|c|03|33
||1|B1|d|d|1B|d|04|44
||1|C1|e|e|1C|e|05|55

処理後のデータ例 ※希望形です

|A|B|C|D|E|F|G|H|I|
|:--|:--:|--:|
||0|ZZ|||XX||01|11
||1|A1|a|a|1A|a|01|11
||2|A2|b|b|2A|b|02|22
||3|A3|c|c|3A|c|03|33
||0|ZZ|||XX||04|44
||1|B1|d|d|1B|d|04|44
||0|ZZ|||XX||05|55
||1|C1|e|e|1C|e|05|55

現状のマクロ(テストデータ)

データを処理して空白行の挿入まではネットで調べながらマクロを組めたのですが、
「下のセルをコピー」、「複数の条件を設定」で躓いて先に進めません…。
高望みは重々承知で知恵をお借りできたら嬉しいです。

>sazi様
以下はテスト用として作成途中のマクロです。
質問では"B列の「1」をキー"としていますが、
テスト段階では以下の処理を行っています。
("マークダウンで括る"の認識が間違っていたら申し訳ございません)

・A列(データ毎にナンバリング)を最終行から読んでいき、値が変化したら空白行を挿入
・挿入した空白行のB列に文字列"AA"を挿入
・(1行目はヘッダーが設定されているので)2行目の空白行は書式設定クリア

▼テストデータ
|A|B|C|D|E|
|:--|:--:|--:|
|1|赤|a|a|A1|
|2|青|d|d|B1|
|2|青|d|d|B2|
|3|黄|e|e|C1|
|3|黄|e|e|C2|
|3|黄|e|e|C3|

Sub Macro1() Dim i As Long Dim S As String For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1 If Range("A" & i).Value <> Range("A" & i - 1).Value Then Rows(i).Insert Cells(i, 2).Value = "AA" Cells(i, 3).Value = Cells(i, 1).Value End If Next i Rows(2).ClearFormats End Sub

本番データにもあるナンバリングが信頼できるデータではないため、
できれば質問にある値をキーにしたいです。

補足情報(FW/ツールのバージョンなど)

Excel2010

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/06/10 09:57

現状組み込んでいる途中のマクロも情報として追記されて下さい。その際にはマークダウンで括ってください。
guest

回答2

0

ベストアンサー

ども^^

最初の方の例のサンプルコードです。

VBA

1Sub test() 2 Dim rng As Range 3 Dim r As Range 4 Dim ix As Long 5 6 Set rng = Range("B1").CurrentRegion 7 For ix = rng.Rows.Count To 1 Step -1 8 If rng(ix, "A").Value = 1 Then 9 With rng.Rows(ix) 10 .Insert 11 With .Rows(0) 12 .Range("A1").Value = 0 13 .Range("B1").Value = "zz" 14 .Range("E1").Value = "xx" 15 .Range("G1:H1").Value = .Range("G2:H2").Value 16 End With 17 End With 18 End If 19 Next 20End Sub

最初のデータと、後のデータと、
キーブレークと判断される条件が全然違いますが、どうしたいのでしょう。。。?

投稿2018/06/11 00:28

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

baker

2018/06/11 05:33

ありがとうございます!!!まさにこれです!!! 後に提示したテストデータは、 試作段階でA列に入っているナンバリング(B列の色別で数字を割振)をキーにして 行挿入などの動作を行おうと組み立てていたのですが、本番で受領したデータにあった 同様のナンバリングが正しく割り振られていなかったため、本番データに入っていた 枝番(前者データのB列)をキーにしたくご相談した次第です。 作成いただいたコードを正しく理解して今後に活かしたいと思います。 本当にありがとうございました!助かりました!
guest

0

何が知りたいのか曖昧な為、以下を回答として求めていると決めます。
・「キーである1を持つセルの次セルをコピー」

恐らくforを用いて一行ずつ処理を繰り返していると思います。
であれば、次のようにしているのでしょう。

for(i = 0,0 < x i ++) {   if(cell[1,i].value == 1) { Process(); } }

下のセルをコピーするには、
現在のiに+1した値でセルを指定して値を取得してやればいいと思います。

投稿2018/06/10 09:42

sandboxA

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

baker

2018/06/10 11:59

早速の回答ありがとうございます。 いただいたコードを試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問