“如何创建工作表的动态视图(过滤器)” - 跟进

时间:2014-12-17 23:24:35

标签: excel excel-vba excel-formula vba

previous question中,提供了一个解决方案,用于在单独的工作表上创建主列表的动态子集。我需要做一些非常相似的事情,但似乎无法根据我的具体需要使解决方案适应其他问题。

我的情况是我有35个帐户要调和。每个帐户都有一个唯一的五位数字。主数据列表有6列。我想为35个帐户中的每个帐户创建一个工作表,每个工作表只会提取第三列与特定工作表帐户匹配的行。

进一步阐述。我们只拿三十五个中的三个。我们将使用40000,40100和40200.六列是“条目ID”,“日期”,“帐号”,“借记”,“信用”和“参考”。

在工作表1“40000”上,我想拉出六列数据,仅用于“帐号”=我的工作表名称(40000)的行。在第二个工作表,名为“40100”,我只想在“帐号”列中为包含“40100”的行提取六列数据,在第三个工作表上,称为“40200”,我想在“帐号”列中提取包含“40200”的六列数据。

上一个答案提供了一种在单独的工作表上创建子集的方法,但键值与主数据列表在同一工作表上。我希望在每个工作表上列出键值,这样我就不需要为每个帐户提供完整的数据列表。

编辑: This is the initial question/answer我在上面的问题中提到过。我喜欢使用“排名”的底层解决方案,但就像我上面说过的那样,如果键值可以在每个工作表上,我会很喜欢它,即40000,40100,40200等等,而不是主数据列表。关键值是工作表名称,即帐号(40000,40100等......)

床单已经存在。每个月我只打开上个月的工作表,将其保存为我的新月份,并用新月份的数据覆盖数据。

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

通过几个嵌套循环很容易实现。

关键要素是:获取每个工作表的最后一行,并循环遍历行,工作表和列,使用IF语句有条件地测试帐号是否与工作表名称匹配。

让我们从头到尾看一下。跟随评论:

<强> 1。循环浏览源表,每一行

<强> 2。遍历每个工作表以查找tempAccount值与工作表名称的匹配

第3。找到匹配后,循环遍历从一个工作表复制到下一个工作表的所有6列。

<强>试验:

Private Sub AccountsToSheets()

Dim lastRow As Long         'Last Row on source sheet
Dim lastTRow As String      'For last Target Row
Dim target As String        'For temp name
Dim tRow As Long            'Target Row

Dim source As String        'Source Sheet Name
Dim tempAccount As String   'Variable for account number
Dim ws As Worksheet         'For looping through worksheets

    '----SETUP VARIABLES----;
    source = "Sheet1"           'Define Name of Source Sheet HERE
    lastRow = Sheets(source).Range("A" & Rows.count).End(xlUp).row

    '----BEGIN LOOP THROUGH SOURCE SHEET----'
    For lRow = 2 To lastRow
        tempAccount = Sheets(source).Cells(lRow, "C").Text

        '--BEGIN LOOP THROUGH WORKSHEETS TO CHECK FOR MATCH--'
        For Each ws In Worksheets
            If ws.Name <> source Then           'Eliminate checking Source Sheet
                If ws.Name = tempAccount Then   'Use sheet that's name matches tempAccount
                    target = ws.Name
                    lastTRow = Sheets(target).Range("A" & Rows.count).End(xlUp).row
                    tRow = lastTRow + 1         'Set the row value on target sheet

                    '--LOOP THROUGH ALL COLUMNS AND COPY DATA--'
                    For lCol = 1 To 6
                        Sheets(target).Cells(tRow, lCol) = Sheets(source).Cells(lRow, lCol)
                    Next lCol
                End If
            End If
        Next ws
    Next lRow
End Sub

enter image description here enter image description here enter image description here enter image description here