将 1000 万行带字母的文本转换为数字
Convert 10M rows of Text with letters To Number
我需要将“文本数字”转换为数字。文本编号如下所示:32,23B 或 242,23M。
我需要删除字母并乘以 1,000 ; 1,000,000;等等,取决于字母。
下面的代码有效,但因为我需要转换 1000 万行,所以需要很长时间。
有什么巧妙的方法吗?
For shIndex = startSheet To lastSheet
LastRowF = Sheets(shIndex).Range("F" & Rows.Count).End(xlUp).Row
For i = 3 To LastRowF
Mul = Right(Sheets(shIndex).Range("F" & i), 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If Multiplier Then
With Sheets(shIndex)
.Range("F" & i) = CSng(Left(Sheets(shIndex).Range("F" & i), Len(Sheets(shIndex).Range("F" & i)) - 1) * Multiplier)
.Range("F" & i).NumberFormat = "#,##0"
End With
End If
Next i
Next shIndex
使用Variant
数组,在内存中进行转换,然后将整个数组写回sheet:
For shIndex = startSheet To lastSheet
LastRowF = Sheets(shIndex).Range("F" & Rows.Count).End(xlUp).Row
Dim data() As Variant
data = Sheets(shIndex).Range("F3:F" & LastRowF).Value
Dim i As Long
For i = LBound(data, 1) to UBound(data, 1)
Mul = Right(data(i, 1), 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If CBool(Multiplier) Then
data(i, 1) = Left(data(i,1), Len(data(i, 1)) - 1) * Multiplier
End
With Sheets(shIndex).Range("F3:F" & LastRowF)
.Value = data
.NumberFormat = "#,##0"
End With
Next
Next
修改号码格式
- 实现数组可能会成功。
代码
Option Explicit
Sub modifyValues()
Const FirstCell As String = "F3"
Const startSheet As Long = 1
Const lastSheet As Long = 1
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Dim rng As Range
Dim Data As Variant
Dim Current As Variant
Dim Multiplier As Variant
Dim Mul As String
Dim shIndex As Long
Dim LastRow As Long
Dim i As Long
For shIndex = startSheet To lastSheet
With wb.Worksheets(shIndex).Range(FirstCell)
LastRow = .Parent.Cells(.Parent.Rows.Count, .Column).End(xlUp).Row
Set rng = .Resize(LastRow - .Row + 1)
End With
Data = rng.Value
For i = 1 To UBound(Data, 1)
Current = Data(i, 1)
Mul = Right(Current, 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If Multiplier Then
Data(i, 1) = CSng(Left(Current, Len(Current) - 1) * Multiplier)
End If
Next i
rng.Value = Data
rng.NumberFormat = "#,##0"
Next shIndex
End Sub
我需要将“文本数字”转换为数字。文本编号如下所示:32,23B 或 242,23M。
我需要删除字母并乘以 1,000 ; 1,000,000;等等,取决于字母。
下面的代码有效,但因为我需要转换 1000 万行,所以需要很长时间。
有什么巧妙的方法吗?
For shIndex = startSheet To lastSheet
LastRowF = Sheets(shIndex).Range("F" & Rows.Count).End(xlUp).Row
For i = 3 To LastRowF
Mul = Right(Sheets(shIndex).Range("F" & i), 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If Multiplier Then
With Sheets(shIndex)
.Range("F" & i) = CSng(Left(Sheets(shIndex).Range("F" & i), Len(Sheets(shIndex).Range("F" & i)) - 1) * Multiplier)
.Range("F" & i).NumberFormat = "#,##0"
End With
End If
Next i
Next shIndex
使用Variant
数组,在内存中进行转换,然后将整个数组写回sheet:
For shIndex = startSheet To lastSheet
LastRowF = Sheets(shIndex).Range("F" & Rows.Count).End(xlUp).Row
Dim data() As Variant
data = Sheets(shIndex).Range("F3:F" & LastRowF).Value
Dim i As Long
For i = LBound(data, 1) to UBound(data, 1)
Mul = Right(data(i, 1), 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If CBool(Multiplier) Then
data(i, 1) = Left(data(i,1), Len(data(i, 1)) - 1) * Multiplier
End
With Sheets(shIndex).Range("F3:F" & LastRowF)
.Value = data
.NumberFormat = "#,##0"
End With
Next
Next
修改号码格式
- 实现数组可能会成功。
代码
Option Explicit
Sub modifyValues()
Const FirstCell As String = "F3"
Const startSheet As Long = 1
Const lastSheet As Long = 1
Dim wb As Workbook
Set wb = ThisWorkbook
Dim ws As Worksheet
Dim rng As Range
Dim Data As Variant
Dim Current As Variant
Dim Multiplier As Variant
Dim Mul As String
Dim shIndex As Long
Dim LastRow As Long
Dim i As Long
For shIndex = startSheet To lastSheet
With wb.Worksheets(shIndex).Range(FirstCell)
LastRow = .Parent.Cells(.Parent.Rows.Count, .Column).End(xlUp).Row
Set rng = .Resize(LastRow - .Row + 1)
End With
Data = rng.Value
For i = 1 To UBound(Data, 1)
Current = Data(i, 1)
Mul = Right(Current, 1)
Select Case Mul
Case "K"
Multiplier = 1
Case "M"
Multiplier = 1000
Case "B"
Multiplier = 1000000
Case "T"
Multiplier = 1000000000
Case Else
Multiplier = False
End Select
If Multiplier Then
Data(i, 1) = CSng(Left(Current, Len(Current) - 1) * Multiplier)
End If
Next i
rng.Value = Data
rng.NumberFormat = "#,##0"
Next shIndex
End Sub