找到具有特定值的单元格,然后删除所有行

时间:2017-12-22 01:04:12

标签: excel vba excel-vba

我在工作中有点头脑。

我正在使用快速Excel工具来帮助我在工作中做报告。我们的订单管理软件可以导出到Excel,但数据需要一些修整。有3列有我需要的信息(C,D和R)。

我需要做的是在C列中找到一个特定的值,删除之后的所有内容,并删除除D和R之外的所有行。到目前为止,我已经能够通过录制宏来完成这个的后半部分,但我是遇到第一个问题。

这是我到目前为止通过宏录制产生的。

Sub SortCopy()
'
' SortCopy Macro
'
' Keyboard Shortcut: Ctrl+w
'
    Range("A:C,E:Q,S:AN").Select
    Range("S1").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("A:B").Select
    ActiveWorkbook.Worksheets("Sorting").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sorting").Sort.SortFields.Add Key:=Range("A2:A3436") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sorting").Sort
        .SetRange Range("A1:B4000")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A1:B1102").Select
    Selection.Copy
End Sub

我没有VBA经验。我已经离开了我的联盟。

3 个答案:

答案 0 :(得分:0)

VBA并不那么可怕,只需要一次尝试和错误。像你在这里录制的宏是学习和查看它如何工作的最佳方式。不幸的是,宏录制不会告诉你如何进行条件(if-else)语句或循环,我认为你需要做你想做的事情。以下是一些可以添加到宏的基本循环代码:

Dim found As Boolean
found = False
' start loop
Do While ActiveCell.Value <> Empty

    ' check cell for specific value
    If ActiveCell.Value = "whatever" Then
        found = True
        ActiveCell.Offset(1, 0).Select
    End If

    If found Then
        ' delete row
        ActiveCell.EntireRow.Delete (xlShiftUp)
    Else
        ' move down a cell
        ActiveCell.Offset(1, 0).Select
    End If

Loop

有更多有效的方法可以不涉及选择单元格,但我认为这是最容易理解的,并且看到它在调试器中工作(按F8键)。

答案 1 :(得分:0)

试试这个,我认为它会做你想要的。

Sub Trim_Data()
    Dim X as Integer
    Dim Last_Val as String
    Last_Val = InputBox(“Enter the value you wish to find in the data:”,”Enter last Value”,””)
    If Last_Val = “” then Exit Sub
    For X = 1 to 10000
        If Range(“C” & X).Value = Last_Val then Goto Found_It
    Next X
    Last_Val = MsgBox(“The entered Value was not found.”, vbcritical)
    Exit Sub
Found_It:
    Range(“A” & (X + 1) & “:A10000”).EntireRow.Delete
    Range(“S1:ZZ1”).EntireColumn.Delete
    Range(“E1:Q1”).EntireColumn.Delete
    Range(“A1:C1”).EntireColumn.Delete
End Sub

答案 2 :(得分:0)

这是一种可行的方法。而是每次删除数据,将数据保留在自己的工作表中,然后根据该数据创建视图。我使用ADO,这可能是不熟悉的更多信息here

以下是我的数据设置,所有数据都在名为Raw的工作表中。我创建了一个名为View的新工作表,这是查询完成后数据的位置。我通过创建18个不同的字段(或列)来模拟您的数据集。我将它们命名为Field 1Field 2Field 3 ...一直到`Field 18,再次在数据表中。确保您的数据包含标题,例如同一行有意义的名字。

我假设您正在寻找String而不是DateNumeric类型,因此查询被设计为一个简单示例,因此仅适用于{ {1}}。它可以针对不同类型进行修改:)

要明确的是,我指的是代码的这一部分:

String

运行子SQL = "Select [Field 3], [Field 4], [Field 18] from [Raw$] Where [Field 3] = '" & LookFor & "'",应在查看表中显示结果。

caller