VBAの操作に関する質問

このQ&Aのポイント
  • VBAの操作でSheet2に特定の条件でデータをコピーする際に、毎行追加行が挿入される現象が発生しています。アドバイスをお願いできますか?
  • VBAを使用して特定の条件でSheet1のデータをSheet2にコピーする際に、毎行追加行が挿入されてしまう問題が発生しています。解決方法を教えてください。
  • VBAを使ってSheet1からSheet2に特定の条件でデータをコピーする処理を行っていますが、追加行が挿入されてしまうという現象が起きます。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

VBAの操作

↓の事を行いていのでうまくいきません。 アドバイスをお願いできませんか? 変更前(Sheet1); (A列) (B列) 1 ABC010 Data_010 2 ABC020 (同上) 'B1-B2は結合セル 3 ABC030 Data_020 4 ABC040 (同上) 'B3-B4は結合セル . . 変更後(Sheet2); (A列) (B列) 1 ABC010 "OK" 2 ABC020 "OK" 3 Data_010 "Comp" '追加行 4 ABC030 "OK" 5 ABC040 "OK" 6 Data_020 "Comp" '追加行 . . Sheet1(B列)に値があれば、 Sheet2(A列)に結合セルの単位で値をコピーする。 Sheet2(B列)には"OK"コメント その都度、必ず最後に行追加して結合セルの値、"Comp"コメントをコピーする. 現象は毎行、追加行が挿入されてしまいます。 Sub testVBA() Dim i Worksheets("Sheet1").Range("A:B").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial For i = 1 To 1000 If .Cells(i, 2) <> "" Then .Cells(i + 1, 1) = .Cells(i, 2) .Cells(i + 1, 2) = "Comp"   .Cells(i, 2) = "OK" End If Next i End With End Sub

noname#187796
noname#187796

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

取りあえずこんな感じで作ってみました。 Sub Samsple()   Dim rRange As Range   Dim vInsertDat() As Variant   Dim nCount, sAddress, i      With Worksheets("Sheet2")     'Sheet1からSheet2への貼り付け(結合したまま)     Worksheets("Sheet1").Columns("A:B").Copy     .Range("A1").PasteSpecial     '結合セルの処理     nCount = 0     For Each rRange In .UsedRange       If rRange.MergeCells Then         '結合セルの一番下の行と値を配列に保存         nCount = nCount + 1         ReDim Preserve vInsertDat(1, nCount)         vInsertDat(0, nCount) = rRange.MergeArea.Item(rRange.MergeArea.Count).Row         vInsertDat(1, nCount) = rRange.Value                  '結合セルをばらして結合セルの全てに「OK」と入れる         sAddress = rRange.MergeArea.Address         rRange.UnMerge         .Range(sAddress) = "OK"       End If     Next rRange          '行の追加     For i = nCount To 1 Step -1       .Rows(vInsertDat(0, i) + 1).Insert       .Cells(vInsertDat(0, i) + 1, 1) = vInsertDat(1, i)       .Cells(vInsertDat(0, i) + 1, 2) = "Comp"     Next i   End With End Sub

noname#187796
質問者

補足

ありがとうございました。 ↓のような事をおこないたいです。 変更前(Sheet1); (D列) (E列) (K列) (V列) (W列) (X列) (Y列) (AF - AM列) 1 ABCDEF テーブル1  ABC456 テーブル2  ABC789 ABC000 テーブル4 2 ABCDEF (ブランク) ABC456 (ブランク) ABC789 ABC000 (ブランク) 3 123456 (ブランク) ABC456  テーブル3 ABC789 ABC000 テーブル5 4 123456 (ブランク) ABC456 (ブランク) ABC789 ABC000 (ブランク) . . ※Y1-Y2は結合セル、Y3-Y4は結合セル 変更後(Sheet2); 例では追加は3,4行目です。 (A列) (B列)   (C列) (D列)   (E列) (F列)  (AF - AM列) (G列) 1 ABCDEF テーブル1 ABC456 テーブル2  ABC789 ABC000   "OK" 2 ABCDEF テーブル1 ABC456 テーブル2 ABC789 ABC000   "OK" 3 ABCDEF テーブル1   -  テーブル2 ABC789 テーブル4 "Comp"  4 123456 テーブル1 ABC456 テーブル3 ABC789 ABC000   "OK" 5 123456 テーブル1 ABC456 テーブル3 ABC789 ABC000   "OK" 6 123456 テーブル1 -   テーブル3 ABC789 テーブル5 "Como" . . ※追加は3、6行目です。 Sheet1(Y列)に値があれば、 Sheet2(G列)に対象行単位で"OK"コメントをコピーする。 必ず最後に行追加して結合セルの値、"Comp"コメントをコピーする. 現象はマージセルの処理でループしてしまいます。 ご意見をいただけないでしょうか? ----------------- コード; Option Explicit Sub Sample() Dim nRow, i, nCount, tmp, sAddress, rRange Dim vInsertDat() As Variant Worksheets("Sheet1").Range("D:E,K:K,V:Y,AF:AM").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial Paste:=xlPasteValues nRow = .Cells(Rows.Count, 1).End(xlUp).Row 'データのある最終行 'Y列("Sheet2"のG列)のデータ分行を追加 For i = nRow To 4 Step -1 'Y列("Sheet2"のG列)にデータがあるか If .Cells(i, 7) <> "" Then tmp = .Cells(i, 7) 'G列の保管 rRange = .Range("G:G") 'G列結合セルの処理 nCount = 0 For Each rRange In .UsedRange If rRange.MergeCells Then 'G列結合セルの一番下の行値を配列に保存 nCount = nCount + 1 ReDim Preserve vInsertDat(1, nCount) vInsertDat(0, nCount) = rRange.MergeArea.Item(rRange.MergeArea.Count).Row vInsertDat(1, nCount) = rRange.Value 'G列結合セルをばらして結合セルの全てに「OK」と入れる sAddress = rRange.MergeArea.Address rRange.UnMerge .Range(sAddress) = "OK" End If Next rRange '行の追加 .Rows(i).Copy .Rows(i).Insert .Cells(i + 1, 3) = "-" .Cells(i + 1, 6) = tmp .Cells(i + 1, 7) = "Comp" End If Next i 'Y列("Sheet2"のG列)の最後尾列(Q列)への移動 .Columns(7).Cut .Columns(17).Insert End With End Sub

関連するQ&A

  • VBA - セル解除

    コピーA列結合セルを解除して、解除した行にすべてに「OK」と入れたいのですがうまくいきません。 アドバイスをお願い致します。 Dim i, Addr Worksheets("Sheet1").Range("A:A").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial . . If .Cells(i, 1).MergeCells Then Addr = .Cells(i, 1).MergeArea.Address .Cells(i, 1).UnMerge .Cells(i, 1)(Addr) = "OK" '←ここがダメです。 End If . .

  • VBAの質問です。

    VBAの質問です。 A列に結合したセルがあり、 B列に結合セルの何番目かを出力する、という関数を作成したいです。 呼び元は、1行ごとにこの関数を呼び出します。 呼び元は他の処理も行っていて、機能追加の意味で別関数を用意したいです。 どうすればB列に番号を振れるでしょうか。 宜しくお願いします。 | A | B | --+-------+-------+ 1 | | 1 | --+ +-------+ 2 | | 2 | --+ +-------+ 3 | | 3 | --+-------+-------+ 4 | | 1 | --+-------+-------+ 5 | | 1 | --+ +-------+ 6 | | 2 | --+-------+-------+ イメージ書いて見ました。 Dim r As Integer Sub 呼び元() For i = 1 To 6 r = 1 Call 結合番号出力 Next End Sub Sub 結合番号出力() Cells(r, "B").Value = ●●● End Sub

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • 結合セル解除

    補足情報の追加書き込みがわかりませんので何度もトビを起こしいます。 申し訳ございません。 ↓例で、 G列結合セルを解除して、解除した行にすべてに"●"と入れたいのですがコピーできません。。 ご意見をいただけませんか? ------------ Option Explicit Sub Sample() Dim nRow, i, Addr, tmp Worksheets("Sheet1").Range("D:E,K:K,V:Y,AF:AM").Copy With Worksheets("sheet2") 'Y列も"sheet2"にコピー(G列) .Range("A1").PasteSpecial Paste:=xlPasteValues nRow = .Cells(Rows.Count, 1).End(xlUp).Row 'データのある最終行 For i = 5 To nRow If .Cells(i, 2) = "" Then .Cells(i, 2) = .Cells(i - 1, 2) 'B列 If .Cells(i, 4) = "" Then .Cells(i, 4) = .Cells(i - 1, 4) 'D列 Next i 'Y列("sheet2"のG列)のデータ分行を追加 For i = nRow To 4 Step -1 'Y列("sheet2"のG列)にデータがあるか If .Cells(i, 7) <> "" Then tmp = .Cells(i, 7) '-------------ここがうまくいきません。 'G列結合セルを解除して対象行にすべて「OK」と入れる。 If .Cells(i, 7).MergeCells Then Addr = .Cells(i, 7).MergeArea.Address .Cells(i, 7).UnMerge .Range(Addr) = "●" End If '------------ここがうまくいきません。 .Rows(i).Copy .Rows(i).Insert .Cells(i + 1, 3) = "-" .Cells(i + 1, 6) = tmp '.Cells(i, 7) = "●" .Cells(i + 1, 7) = "★" End If Next i 'Y列("sheet2"のG列)の最後尾列(Q列)への移動 .Columns(7).Cut .Columns(17).Insert End With End Sub

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • VBA シート間の単一セルから結合セルへのコピー

    マクロについてご教授をお願いします。 ◆実現したい事 2枚のシート(XとY)が存在します。 コピー元:Xシート          コピー先:Yシート    B列                    B列 1行 商品1   コピペ→     1~3行結合 商品1  2行 商品2   コピペ→     4~5行結合 商品2 3行 商品3   コピペ→     6~8行結合 商品3   ・                    ・   ・                    ・   ・                    ・  最終行                  最終行 XシートのB列に1行ずつ、商品名が羅列されています。 YシートのB列には、3行結合(B1:B3)、(B4:B6)、(B7:B9)・・・空白セルがあります。 Xシートの商品名をYシートの結合セルにマクロを使って処理したいです。 ◆試した事 (1)結合を解除し、XからYへ範囲コピーしたが、YのB列に再び、商品毎に2行追加し、結合  2行追加する方法がわからず断念 (2).valueでXシートB1 = YシートB1を試みるができない ◆ここで詰まってます>< Dim X As Worksheet Dim Y As Worksheet Dim 最終行1 As Long Dim 最終行2 As Long Dim cp1 As Long・・・・Yシート行変数 Dim cp2 As Long・・・・Xシート行変数 Set X = Worksheets(1) Set Y = Worksheets(2) 最終行1 = Cells(Rows.Count, 2).End(xlDown).row 最終行2 = Cells(Rows.Count, 2).End(xlDown).row For cp1 = 1 To 最終行1 For cp2 = 1 To 最終行2 Step 3 sh1.Cells(cp1, 2).Copy Destination:= sh2.Cells(cp2, 2) Next Next みたいな感じにできればと、Copyを.valueなどにしてみたりと試してみましたが、 なかなかうまくいかず、3日くらい悩んでいます。 シンプルにやりたいのですが、なにか良い方法などあれば、 ご教授のほどお願い致します><

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • VBA教えて下さい

    VBA初心者です やりたいこと 変数を宣言し 今開いているシート(activesheet)に for nextを使用し 列5~20を調べ 行3~5を指定し もし、5~20列の2行目のどれかに”No.8”という文字があれば(ここまでのコードは書けました) その当てはまる列の3~5行を選択し(1) 更に、(1)の下2列を選択する(2) そして、(1)と(2)を結合させる といったコードが書きたいです 考えたコード Sub test() Dim i As Long Dim j As Long With ActiveSheet For j = 5 To 20 For i = 3 To 5 If .Cells(j, 2) Like "*No.8*" Then 'ここからがわかりません End If Next i Next j End With End Sub 変な書き方なので例えを書きます A1セルにNo.8の文字があれば E1セルとF1セルを選択し 更に、E3セルとF3セルも選択し E1セルとF3まとめてセルを結合といったことがしたいです。 質問頂ければ追記しますm(ーー)m おそらくoffsetを使用して選択すると思うのですが上手く出来ませんでした 回答お願い致します

  • VBA オートフィルの操作方法

    VBAで使用するオートフィルの指定方法がわかりませんでしたので 質問いたします。 やりたいこと セルがAとBセルが一番下まで結合されている状態 (A1とB1セル結合・A2とB2セル結合・・・) にて、セル(A5とB5が結合されたセル)を選択し 何も数字が無ければ、数字があるセルまで選択する (この場合End(xlUp)にて数字がある一番上のセルを選択する) そのあと、セル(A5とB5が結合されたセルの一つ上)まで オートフィルをしたいのですが 下記のコードだと実現できませんでした。 おそらくrange指定がキチンとできていないのと セルが結合されているのも要因の様な気がします・・・ すいませんが実現できるコード記載お願いできますでしょうか。 回答宜しくお願い致します。 Cells(5, 1).End(xlUp).Select Selection.AutoFill Destination:=Range(Cells(5, 1).End(xlUp), Cells(5, 1).Offset(-1, 0)), Type:=xlFillCopy

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

専門家に質問してみよう