0

「マスター」ワークシートのデータを取得し、ワークブックの他のシートに配置する VBA コードがあります。私が抱えている問題は、新しいデータが自動的に更新されないことです。ワークシートを自動的に更新するコードを開発したいと考えています。これは私が今持っているコードです。

Sub test()
Dim LR As Long, i As Long
LR = Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To LR
If Range("B" & i).Value = "AP" Then Rows(i).Copy Destination:=Sheets("AP").Range("A" & Rows.Count).End(xlUp).Offset(1)
If Range("B" & i).Value = "*AP" Then Rows(i).Copy Destination:=Sheets(" If Range("B" & i).Value = "CSW" Then Rows(i).Copy Destination:=Sheets("CSW").Range("A" & Rows.Count).End(xlUp).Offset(1)
If Range("B" & i).Value = "CO" Then Rows(i).Copy Destination:=Sheets("CO").Range("A" & Rows.Count).End(xlUp).Offset(1)
If Range("B" & i).Value = "PSR" Then Rows(i).Copy Destination:=Sheets("PSR").Range("A" & Rows.Count).End(xlUp).Offset(1)
Next i
End Sub

これにより、他のシートにデータが配置されますが、新しいデータを「マスター」ワークシートに入力すると、他のシートでデータが更新されません。自動フィルターを含めるために他の方法を試しましたが、うまくいきませんでした。

4

2 に答える 2

1

worksheet_change「マスター」スプレッドシートでイベントを使用します。「マスター」シートでデータが更新されると、worksheet_changeイベントが発生し、コードを呼び出して他のシートを更新できます。

使用方法の詳細な手順については、http ://www.ozgrid.com/VBA/run-macros-change.htm を参照してください。

私はあなたのコードで実際の例を設定しました。ワークブックには、6 つのシート (「マスター」、「AP」、「すべての AP」、「CSW」、「CO」、および「PSR」) があります。各シートの行 1 はヘッダー行と見なされます。以下のコードでワークブックを設定すると、「マスター」シートに変更を加えると worksheet_change イベントが発生し、ワークブック内のすべての宛先シートが最新のデータで更新されます。

動作させるには、次の手順に従います。

マスター シートのコード モジュールに次を追加します。

_

Option Explicit

    Private Sub Worksheet_Change(ByVal Target As Range)
        Call UpdateFromMaster
    End Sub

これらのサブルーチンを標準モジュールに追加します。

_

Sub UpdateFromMaster()
    ' clear whatever you had previously written to the destination sheets
    Call ResetDestinationSheets

    ' the code you already had
    Dim LR As Long, i As Long
    LR = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To LR
    If Range("B" & i).Value = "AP" Then Rows(i).Copy Destination:=Sheets("AP").Range("A" & Rows.Count).End(xlUp).Offset(1)
    If Range("B" & i).Value = "*AP" Then Rows(i).Copy Destination:=Sheets("All AP").Range("A" & Rows.Count).End(xlUp).Offset(1)
    If Range("B" & i).Value = "CSW" Then Rows(i).Copy Destination:=Sheets("CSW").Range("A" & Rows.Count).End(xlUp).Offset(1)
    If Range("B" & i).Value = "CO" Then Rows(i).Copy Destination:=Sheets("CO").Range("A" & Rows.Count).End(xlUp).Offset(1)
    If Range("B" & i).Value = "PSR" Then Rows(i).Copy Destination:=Sheets("PSR").Range("A" & Rows.Count).End(xlUp).Offset(1)
    Next i

End Sub

_

Sub ResetDestinationSheets()
    '== not elegant, but will work in your example

    Call ResetThisSheet("AP")
    Call ResetThisSheet("ALL AP") ' I didn't know what you called this sheet
    Call ResetThisSheet("CSW")
    Call ResetThisSheet("CO")
    Call ResetThisSheet("PSR")

End Sub

_

Sub ResetThisSheet(ByRef SheetToClear As String)
    Sheets(SheetToClear).Range("A2:B" & Rows.Count).Clear
End Sub
于 2012-05-23T17:13:42.897 に答える
0

ワークシートに変更が加えられるたびにコードをトリガーする worksheet_change() イベントの代替手段を提供します。シェイプ (またはボタン) を作成してそのボタンにコードを割り当てることもできます。これにより、あなた (またはユーザー) が指示した場合にのみ実行されます。ワークシートの change() イベントに対するこの利点は、ワークシートが少し変更されるたびにコードが実行されないことです。

ボタンまたは形状にマクロを割り当てるには、形状をシートに追加し、右クリックして [マクロの割り当て] を選択します。ここも参照してください... Excel で VBA マクロをボタンに関連付けるにはどうすればよいですか

于 2012-05-23T17:21:37.307 に答える