Vba 如何自动筛选列1并在列2中返回相关结果

Vba 如何自动筛选列1并在列2中返回相关结果,vba,excel,autofilter,Vba,Excel,Autofilter,这是我的第一篇文章。我不熟悉VBA和一般编程。我仍在努力掌握何时使用变量和其他一切。我写了一个基本的VBA对下载文件,不能改变。代码如下 Sub KPIMacroFull() Set sht = ThisWorkbook.Worksheets(Sheet1.Name) Rows("1:2").Select Selection.Delete Shift:=xlUp ActiveCell.Offset(0, 9).Activate Range("J:J").AutoFilter

这是我的第一篇文章。我不熟悉VBA和一般编程。我仍在努力掌握何时使用变量和其他一切。我写了一个基本的VBA对下载文件,不能改变。代码如下

Sub KPIMacroFull()

Set sht = ThisWorkbook.Worksheets(Sheet1.Name)
Rows("1:2").Select
    Selection.Delete Shift:=xlUp

ActiveCell.Offset(0, 9).Activate
    Range("J:J").AutoFilter 1, 20


lr = Cells(Rows.Count, "J").End(xlUp).Row
    If lr > 1 Then
        Range("A2:A" & lr).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End If


Cells.AutoFilter
Cells.AutoFilter


ActiveCell.Offset(0, 0).Activate
ActiveCell.Offset(0, 20).Activate


Range("AD1").EntireColumn.Insert
Range("AD1").Value = "Rush or Regular"
Range("A1:AK1").Columns.AutoFit
Range("AC:AC").AutoFilter 29, "D"
所以基本上我想做的是自动过滤列AC的值“D”,“K”,“Q”,“V”,“U”,1,9。然后在列AD中,excel将返回“常规”。对于AC列中的所有其他值(大约还有15个分类),我希望excel返回“Rush”。我正在考虑一个变量,将正则值设置为上述值,然后从那里开始,但我迷路了


我查看了许多其他autofilter和VBA帖子,但我的问题似乎更基本,没有发现任何太有用的东西。

此sniplet独立于您的解决方案,因为它太依赖于视图。
我的sniplet解析您的“AC”列,并完成您所需的所有填写。
这很费时,但没有你的那么多(我假设你没有处理100000个记录数据集,更像是对MMO的几百行评估,所以这真的不重要)。
过滤本身取决于您,将该部分添加到我的sub的末尾

Sub ertdfgcvb()
LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Dim RegBool As Boolean
Dim ert As String
Dim MyArray(6) As String
MyArray(0) = "D"
MyArray(1) = "K"
MyArray(2) = "Q"
MyArray(3) = "V"
MyArray(4) = "U"
MyArray(5) = "1"
MyArray(6) = "9"
For i = 1 To LastRow
    RegBool = False
    ert = CStr(Cells(i, 29).Value) 'the CStr is unnecessary
    'unless you want to make it case-insensitive, in which case
    'you'll want to wrap it in a UCase() function
    For j = 0 To 6 'size of your array
        If InStr(1, ert, MyArray(j)) <> 0 Then RegBool = True
    Next

    If RegBool Then
        Cells(i, 30) = "Regular"
    Else
        Cells(i, 30) = "Rush"
    End If
Next

End Sub
Sub-ertdfgcvb()
LastRow=单元格。查找(“*”,搜索顺序:=xlByRows,搜索方向:=xlPrevious)。行
Dim RegBool为布尔型
作为字符串的dimert
Dim MyArray(6)作为字符串
MyArray(0)=“D”
MyArray(1)=“K”
MyArray(2)=“Q”
MyArray(3)=“V”
MyArray(4)=“U”
MyArray(5)=“1”
MyArray(6)=“9”
对于i=1到最后一行
RegBool=False
ert=CStr(单元格(i,29)。值)‘CStr是不必要的
'除非您想使其不区分大小写,在这种情况下
'您需要将其包装到UCase()函数中
对于j=0到6'大小的阵列
如果InStr(1,ert,MyArray(j))为0,则RegBool=True
下一个
如果雷格布尔那么
单元(i,30)=“常规”
其他的
单元(i,30)=“冲”
如果结束
下一个
端接头

对不起,在最后一行之前,我的代码的所有部分都按照我的喜好工作。话虽如此,对其余部分的改进建议是受欢迎的,但我真正的问题是关于最后一行代码。你能在广告栏中写一条if语句,用“常规”和“快速”填充吗?谢谢Kyle,我相信我能,从逻辑上讲,这是有意义的。让我尝试一些事情,如果我再次被难倒,我会伸出援手。这应该可以做到。将其放入单元格AD1并向下拖动(假设您的数据从AC1开始)
=If(或(或)(AC1=“D”,AC1=“K”,AC1=“Q”,AC1=“V”,AC1=“U”,AC1=“1”,AC1=“9”),“Regular”,“Rush”)
谢谢Kyle,是的,这将起作用-但基本上我想做的是在VBA中编写公式,以实现过程的自动化。我想是某种布尔表达式。谢谢!!实际上,我正在处理100000多个数据集。102124特别是……我确信我的代码效率很低。在开头添加“righnow=Now”,然后在结尾添加“righnow2=Now”,以及“MsgBox(righnow2-righnow)”或其一些变体可以极大地帮助您优化运行时。