Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何使用VBA将两个定义日期之间的数据复制到新工作表?_Excel_Vba - Fatal编程技术网

Excel 如何使用VBA将两个定义日期之间的数据复制到新工作表?

Excel 如何使用VBA将两个定义日期之间的数据复制到新工作表?,excel,vba,Excel,Vba,我试图将“数据”工作表中的数据复制到已创建的名为“日期数据”的工作表中。我希望用户能够在名为“无输入”的单独工作表中输入开始日期(“L15”)和结束日期(“L16”)。点击一个按钮…然后“数据”工作表中的数据被拉入“日期数据”工作表,只包括这些日期之间的记录(包括开始日期和输入日期)。我希望这是有道理的哈哈 我尝试了下面的方法,但不断出现错误。第一个是“Range类的排序方法失败1004”。下面的代码也不使用预设工作表来复制数据,而是在所有工作表的末尾创建一个工作表(我不希望这样) “数据”工作

我试图将“数据”工作表中的数据复制到已创建的名为“日期数据”的工作表中。我希望用户能够在名为“无输入”的单独工作表中输入开始日期(“L15”)和结束日期(“L16”)。点击一个按钮…然后“数据”工作表中的数据被拉入“日期数据”工作表,只包括这些日期之间的记录(包括开始日期和输入日期)。我希望这是有道理的哈哈

我尝试了下面的方法,但不断出现错误。第一个是“Range类的排序方法失败1004”。下面的代码也不使用预设工作表来复制数据,而是在所有工作表的末尾创建一个工作表(我不希望这样)

“数据”工作表的标题都在第1行,数据从A2开始…它有19列标题(因此数据已填充),我希望它查找的日期在G列中。G1=标题,G2=日期开始。日期格式=日/月/年

我该怎么做呢?任何帮助都将不胜感激。多谢各位

Private Sub CommandButton2_Click()

Application.ScreenUpdating = False

Dim StartDate, EndDate As Date
Dim MainWorksheet As Worksheet

StartDate = Sheets("NoEntry").Range("L15").Value
EndDate = Sheets("NoEntry").Range("L16").Value

Set MainWorksheet = Worksheets("Data")

MainWorksheet.Activate

Range("G1").CurrentRegion.Sort key1:=Range("G1"), order1:=xlAscending, Header:=xlYes

Range("G1").CurrentRegion.AutoFilter Field:=7, Criteria1:=">=" & StartDate, Operator:=xlAnd,        
Criteria2:="<=" & EndDate

ActiveSheet.AutoFilter.Range.Copy

Worksheets.Add after:=Worksheets(Worksheets.Count)

ActiveSheet.Paste

Selection.Columns.AutoFit

Range("G1").Select

MainWorksheet.Activate

Selection.AutoFilter

Sheets("NoEntry").Activate

End Sub
Private子命令按钮2\u单击()
Application.ScreenUpdating=False
Dim StartDate,EndDate作为日期
将主工作表设置为工作表
起始日期=板材(“无入口”).范围(“L15”).值
EndDate=图纸(“无入口”).范围(“L16”).值
设置主工作表=工作表(“数据”)
主工作表。激活
范围(“G1”).CurrentRegion.Sort键1:=范围(“G1”),顺序1:=xl升序,标题:=xlYes
范围(“G1”).CurrentRegion.AutoFilter字段:=7,标准1:=“>=”&起始日期,运算符:=xlAnd,
准则2:=“首先,请参阅以了解如何避免在代码中使用select。几乎没有必要使用它

关于我提供的代码(现在已测试!),请参见下面的注释

1) 您遇到了一个问题,即正在添加工作表,而您不知道如何/为什么,并且不确定数据的目的地。为了解决这个问题,通常会显式定义工作表对象。这使您更容易理解,同时也减少了错误的范围。我已对“数据工作表”的工作表为
wsData
,“日期数据工作表”的工作表为
wsDate
,“无输入工作表”的工作表为
wsNoEntry
。您看到现在理解起来有多容易了吗

2) 确保数据集中的日期存储为“日期”类型值。您可以在数字格式功能区下执行此操作

3) 我选择使用数组进行循环。根据数据集的大小,这将是一种更快的循环方式,以获取开始和结束日期

4) 这种方法假设您的数据按日期列(G)排序

Sub-CopyDataUsingDateRange()
Application.ScreenUpdating=False
将wsData设置为工作表、wsDate设置为工作表、wsNoEntry设置为工作表
Dim dSDate作为日期,dEDate作为日期
暗淡的lRowStart尽可能长,lRowsend尽可能长
Dim aData()作为变量
我想我会坚持多久
'设置工作表对象
设置wsData=ThisWorkbook.Sheets(“数据”)
设置wsDate=ThisWorkbook.Sheets(“日期数据”)
设置wsNoEntry=thiswoolk.Sheets(“无条目”)
'必需变量
dSDate=wsNoEntry.Range(“L15”)值
dEDate=wsNoEntry.Range(“L16”)值
'设置阵列-您可以使其动态化!
aData=wsData.Range(“A1:Z1000”).值
'以便循环找到开始
对于i=1到1000
如果aData(i,7)=dSDate,则
lRowStart=i
Debug.Print“Start row=“&lRowStart
退出
如果结束
接下来我
'现在向后循环以查找结束日期
对于i=1000到1步骤-1
如果aData(i,7)=dEDate那么
lRowEnd=i
Debug.Print“End row=“&lRowEnd
退出
如果结束
接下来我
“现在我们有了开始和结束日期
'为了简单起见,将使用复制/粘贴
wsData.Range(“A”和lRowStart,“Z”和lRowEnd).Copy
'粘贴在日期表中
wsDate.Range(“A1”).Paste特殊粘贴:=xlPasteValues
'清除剪贴板
Application.CutCopyMode=False
Application.ScreenUpdating=True
端接头
希望这对您有所帮助,主要是对您的理解,以便您可以利用它为将来使用!

首先,请参阅以了解如何避免在代码中使用select。几乎没有必要使用它

关于我提供的代码(现在已测试!),请参见下面的注释

1) 您遇到了一个问题,即正在添加工作表,而您不知道如何/为什么,并且不确定数据的目的地。为了解决这个问题,通常会显式定义工作表对象。这使您更容易理解,同时也减少了错误的范围。我已对“数据工作表”的工作表为
wsData
,“日期数据工作表”的工作表为
wsDate
,“无输入工作表”的工作表为
wsNoEntry
。您看到现在理解起来有多容易了吗

2) 确保数据集中的日期存储为“日期”类型值。您可以在数字格式功能区下执行此操作

3) 我选择使用数组进行循环。根据数据集的大小,这将是一种更快的循环方式,以获取开始和结束日期

4) 这种方法假设您的数据按日期列(G)排序

Sub-CopyDataUsingDateRange()
Application.ScreenUpdating=False
将wsData设置为工作表、wsDate设置为工作表、wsNoEntry设置为工作表
Dim dSDate作为日期,dEDate作为日期
暗淡的lRowStart尽可能长,lRowsend尽可能长
Dim aData()作为变量
我想我会坚持多久
'设置工作表对象
设置wsData=ThisWorkbook.Sheets(“数据”)
设置wsDate=ThisWorkbook.Sheets(“日期数据”)
设置wsNoEntry=thiswoolk.Sheets(“无条目”)
'必需变量
dSDate=wsNoEntry.Range(“L15”)值
dEDate=wsNoEntry.Range(“L16”)值
'设置阵列-您可以使其动态化!
aData=wsData.Range(“A1:Z1000”).值
“f
Dim StartDate As Date, EndDate As Date
Dim MainWorksheet As Worksheet, NewWorkSheet As Worksheet

StartDate = Sheets("NoEntry").Range("L15").Value
EndDate = Sheets("NoEntry").Range("L16").Value

Set MainWorksheet = Worksheets("Data")

With MainWorksheet
    ' SORT RANGE
    .Range("G1").CurrentRegion.Sort key1:=.Range("F1"), order1:=xlAscending, Header:=xlYes

    Set NewWorkSheet = Worksheets.Add(after:=Worksheets(Worksheets.Count))
    With .Range("$A:$G")
        ' SORT RANGE 
        .AutoFilter Field:=7, Criteria1:=">=" & StartDate, Operator:=xlAnd, _
                              Criteria2:="<=" & EndDate
        ' COPY VISIBLE AND NON-BLANK CELLS TO NEW WORKSHEET     
         Application.Intersect(.SpecialCells(xlCellTypeVisible), _
                               .SpecialCells(xlCellTypeConstants)).Copy _
                               Destination:=NewWorkSheet.Range("A1")
    End With        
    ' REMOVE FILTER
    .Cells.AutoFilter
End With

Sheets("NoEntry").Activate
Set MainWorksheet = Nothing: Set NewWorkSheet = Nothing