2016-11-18 7 views
0

技術的に無関係なクライアント用のカスタムレポートを作成しようとしています。VBAマクロを条件でオートフィルタし、1つの列の表示結果を配列にコピーし、その配列で別のシートをオートフィルタします。

だからここに私は何をする必要があるかです:

私は入力ファイルとして二つの異なるワークブック持っている:ケースリスト(cases.csv)および収入報告書(revenue.csv)、Webサービスから出力されます。

ケースリストには、ケースファイル名(列K)とユーザー名(列W)が含まれています。すべてのケースとユーザーがリストされます。

収益報告書は、ケースファイル名(列C)、および収入データ(列T経由G)が含まれていますが、(私がすることによってフィルタリングする必要がある)に関連するユーザー名が含まれていません。

これらのリストのエントリの量は常に変化しますので、何か動的なものが必要です。

基本的には、特定のユーザーに割り当てられているケースのみを表示するように収益レポートを自動フィルタリングする必要があります。

これは私が最初の部分のために、これまで持っているものです。

Set MyRange = Range("A1").CurrentRegion 
Selection.AutoFilter Field:=23, Criteria1:="User1" 
Range("K2").Select 
Range(Selection, Selection.End(xlDown)).Select 
Dim arr As Variant 
arr = Selection 

これは「User1」に関連する唯一のショーケースにケースリストをオートフィルタ、その後、列K(ケースの目に見える結果をコピーします。 User1に関連付けられたファイル名)を配列に追加します。

次に、2番目のシート(revenue.csv)の2番目のオートフィルタの基準としてその配列を使用して、User1に関連付けられたケースファイル名の収益情報が表示されるようにしました。

私は2番目の部分で立ち往生しています。好ましくは、CSVファイルとして両方のレポートを指定のディレクトリにダウンロードしたいとします(例としてC:\test\としましょう)。

次に、このマクロが有効なワークブック(macro.xlsmと呼ぶ)を開き、両方のレポートのワークシートを自動的に読み込み、オートフィルタ>結果を配列>オートフィルタに再度実行します。

ここでは読み込みスクリプトで申し訳ありません。

Sub Button1_Click() 
Dim directory As String, fileName As String, sheet As Worksheet, total As Integer 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 
directory = "C:\test\" 
fileName = Dir(directory & "*.xl??") 
Do While fileName <> "" 
    Workbooks.Open (directory & fileName) 
For Each sheet In Workbooks(fileName).Worksheets 
    total = Workbooks("macrotest.xlsm").Worksheets.Count 
    Workbooks(fileName).Worksheets(sheet.Name).Copy _ 
    after:=Workbooks("import-sheets.xlsm").Worksheets(total) 
Next sheet 
Workbooks(fileName).Close 
fileName = Dir() 
Loop 
Application.ScreenUpdating = True 
Application.DisplayAlerts = True 
End Sub 

基本的に、私はその中のすべてのコードで彼らにこのmacro.xlsmを提供するだろう、と彼らがしなければならないだろうすべては、特定のディレクトリに2つのレポートをダウンロードし、オープンmacro.xlsm、その後、ボタンをクリックしていますレポートが読み込まれ、自動フィルタリングされ、[収入]シートは[User1]に関連付けられたケースのみでフィルタリングされます。

HELP!

+0

HI Scott。ちょうど両方のファイルの "ケースファイル名"がユニークであると思っていますか?はいの場合は、配列と自動フィルタの代わりに辞書を使用してみてください。私の意見だけです。 – user2851376

+0

@ user2851376 'cases.csv'は全てのケースの包括的なリストです(重複レコードはありません)。また、' revenue.csv'はどちらのケースでも重複しません。だから、ケースファイル名はユニークなものになるでしょう。オートフィルタで辞書を使用するにはどうすればよいですか? –

+0

あなたの問題は解決しましたか? – nightcrawler23

答えて

0

私はあなたの問題を再現しようとしたので、データは、異なる細胞、

ファイル1、例にあるかもしれません。CSV

コルA - ケース名

コルB - ケース名

コルB - - ユーザ名

ファイル2、

コルA revenues.csv売上データが

ファイル3、Report.xlsm

範囲( "A1")= "ユーザ名"

コルC:D - 出力3

Sub getRevenue() 
' 
' Macro2 Macro 
' 

' 
    Range("C2:D" & Range("C" & Rows.Count).End(xlUp).Row).ClearContents 

    Dim username As String 
    username = Range("A1") 

    Dim wbCases As Workbook 
    Dim numCases As Integer 

    Set wbCases = Workbooks.Open("C:\xxx\xxx\xxx\cases.csv") 
    ActiveSheet.Range("$A$1:$B$" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter _ 
      Field:=2, Criteria1:=username 
    Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Select 
    Selection.Copy 
    ThisWorkbook.Activate 
    Range("C2").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = False 
    numCases = Selection.Rows.Count 
    wbCases.Close 

    Dim cases() As String 
    ReDim cases(1 To numCases) As String 
    For i = 1 To numCases 
     cases(i) = Selection(i, 1) 
    Next i 

    Dim wbRev As Workbook 
    Set wbRev = Workbooks.Open("C:\xxx\xxx\xxx\Revenue.csv") 

    ActiveSheet.Range("$A$1:$B$" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter _ 
     Field:=1, Criteria1:=cases, Operator:=xlFilterValues 
    Range("$A$2:$B$" & Range("A" & Rows.Count).End(xlUp).Row).Select 
    Selection.Copy 
    ThisWorkbook.Activate 
    Range("C2").Select 
    ActiveSheet.Paste 
    Application.CutCopyMode = False 
    wbRev.Close 
End Sub 

これは生成されるファイルからマクロ以下

実行(行1はヘッダーです)指定したユーザー名のケース名と収益データのリスト( "A1")

乾杯

関連する問題