[[20140424131348]] 『マクロで条件付きデータ抽出&作成』(マクロでGo) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで条件付きデータ抽出&作成』(マクロでGo)

マクロで条件付きデータ抽出&作成

仕事場に顧客ファイルがあちこちに存在してして大変なことになっているので、マクロを勉強しています。

Aファイルの中にある複数のシートのうち、A・Bシートから条件に合ったデータを集約して1シートする(データ作成用ファイル)
集約した1シートを読み込んでレイアウトを整えているBファイルでデータを参照する(職場の人が見るデータファイル)

単に集約して別シートに出力する処理はうまくいったのですが、出来るだけ自動化させたいので、
「あるシートのセルの範囲が更新された場合、実行する」という処理を付け加えてました。

コンパイルは通りましたが結果が思わしくなく処理を追いかけてみたのですが、データの集約処理に入ってすぐに抜けてしまうみたいです。
まだ処理の追いかけ方やヘルプの使い方があまりわかっていないので修正が中々進みません。

「このシートが変更されたら」という処理を追加するためにはどういった書き方をすればいいでしょうか?

※ ネットで検索したり、YAHOOで質問したりして下記コードを作成しました。
時間はかかりますがコードを追うことはできるので、よろしくお願いします。

'------------------------------------------
'(Workbookに記述)
''Aシート・Bシートのに変更があった場合にデータの集約処理が実行される
'------------------------------------------
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

    If Sh.Name = "Aシート" Or Sh.Name = "Bシート" Then
        If ((Target.Row >= 2 And Target.Row <= 100) And (Target.Column >= 18 And Target.Column <= 24)) Then
            MsgBox "シート 修正"
            Call marge_Proc
        End If
    End If
End Sub

'------------------------------------------
'(標準モジュールに記述)
'データの集約処理
'------------------------------------------
Sub marge_Proc()

Dim iWS As Worksheet 'コピー元シート
Dim oWS As Worksheet 'コピー先シート

Dim i As Long
Dim j As Long

Dim LastRow As Integer '最終行取得
Dim Sh As Worksheet 'シート名の取得

j = 2 '出力データ位置(1行目は見出しの為、2行目から書き始める)

Set oWS = Worksheets("AllData")

'マクロからはシート保護をしていても実行できる
Worksheets("AllData").Protect UserInterfaceOnly:=True

'AllDataシートのデータ内容をクリア(1行目の見出しを除く)
Worksheets("AllData").Range("A2:H150").Clear

For Each Sh In Worksheets

    If Sh.Name = "Aシート" Or Sh.Name = "Bシート" Then
        LastRow = Sh.Range("A" & Rows.Count).End(xlUp).Row
        For i = 2 To LastRow
            If Sh.Range("R" & i) <> "" Then           '抽出データの判定
                If Sh.Name = "Aシート" Then
                    Sheets("AllData").Range("A" & j) = Sh.Range("C" & i)
                    Sheets("AllData").Range("B" & j) = Sh.Range("T" & i)
                Else
                    Sheets("AllData").Range("A" & j) = Sh.Range("B" & i)
                    Sheets("AllData").Range("B" & j) = Sh.Range("S" & i)
                End If
                j = j + 1
            End If
        Next
    End If
Next
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 ステップインとブレークポイントを使用していますか?
 イベントコードの
 If Sh.Name = "Aシート" Or Sh.Name = "Bシート" Then
 にカーソルを合わせF9でブレークポイントを設定すると、イベント発生時に一旦処理が止まります。
 その後はF8キーでマクロを一行ずつ実行してみてください。
 どこで問題が発生しているのかが明確になるはずです。 
(Jera) 2014/04/24(木) 13:32

コメントの書き方がわからなかったので遅くなりました。
ブレークポイントは使っていたのですが、F5で追いかけていました。
F8でしてみます。
ちょっと思ったのと違う動きをしているみたいなので、じっくり追いかけてみます。
ありがとうございます。

(マクロでGo) 2014/04/30(水) 11:00


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.