使用VBA实现Excel时长转小数及按指定姓名筛选保留行
用VBA实现时长转换+指定姓名筛选的解决方案
没问题,这两个需求用VBA可以轻松搞定,我给你整理了完整的可运行代码,还附了详细说明,你跟着做就行:
完整VBA代码
Sub ProcessTimeAndFilterNames() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim timeText As String Dim timeParts() As String Dim hours As Double Dim minutes As Double Dim validNames As Variant ' 设置要处理的工作表(如果不是Sheet1,改成你的工作表名称) Set ws = ThisWorkbook.Worksheets("Sheet1") ' 定义需要保留的姓名列表 validNames = Array("Tom Cruise", "Brad Pitt", "Angelina Jolie", "Selena Gomez") ' 获取数据最后一行的行号 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' -------------------------- ' 第一步:转换「Time Spent」列为十进制数值(假设该列是B列,可根据实际修改) ' -------------------------- For i = 2 To lastRow ' 假设第1行是表头,从第2行开始处理数据 timeText = ws.Cells(i, "B").Value If timeText <> "" Then ' 拆分时长字符串 timeParts = Split(timeText, " ") hours = 0 minutes = 0 ' 提取小时数 If UBound(timeParts) >= 0 And (timeParts(1) = "hour" Or timeParts(1) = "hours") Then hours = CDbl(timeParts(0)) End If ' 提取分钟数(如果存在) If UBound(timeParts) >= 2 Then If (timeParts(3) = "minute" Or timeParts(3) = "minutes") Then minutes = CDbl(timeParts(2)) End If End If ' 计算十进制时长并写入单元格 ws.Cells(i, "B").Value = hours + minutes / 60 End If Next i ' -------------------------- ' 第二步:保留指定姓名的行,删除其余行 ' -------------------------- ' 从最后一行往上遍历,避免删除行导致的索引混乱 For i = lastRow To 2 Step -1 ' 检查当前行姓名是否在有效列表中 If IsError(Application.Match(ws.Cells(i, "A").Value, validNames, 0)) Then ' 不在列表中则删除该行 ws.Rows(i).Delete End If Next i MsgBox "处理完成!" End Sub
代码说明和使用步骤
- 修改适配你的表格:如果你的「Time Spent」列不是B列、姓名列不是A列,直接把代码里的
"B"、"A"改成对应列字母;工作表名称如果不是Sheet1,也改成你的表名。 - 时长转换逻辑:
- 自动识别带
hour(s)和minute(s)的字符串,拆分出小时和分钟数 - 分钟数会除以60转换成十进制,和小时数相加得到最终数值(比如"1 hour 30 minutes"变成1.5,"1 hour"变成1)
- 自动识别带
- 姓名筛选逻辑:
- 从最后一行往上遍历删除,避免因为删除行导致后续行的索引错位
- 使用
Application.Match快速检查姓名是否在指定列表中,不在则删除该行
怎么运行代码
- 打开你的Excel文件,按下
Alt + F11打开VBA编辑器 - 右键点击左侧的工作表名称,选择「插入」→「模块」
- 把上面的代码粘贴到模块窗口里
- 按下
F5运行代码,或者点击编辑器顶部的运行按钮 - 运行完成后会弹出提示框,你就能看到处理后的结果了
内容的提问来源于stack exchange,提问作者Gopala Krishna
相关产品推荐
相关产品推荐

