0

背景:我有一个用于跟踪信用卡应付账款的 Excel 文件。有 18 列数据(A 到 R)。在这 18 列中,我想使用一个宏来过滤特定的声明日期,然后是特定的公司代码。

每个公司代码将被分配一个新的工作表。在每个工作表中,我想根据标准从主工作表中引入特定的单元格。例如,宏应首先对语句日期(2012 年 7 月 31 日)排序,然后是公司代码 (ABC)。然后,我需要运行一个循环来提供详细信息。例如,在主工作表中,需要将 P 列中的 GL 代码复制到 H 列中的“ABC”工作表中。

以下是需要发生的事情的摘要:
1. 清除过滤器范围 (A2:R2) 中的所有过滤器
2. 在单元格 A3 开始的“主”工作表上过滤单元格 A1 中的日期(日期列)
3. 过滤公司代码( ABC) 在 O 列

这应该为特定公司的报表活动提供数据集。以下是接下来需要发生的事情:
4. 将“主”工作表中的 P 列单元格值复制到“ABC”工作表中的 C
列 5.将“主”工作表中的 N 列单元格值复制到“ABC”工作表中的 D 列
6.复制“主”工作表中的 R 列单元格值到“ABC”工作表中的 H
列 7. 将“主”工作表中的 F 列单元格值复制到“ABC”工作表中的 G 列,但最多 30 个字符
8. 如果 G 列在“主”工作表 >=0,然后将该值复制到“ABC”工作表中的 E 列(否则需要为零)
9. 如果“主”工作表中的 G 列值 <0,

这可能吗?

4

1 回答 1

0

这是一个可以帮助您入门的子程序。我没有实施你的所有步骤,但我相信这足以让你自己完成。如果您发现此答案有助于您到达目的地,请接受此答案。如果您在此处遇到任何问题,请在此答案中添加评论以寻求澄清。

我只测试了虚拟数据,但我所做的工作是成功的。

Option Explicit

Sub TransferData()
Dim Master As Worksheet
Dim NewSheet As Worksheet
Dim CompanyList As Object
Dim lRow As Long, lMaxRow As Long, lNewRow As Long
Dim vDictItem As Variant

Set CompanyList = CreateObject("Scripting.Dictionary")

Set Master = ThisWorkbook.Sheets("Master")

If Master.FilterMode Then
    Master.ShowAllData
End If

Master.Range("A:R").Sort Master.Range("A2"), xlAscending, Master.Range("O2"), , xlAscending, , , xlYes

lMaxRow = Master.Range("A" & Master.Rows.Count).End(xlUp).Row
For lRow = 3 To lMaxRow
    If Not CompanyList.Exists(Master.Range("A" & lRow).Value) Then
        CompanyList.Add Master.Range("A" & lRow).Value, Master.Range("A" & lRow).Value
    End If
Next lRow

For Each vDictItem In CompanyList.Keys
    Master.Range("A3:R" & lMaxRow).AutoFilter 1, vDictItem
    If Master.Cells.SpecialCells(xlCellTypeVisible).Count > 0 Then
        Set NewSheet = ThisWorkbook.Worksheets.Add
        NewSheet.Name = vDictItem
        lNewRow = 1
        For lRow = 3 To lMaxRow
            If Master.Rows(lRow).Hidden = False Then
                lNewRow = lNewRow + 1
                NewSheet.Range("C1").Value = Master.Range("P1").Value
                NewSheet.Range("C" & lNewRow).Value = Master.Range("P" & lRow).Value
                NewSheet.Range("G1").Value = Master.Range("F1").Value
                NewSheet.Range("G" & lNewRow).Value = Left(Master.Range("F" & lRow).Value, 30)
                NewSheet.Range("E1").Value = Master.Range("G1").Value & " (POS)"
                NewSheet.Range("F1").Value = Master.Range("G1").Value & " (NEG)"
                If Master.Range("G" & lRow).Value >= 0 Then
                    NewSheet.Range("E" & lNewRow).Value = Left(Master.Range("G" & lRow).Value, 30)
                Else
                    NewSheet.Range("F" & lNewRow).Value = Left(Master.Range("G" & lRow).Value, 30)
                End If
            End If
        Next lRow
    End If
Next vDictItem


End Sub
于 2012-07-28T06:06:54.843 回答