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

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

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

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

Q&A

解決済

2回答

1380閲覧

Excelの新旧シート比較で階層を合わせたい

amasan

総合スコア3

VBA

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

0グッド

1クリップ

投稿2021/05/21 01:36

前提・実現したいこと

Excel VBA でシート1(旧)とシート2(新)の番号を比較して、
一致するのであればスルー、
一致しないのであればシート1(旧)に空白の行を挿入する。
という操作を行い、シート2(新)で追加されて行とシート1(旧)
の階層を合わせたいです。

初めてVBAを触り、独学でいろいろ試しているのですがなかなかできません。
以下のようなコードを組んで繰り返しで指定の行まで処理をすればいいかと思っているのですが
行き詰っています。

Public Sub 比較()

Dim S1, S2 As String

If Sheet2(年度計画)(4, 1) = Sheet3(月計画)(4, 1) Then
Sheet2(年度計画)(4, 1) = Sheet3(月計画)(4, 1)
Else
Sheet2(年度計画)(4, 1).Insert Shift:=xlShiftDown
End If

End Sub

初歩的な内容だと思いますが、どなたかご教授お願いいたします。

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

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

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

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

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

sazi

2021/05/21 03:28

Sheet2のコピーを行い、そのシートにSheet1の内容を転記して、それをsheet1に置き換える方が、挿入などが不要になり、コードはシンプルになりそうですが。
amasan

2021/05/21 03:52

年度始めのデータと月々のデータの比較をしてコスト評価等をしたい為、階層を合わせれば後は関数で評価が出来るので、挿入などで階層は合わしたいと考えています。
plomte

2021/05/25 08:29

階層を合わせなくても、VLOOKUPやMATCHなどの関数を使っても、同様のことができるように思います。
guest

回答2

0

ベストアンサー

ご質問の内容から、前提条件をいくつか推測します。
・旧シートのシート名が「年度計画」
・新シートのシート名が「月計画」
・比較する「番号」というのは、A列にある
・比較する行は、4行目から始まる
・旧シートも新シートも番号に歯抜けはない(A列の途中に空白はない)
・旧シートの番号は新シートにすべてある(番号は追加はあるが削除はない)

VBA

1Sub Main() 2 3Dim i As Long 4 5With ThisWorkbook 6For i = 4 To .Sheets("月計画").UsedRange.Rows.Count 7 DoEvents 8 If .Sheets("年度計画").Range("A" & i).Value = "" Then 9' Exit For 10 ElseIf .Sheets("年度計画").Range("A" & i).Value <> .Sheets("月計画").Range("A" & i).Value Then 11 .Sheets("年度計画").Rows(i).Insert Shift:=xlShiftDown 12 End If 13Next i 14End With 15 16End Sub

処理内容:
①月計画の最終行まで、年度計画の番号と月計画の番号が違う場合は、年度計画に行を挿入する。
②年度計画の番号が最後を超えたら(A列が空白だったら)、そこで終わりにする。

投稿2021/05/21 09:41

編集2021/05/26 09:34
plomte

総合スコア46

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

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

amasan

2021/05/25 06:11

ご回答ありがとうございます。 教えていただいたコードを試しに入力して実行したのですが、実行時エラー1004が出てしまいます。 比較しようとしている番号が、AB123456789-10のような形なのですが・・・ ネットで調べているのですがなかなか解決が出来ず・・・
plomte

2021/05/25 08:21

大変失礼いたしました。回答欄のコードを修正しました。今度はいかがでしょうか。
amasan

2021/05/25 23:55 編集

ありがとうございます。 最初の40行ほどは問題なく行けたのですが、月計画の終わりまで全部空白になってしまいます。 VLOOKUPなどの関数でも番号単体であれば行けるとは思うのですが、その何列か隣の列の予算を比較したいため階層を合わせたいと思っています。
plomte

2021/05/26 09:36

一部修正しましたが、これでも同じでしょうか。
plomte

2021/05/26 10:31

もしかすると、年度計画にあったものが月計画では無くなったり、年度計画の番号の順番から月計画では番号の順番の上下が入れ替わったり、そういうケースがあるのでしょうか?
plomte

2021/05/26 11:01

VLOOKUPの場合ですが、A列に番号、E列に予算が入っているとします。その場合に =VLOOKUP($A4,年度計画!$A$4:$E$50,5,FALSE) =VLOOKUP($A4,月計画!$A$4:$E$50,5,FALSE) というふうに、別々のシートから番号(第一引数)をキーにして予算(第三引数)を取ってきて、 それを比較すればよいと思うのですが、いかがでしょうか。
guest

0

こんな感じでどうでしょうか。

VBA

1 Dim ws1 As Worksheet 2 Dim ws2 As Worksheet 3 Set ws1 = Sheets("年度計画") 4 Set ws2 = Sheets("月計画") 5 6 Dim i, r, m 7 r = 4 8 For i = 4 To ws1.Cells(Rows.Count, 1).End(xlUp).Row 9 m = WorksheetFunction.Match(ws1.Cells(r, 1), ws2.Columns(1), False) 10 If m = r Then 11 r = r + 1 12 Else 13 ws1.Rows(r).Resize(m - r).Insert 14 r = m + 1 15 End If 16 Next

投稿2021/05/26 10:24

jinoji

総合スコア4592

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問