excel - 如果单元格以某个 4 个字符开头,则移动到新工作表
问题描述
对于专家来说,这可能是一个简单的问题,所以很抱歉。我是 VBA 新手,花了大约 3 个小时试图通过谷歌搜索来解决这个问题。退出excel时,我越来越接近并且不知何故丢失了我的代码。
所以我有一个电子表格,它的行数会有所不同。这是一份报告,显示网络中所有计算机正在使用的某个软件的版本。今天的报告有 30,000 行。
有3列。A = 计算机名称。B = 软件名称。C = 软件版本。
计算机名称由 3 个字母、一个破折号和一个名称组成,构成一个单词。
我希望宏查看整个 A 列行并移动以例如 ABC- 和 DEF- 和 XYZ- 开头的 A 列的完整行,但不复制 MNO-。
我希望它将每个分支的计算机复制到自己的新工作表中,因此所有以 ABC 开头的计算机都转到名为 ABC(无破折号)的工作表,依此类推。
正如我所说,我丢失了我工作过的代码,所以这就是我到目前为止所拥有的,它是一个简单的删除代码,我一直在努力将其转换为移动代码。
Sub MoveToNewSheet()
Dim i As Long
With ActiveSheet
For i = .Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
If Left(.Cells(i, "A").Value, 4) = "DUB-" Then .Rows(i).Delete
Next
End With
End Sub
解决方案
我建议使用该Range.AutoFilter
方法。
如果包含所有数据的工作表名为Raw
,请尝试以下操作:
Option Explicit
Sub splitData()
Dim wsSrc As Worksheet, WS As Worksheet, WB As Workbook
Dim rSrc As Range, rDest As Range
Dim vSrc As Variant
Dim cCol As Collection
Dim I As Long, V As Variant
Dim sPrefix As String
'set source worksheet and range
Set WB = ThisWorkbook
Set wsSrc = WB.Worksheets("Raw")
'many ways to set the range
'may want to check that there is data on this worksheet
If WorksheetFunction.CountA(wsSrc.Cells) > 0 Then
Set rSrc = wsSrc.Cells(1, 1).CurrentRegion
Else
MsgBox "No data on Raw worksheet"
Exit Sub
End If
'get unique list of computer prefixes
Set cCol = New Collection
vSrc = rSrc.Columns(1) 'faster to loop through arrays
For I = 2 To UBound(vSrc, 1) 'skip the header column
sPrefix = Split(vSrc(I, 1), "-")(0)
On Error Resume Next 'collection will error when try to store duplicate key
cCol.Add Item:=sPrefix, Key:=sPrefix
On Error GoTo 0
Next I
Application.ScreenUpdating = False
'create new worksheets if needed
'copy relevant data to the new sheet
For Each V In cCol
Set WS = Nothing
On Error Resume Next
Set WS = WB.Worksheets(V)
On Error GoTo 0
If WS Is Nothing Then
Set WS = WB.Worksheets.Add(after:=WB.Worksheets(WB.Worksheets.Count))
WS.Name = V
End If
rSrc.Worksheet.AutoFilterMode = False
With rSrc
.AutoFilter field:=1, Criteria1:=V & "-*", Operator:=xlAnd
.SpecialCells(xlCellTypeVisible).Copy Destination:=WB.Worksheets(V).Cells(1, 1)
.Worksheet.AutoFilterMode = False
End With
Next V
End Sub
- 使用 VBA 数组提高速度,遍历所有计算机名称并获取唯一计算机前缀的集合
- 循环遍历集合,使用计算机前缀
- 确定目标工作表
- 如果不存在则创建工作表
- 为“开始于”计算机前缀加上连字符设置自动过滤器
- 将表格中的可见单元格复制到新工作表
- 冲洗并重复
我没有从原始数据中删除任何内容,以确保一切正常,但是,如果需要,您可以轻松地将其添加到代码中。
推荐阅读
- python - 试图理解 BeautifulSoup 中的 find_all 或 findAll 类
- javascript - 如何在反应中处理“居中”您的网站
- php - PHP 从嵌套的 JSON 数组中检索值
- html - Bootstrap 按钮 OnClick() 导航到同一页面的不同部分
- typescript - 基于键检查值的对象设置器函数
- substrate - 前端模板类型解码问题,value.subarray 不是函数
- filesystems - 如何在文件系统中实现linux能力
- sql - 按两列分区并找到 sum SQL
- css - 使用文件打开时 CSS 不显示
- react-native - 在本机反应中打开此屏幕时如何设置音频播放