【问题标题】:if single cell value is found in a range then delete entire row如果在范围内找到单个单元格值,则删除整行
【发布时间】:2013-10-07 20:40:50
【问题描述】:

我正在处理每个站点记录 31 天数据的每日数据,我需要一个 VBA 代码来删除闰年日。我有一个记录的数据日期列表和一个我想删除的不是闰年的年份列表。为了删除额外的 30 和 31 天,我使用了以下基本代码:

Dim lastrow, i As Long

lastrow = ActiveSheet.Cells(65536, 1).End(xlUp).Row

For i = 1 To lastrow
    'delete 31st days for February
    If ActiveSheet.Range("D" & i) = 2 And ActiveSheet.Range("E" & i) = 31 Then
        Rows(i).Select
        Selection.Delete shift:=xlUp
    End If
Next i

非常简单并且运行良好,所以我希望能够做类似的事情,在数据中找到不存在的日期(即 02/29/非闰年)并删除该行,但结果是很难匹配一个范围内的值。我的想法是这样的:

Dim lastrow, i As Long, leapyear as Workbook

Set leapyear = Workbooks("LeapYears.xlsx")

lastrow = ActiveSheet.Cells(65536, 1).End(xlUp).Row

For i = 1 To lastrow
    'obviously this is where I have the problem trying to match a cell to a range
    If ActiveSheet.Range("D" & i) = leapyear.Sheets(1)range("C2:C90") Then
        Rows(i).Select
        Selection.Delete shift:=xlUp
    End If
Next i

非常感谢任何帮助或其他方式来处理这个问题!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    This Question我的回答的修改版

    Sub Sample()
    
    Dim StartingScreenUpdateValue As Boolean
    Dim StartingEventsValue As Boolean
    Dim StartingCalculations As XlCalculation
    
    With Application
        StartingScreenUpdateValue = .ScreenUpdating
        StartingEventsValue = .EnableEvents
        StartingCalculations = .Calculation
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    
    
    Dim varTestValues As Variant
    
    varTestValues = Workbooks("LeapYears.xlsx").Sheets(1).Range("C2:C90")
    
    Rows(1).Insert
    [A1].FormulaR1C1 = "TempHeader1"
    [A1].AutoFill Destination:=Range("A1:H1"), Type:=xlFillDefault
    
    Range("D1").AutoFilter Field:=4, Criteria1:=Application.Transpose(varTestValues), Operator:=xlFilterValues
    
    Range("D2", Range("D" & Rows.Count).End(xlUp)) _
        .SpecialCells(xlCellTypeVisible).EntireRow.Delete
    
    ActiveSheet.AutoFilterMode = False
    Rows(1).Delete
    
    
    With Application
        .ScreenUpdating = StartingScreenUpdateValue
        .EnableEvents = StartingEventsValue
        .Calculation = StartingCalculations
    End With
    
    End Sub
    

    注意:此代码运行假设您的数据有标题,如果没有请告知。

    记住 始终在您的数据副本而非实际数据上运行任何代码,直到您确信它可以 100% 运行。

    【讨论】:

    • 这段代码几乎可以工作,但在线上中断 > ActiveSheet.Range("D2",sh1.Range("D" & ActiveSheet.Rows.Count)... 我的数据没有标题但是在 A 到 H 列中每个工作簿具有以下数据:“站 ID”、“元素类型”、“YYYY”、“MM”、“DD”、“MM/DD/YYYY”、“值”、“季节”。 LeapYears.xlsx 工作簿在 A 列中确实有带有“YYYY”的标题或在 C 列中带有“MM/DD/YYYY”的标题,可以与数据工作簿的相应列匹配以识别要删除的行。
    • 修复了问题行并添加了代码以添加和删除临时标头。让我知道它是否有效。
    • 感谢您的帮助!我还找到了另一个快速修复 - 因为我的数据使用日期,所以我能够选择 .NumberFormat = "General" 的任何单元格并删除整行,因为 Excel 没有将其识别为“日期”格式,因为日期不存在.再次感谢:)
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多