Excel 基于3个单独的值复制范围

Excel 基于3个单独的值复制范围,excel,vba,header,range,row,Excel,Vba,Header,Range,Row,我有两本作业本。一个以yyyw**.xlsx格式命名,其中*表示周数,另一个命名类似,但末尾有项目控制。第一个工作簿中有许多行包含许多值。从300个数字到800个数字不等。它们也有交付日期以及项目是活动的还是关闭的 项目控制工作簿包含3张工作表,一张用于2012年项目,一张用于2013年项目,一张用于已结束项目 我想问的是如何以编程方式获取数据范围,并将它们传输到新工作簿中的相应工作表中 谢谢 Project| Description | Delivery |

我有两本作业本。一个以yyyw**.xlsx格式命名,其中*表示周数,另一个命名类似,但末尾有项目控制。第一个工作簿中有许多行包含许多值。从300个数字到800个数字不等。它们也有交付日期以及项目是活动的还是关闭的

项目控制工作簿包含3张工作表,一张用于2012年项目,一张用于2013年项目,一张用于已结束项目

我想问的是如何以编程方式获取数据范围,并将它们传输到新工作簿中的相应工作表中

谢谢

Project|    Description             |   Delivery  |   Total Sales  |  
------------------------------------------------------------------------        
300661 |CCBS - HLP250               |   01/01/2012|  Active        |
------------------------------------------------------------------------      
300710 |STOCK - ITM250 ELECTRICS    |   01/01/2012|  Closed        |
------------------------------------------------------------------------      
300731 |Nirvana: 4th Piece packer   |   28/02/2012|  Closed        | 
------------------------------------------------------------------------     
300766 |STOCK - SATU                |   01/01/2012|  Active        | 
------------------------------------------------------------------------     
300767 |STOCK - HLP 250 CONVERSION  |   01/01/2012|  Active        | 
------------------------------------------------------------------------     
300768 |STOCK - PNEUMATIC, EMBOSSING|   01/01/2012|  Active        | 
------------------------------------------------------------------------     
412972 |I.T.M. BV                   |   23/05/2013|  Closed        |
------------------------------------------------------------------------      
412986 |I.T.M. BV                   |   17/07/2012|  Closed        | 
------------------------------------------------------------------------     
413001 |I.T.M. BV                   |   06/08/2012|  Closed        | 
------------------------------------------------------------------------     
510003 |Internal Project for issuing|   27/12/2013|  Active        | 
------------------------------------------------------------------------    
600161 |Tabak Invest  Kit & Conv    |   28/02/2012|  Closed        | 
------------------------------------------------------------------------     
600166 |UTC DUBAI                   |   10/01/2012|  Closed        | 
------------------------------------------------------------------------     
600168 |UTC HLP250 Conversion       |   20/02/2012|  Closed        | 
------------------------------------------------------------------------  
上述信息需要按照交付年份进行排序,无论是打开的还是关闭的,一旦放入正确的表格中,需要将其复制为数字顺序,如图所示


在上述示例中,由于交付日期和活动状态,项目510003将进入2013年工作簿,而300661、3006、300767和300768将全部进入2012年,其余项目将进入关闭工作表,因为项目已完成并处于关闭状态,这应该已经开始了。您必须进行一些调整以匹配实际数据和文件,但结构应该是实心的

Option Explicit

Sub MoveIt()

Dim wkbData As Workbook, wkbPaste As Workbook

Set wkbData = ThisWorkbook
Set wkbPaste = Workbooks("ProjectControl")

With wkbData

    Dim wks As Worksheet
    Set wks = Sheets(1) 'assumes data is in sheet1

    With wks

        ' -> note that use of .usedrange implies data is in a table with no other _
            data or formatting in the worksheet
        .UsedRange.AutoFilter 4, "Closed"

        Dim rng As Range
        Set rng = Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(xlCellTypeVisible)

        rng.Copy wkbPaste.Sheets("Closed")

        .UsedRange.AutoFilter 4, "Active"
        .UsedRange.AutoFilter 3, xlFilterThisYear

        Set rng = Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(xlCellTypeVisible)

        rng.Copy wkbPaste.Sheets("2012").Range("A1")

        .UsedRange.AutoFilter 4, "Active"
        .UsedRange.AutoFilter 3, xlFilterNextYear

        Set rng = Intersect(.UsedRange, .UsedRange.Offset(1)).SpecialCells(xlCellTypeVisible)

        rng.Copy wkbPaste.Sheets("2013").Range("A1")

    End With

End With

End Sub

从你的问题听起来,这相对容易做到,但是你自己试过什么吗?如果是这样的话,请将您尝试过的代码和不适合您的地方张贴出来。然后我们就可以投入工作,所以我不太确定如何根据单元格中的值来选择范围。我所做的唯一一件事就是运行一个宏并选择值,但正如预期的那样,代码只是显示为我高亮显示的单元格。选择作为范围时,我需要在没有用户输入的情况下自动执行此操作。请参阅编辑的问题,例如要移动的数据。您需要根据年份对其进行排序吗?创建一个贯穿整个范围的宏,并检查交付年份是2012年还是2013年,这取决于您将有两个宏将其添加到正确的工作簿中。一旦你在包含项目id的列上的每个工作簿中设置了一个过滤器。你可以很容易地解决这个问题,方法是记录一个宏并逐步构建代码,首先从几行开始,完成后扩展范围。当我说排序时,我的意思是将2012和2013工作表中的2012行放入2013,我不应该用实际的术语来解释我的意思,这是令人惊讶的,几个小问题(我希望如此)。我没有正确解释,xlthisyear和xlnextyear的过滤器将失败,因为交货日期列中有完整日期,如03-02-2012,行中也有一些数据必须进入某些单元格,实现这一点有多简单/如何为此修改代码?在说过滤器不起作用之前,您是否尝试过今年的
xl
xlNextYear
过滤器?如果没有,请测试代码,您可能会发现它确实有效(如果您使用xl2007/2010)。如果没有,那就不同了(关于将数据放入特定单元格的问题,由于这是您最初提出的一个单独问题,请接受此答案并发布另一个问题,以便您可以在这方面获得所需的帮助。如果您也展示您为解决问题所做的努力,这将大有帮助。是的,我尝试了过滤器,他们过滤了列柱ns但是一旦应用了过滤器,它就没有任何数据了,我仔细检查了代码,它正确地应用了过滤器,但它无法识别日期值,因此,一旦过滤,就没有数据可复制,程序也无法运行stops@JamesDev->这是因为日期值为欧洲格式。如果将其转换为美国格式,则应工作。@JamesDev讨厌的数据……但如果数据总是平滑的,我们就不会有工作:)