我有一个包含不同时间的列,即1小时,2小时30分钟,30分钟等。我需要将这些转换为分钟。我的想法是检查字符数,然后删除。
例如1小时是3个字符,所以如果检查发现3个字符删除最后一个字符,* 60,这将给我转换为分钟。
我研究了这个问题,这是我的代码。在那一刻,我只是想让它根据里面的字符数量改变单元格颜色。这看起来对我来说很明显,但显然缺少了一些东西。
提前致谢!
Sub lenCheck()
Dim rng As Range
Dim x As Integer
Dim sht As Worksheet
Set sht = Worksheets("Sheet2")
x = sht.Cells(Rows.Count, "G").End(xlUp).Row
For Each rng In sht.Range("G200:G" & x).Cells
If Len(rng.Value) = 3 Then
rng.EntireRow.Cells(1).Interior.Color = vbYellow
ElseIf Len(rng.Value) = 4 Then
rng.EntireRow.Cells(1).Interior.Color = vbGreen
ElseIf Len(rng.Value) = 5 Then
rng.EntireRow.Cells(1).Interior.Color = vbRed
ElseIf Len(rng.Value) = 6 Then
rng.EntireRow.Cells(1).Interior.Color = vbBlue
End If
End Sub
答案 0 :(得分:2)
如果你想将这些字符串转换为分钟,并且它们将采用上面显示的各种格式,我建议使用正则表达式来提取组件,然后进行适当的加法/乘法。
对于标记,以下VBA宏查找以下任何一项:hr hour min(任何复数s都无关紧要); (可以添加其他标签),然后返回分钟数:它搜索A列但很容易更改
如果你的模式不同于你列出的模式,它们也可以用最小的努力(和最少的代码更改)合并到正则表达式中
要将此算法用作宏,它将转换包含小时,分钟或两者的A列内容,请尝试:(注意" work"在数组中完成,如果你有一个大的数据集,比通过多次调用范围来回工作表更快
====================================
Option Explicit
Sub ConvertToMinutes()
Dim RE As Object, MC As Object
Dim MN As Long
Dim S As String
Dim vSrc As Variant, rSrc As Range
Dim I As Long
'Many ways to set the source data depending on your real setup
Set rSrc = Range("a1", Cells(Rows.Count, "A").End(xlUp))
vSrc = rSrc
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "(?:(\d+(?:\.\d+)?(?=\s*(?:hr|hour))))\D*(\d+(?=\s*min))?|(\d+(?=\s*min))"
.Global = True
.ignorecase = True
For I = 1 To UBound(vSrc, 1)
S = vSrc(I, 1)
If .test(S) = True Then
Set MC = .Execute(S)
With MC(0)
MN = .submatches(0) * 60 + .submatches(1) + .submatches(2)
End With
vSrc(I, 1) = MN
End If
Next I
End With
rSrc = vSrc
End Sub
==================================
顺便说一下,这里是针对您在此处发布的所有不同格式运行上述宏的结果的屏幕截图。它确实有用,但也许我的实际数据中缺少了一些东西。