一个做电商的用户需要对excel里拟定好的商品名称进行归类,以规避风险和提高竞争优势。
具体操作:
在 筛选词 sheet表先循环每列,再循环每行的数据到 数据 sheet表里进行筛选。
如果 数据 sheet表B列的值包含筛选词,则对B列标红,同时在C列填入筛选词所在列的表头,D列填入该词。
看下面图片(点击可放大)
实际上如果将 筛选词 sheet表的数据都放在一个列里,用vlookup 函数可轻松实现,只是需求变动不了,故用VBA来做。
VBA代码重点:
1,筛选,并把筛选结果保存到临时数组里,
2,通过列位置找到对应列的名称。
全部代码如下:
Sub 筛选并归类() Dim s1, s2, i, k, r, j, j_a, m, n, m_n, k_n, k_j Dim LastRow As Long Dim rng As Range, Rng1 As Range Set s1 = Sheets("筛选词") Set s2 = Sheets("数据") k = s1.Range("IV1").End(xlToLeft).Column '获取S1的已用列数 '循环每一列 For i = 1 To k j_a = Chr(i + Asc("A") - 1) '获取S1表的列名 biaotou = s1.Range(j_a & 1) '获取S1表的首行数据即表头 Set r = s1.Range(j_a & Rows.Count).End(xlUp) '获取S1表的具体列的已用行数 '循环每一行 For j = 2 To r.Row ci = s1.Range(j_a & j) '获取单元格数据 Debug.Print ci With s2 .UsedRange LastRow = .Cells.SpecialCells(xlCellTypeLastCell).Row '返回s2表的最后一行行号 Set rng = .Range("A1:B" & LastRow) '选中s2表的A-B列全部区域,因为需要A列的序号来区分行号 rng.AutoFilter Field:=2, Criteria1:="=*" & ci & "*" '筛选B列包含 ci 的数据 Set Rng1 = rng.SpecialCells(xlCellTypeVisible) '获取可见行数据(筛选结果) 'Debug.Print Rng1.Areas(1, 1) If Rng1.Areas.Count > 1 Then m = 1 lc = Rng1.Columns.Count lr = Rng1.Cells.Count / lc Debug.Print lc Debug.Print Rng1.Cells.Count '准备个数组 Dim arr() ReDim Preserve arr(1 To lr) For Each r In Rng1.Areas a = r For m_n = 1 To UBound(a) For k_j = 1 To UBound(a, 2) arr(m) = a(m_n, 1) Next m = m + 1 Next Next '循环数组存入的行数 Debug.Print UBound(arr, 1) For k_n = 2 To UBound(arr, 1) Number = arr(k_n) .Range("B" & Number).Interior.Color = RGB(255, 0, 0) '匹配到则相应单元格背景色为红 .Range("C" & Number) = biaotou .Range("D" & Number) = ci Next End If rng.AutoFilter '关闭自动筛选 End With Next Next MsgBox ("执行完毕!") End Sub
带数据的xlsm样例文件下载
链接:
https://pan.baidu.com/s/1g5Xn5jRtCk7A_-h55GNqqg
此处为隐藏的内容
发表评论并刷新,方可查看