我正在尝试创建一个宏来检查整个excel工作表,并查找从今天起2天后或之前是否有日期';日期 Private子命令按钮5_单击() 将ws设置为工作表,将lRow设置为整数 对于工作表中的每个ws 如果ws.Name为“Sheet1”,则 lRow=ws.Range(“A”&Rows.Count).End(xlUp).Row 对于范围内的每个单元格(“A2:A”和lRow) 如果cell.Value>=Date-2和cell.Value
检查整个Excel工作表的速度非常慢,如果您有大量数据 但您可以直接访问包含值的单元格,忽略空格并检查该值是否满足您的要求我正在尝试创建一个宏来检查整个excel工作表,并查找从今天起2天后或之前是否有日期';日期 Private子命令按钮5_单击() 将ws设置为工作表,将lRow设置为整数 对于工作表中的每个ws 如果ws.Name为“Sheet1”,则 lRow=ws.Range(“A”&Rows.Count).End(xlUp).Row 对于范围内的每个单元格(“A2:A”和lRow) 如果cell.Value>=Date-2和cell.Value,excel,vba,Excel,Vba,检查整个Excel工作表的速度非常慢,如果您有大量数据 但您可以直接访问包含值的单元格,忽略空格并检查该值是否满足您的要求 Private Sub CommandButton5_Click() Dim ws As Worksheet, lRow As Integer For Each ws In Worksheets If ws.Name <> "Sheet1" Then lRow = ws.Range("A" & Rows.Count).End(
Private Sub CommandButton5_Click()
Dim ws As Worksheet, lRow As Integer
For Each ws In Worksheets
If ws.Name <> "Sheet1" Then
lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
For Each cell In Range("A2:A" & lRow)
If cell.Value >= Date - 2 And cell.Value <= Date + 2 Then
cell.EntireRow.Copy Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
End If
Next cell
End If
Next ws
End Sub
对于ws.Cells.SpecialCells(xlCellTypeConstants,1)中的每个rng,如果日期是公式,则将xlCellTypeConstants更改为xlCellTypeFormulas
如果rng.Value>=Date和rng.Value检查整个Excel工作表的速度非常慢,如果您有大量数据
但您可以直接访问包含值的单元格,忽略空格并检查该值是否满足您的要求
Private Sub CommandButton5_Click()
Dim ws As Worksheet, lRow As Integer
For Each ws In Worksheets
If ws.Name <> "Sheet1" Then
lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
For Each cell In Range("A2:A" & lRow)
If cell.Value >= Date - 2 And cell.Value <= Date + 2 Then
cell.EntireRow.Copy Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
End If
Next cell
End If
Next ws
End Sub
对于ws.Cells.SpecialCells(xlCellTypeConstants,1)中的每个rng,如果日期是公式,则将xlCellTypeConstants更改为xlCellTypeFormulas
如果rng.Value>=Date和rng.Value与其他用户建议的类似,则需要验证是否正在比较类似的数据类型。在下面的示例中,我添加了一个检查,以验证您正在比较的单元格实际上是一个日期。如果是这样,那么excel可以处理减去它们的操作。此外,abs(值)将处理您的“之前或之后”2天时间检查
正如其他人所说,有其他方法来处理这个问题,但这就是我如何使用您开始使用的方法检查工作表上的每个单元格的方法
For Each rng In ws.Cells.SpecialCells(xlCellTypeConstants, 1) 'change xlCellTypeConstants to xlCellTypeFormulas if your dates are formulas
If rng.Value >= Date And rng.Value <= (Date + 2) Then
'do what you want
End If
Next rng
Dim ws,复印件作为工作表
Dim cel,搜索范围作为范围
设置ws=ActiveWorkbook.Sheets(“SheetYouWantToCheck”)
设置searchRange=ws.UsedRange
设置copySheet=ActiveWorkbook.Sheets(“SheetYouWantToCopyTo”)
对于searchRange.Cells中的每个cel
如果IsDate(单元格值)=True,则
如果Abs(cel.Value-Date)与其他用户建议的类似,则需要验证是否正在比较类似的数据类型。在下面的示例中,我添加了一个检查,以验证您正在比较的单元格实际上是一个日期。如果是这样,那么excel可以处理减去它们的操作。此外,abs(值)将处理您的“之前或之后”2天时间检查
正如其他人所说,有其他方法来处理这个问题,但这就是我如何使用您开始使用的方法检查工作表上的每个单元格的方法
For Each rng In ws.Cells.SpecialCells(xlCellTypeConstants, 1) 'change xlCellTypeConstants to xlCellTypeFormulas if your dates are formulas
If rng.Value >= Date And rng.Value <= (Date + 2) Then
'do what you want
End If
Next rng
Dim ws,复印件作为工作表
Dim cel,搜索范围作为范围
设置ws=ActiveWorkbook.Sheets(“SheetYouWantToCheck”)
设置searchRange=ws.UsedRange
设置copySheet=ActiveWorkbook.Sheets(“SheetYouWantToCopyTo”)
对于searchRange.Cells中的每个cel
如果IsDate(单元格值)=True,则
如果Abs(cel.Value-Date)我建议您将工作表的usedRange
读入一个数组(=1个非常快速的语句),然后在数组上循环。请。检查我的评论重新复制目标(sheet2
),避免多次复制同一行
Dim ws, copySheet As Worksheet
Dim cel, searchRange As Range
Set ws = ActiveWorkbook.Sheets("SheetYouWantToCheck")
Set searchRange = ws.UsedRange
Set copySheet = ActiveWorkbook.Sheets("SheetYouWantToCopyTo")
For Each cel In searchRange.Cells
If IsDate(cel.Value) = True Then
If Abs(cel.Value - Date) <= 2 Then
copySheet.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = cel.Value
End If
End If
Next
Private子命令按钮5_单击()
将ws设置为工作表
将最后一个单元格设置为范围
暗淡的i一样长,j一样长,未使用的Row一样长
作为变量的Dim VAL
将目标工作表变暗为工作表
设置targetSheet=Sheets(“Sheet2”)'是否确实要复制到Sheet2?这是你正在搜索的表单之一。。。。。。。。
对于工作表中的每个ws
如果ws.Name为“Sheet1”,则
设置lastCell=ws.Cells.Find(What:=“*”,After:=ws.Cells(1,1),LookIn:=xlformals,LookAt:=_
xlPart,SearchOrder:=xlByRows,SearchDirection:=xlPrevious,MatchCase:=False)
VAL=范围(ws.Cells(1,1),lastCell).Value
对于i=2到UBound(VAL,1)”,不包括任何工作表的第一行-如代码中所示
对于j=1至UBound(VAL,2)
如果IsDate(vals(i,j))那么
如果VAL(i,j)>=Date-2和VAL(i,j)我建议您将工作表中的usedRange
读入一个数组(=1个非常快速语句),然后在该数组上循环。请。检查我的评论重新复制目标(sheet2
),避免多次复制同一行
Dim ws, copySheet As Worksheet
Dim cel, searchRange As Range
Set ws = ActiveWorkbook.Sheets("SheetYouWantToCheck")
Set searchRange = ws.UsedRange
Set copySheet = ActiveWorkbook.Sheets("SheetYouWantToCopyTo")
For Each cel In searchRange.Cells
If IsDate(cel.Value) = True Then
If Abs(cel.Value - Date) <= 2 Then
copySheet.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = cel.Value
End If
End If
Next
Private子命令按钮5_单击()
将ws设置为工作表
将最后一个单元格设置为范围
暗淡的i一样长,j一样长,未使用的Row一样长
作为变量的Dim VAL
将目标工作表变暗为工作表
设置targetSheet=Sheets(“Sheet2”)'是否确实要复制到Sheet2?这是你正在搜索的表单之一。。。。。。。。
对于工作表中的每个ws
如果ws.Name为“Sheet1”,则
设置lastCell=ws.Cells.Find(What:=“*”,After:=ws.Cells(1,1),LookIn:=xlformals,LookAt:=_
xlPart,SearchOrder:=xlByRows,SearchDirection:=xlPrevious,MatchCase:=False)
VAL=范围(ws.Cells(1,1),lastCell).Value
对于i=2到UBound(VAL,1)”,不包括任何工作表的第一行-如代码中所示
对于j=1至UBound(VAL,2)
如果IsDate(vals(i,j))那么
如果vals(i,j)>=Date-2且vals(i,j)迭代包含日期的所有单元格,首先我们可以使用特殊单元格类型xCellTypeLastCell查找最后一个填充了数据的单元格
然后,我们从A1(即1,1)的起始位置循环所有单元格,直到我们之前找到的最后一个单元格
如果我们发现一个单元格符合OP定义的条件,我们会将其复制到另一个工作表中
Private Sub CommandButton5_Click()
Dim ws As Worksheet
Dim lastCell As Range
Dim i As Long, j As Long, unusedRow As Long
Dim vals As Variant
Dim targetSheet As Worksheet
Set targetSheet = Sheets("Sheet2") 'Do you really want to copy to Sheet2? Its one of the sheets you re searching........
For Each ws In Worksheets
If ws.Name <> "Sheet1" Then
Set lastCell = ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
vals = Range(ws.Cells(1, 1), lastCell).Value
For i = 2 To UBound(vals, 1) 'Excludes the first row of any sheet - as in your code
For j = 1 To UBound(vals, 2)
If IsDate(vals(i, j)) Then
If vals(i, j) >= Date - 2 And vals(i, j) <= Date + 2 Then
unusedRow = targetSheet.Cells.SpecialCells(xlCellTypeLastCell).Offset(1, 0).Row
ws.Rows(i).Copy targetSheet.Cells(unusedRow, 1)
Exit For 'Assume you dont want to copy the same line more than once - so quit the inner loop after the first find
End If
End If
Next j
Next i
End If
Next ws
End Sub
Private子命令按钮5_单击()
将ws作为工作表,xlastRow作为整数,xlastCol作为整数
对于工作表中的每个ws
如果ws.Name为“Sheet1”,则
xlastRow=ws.Cells.SpecialCells(xlCellTypeLastCell).Row
xlastCol=ws.Cells.SpecialCells(xlCellTypeLastCell).Column
暗淡单元格作为范围
对于范围内的每个单元格(ws.Cells(1,1),ws.Cells(xlastRow,xlastCol))
如果cell.Value>=日期-2和单元格。