Я импортирую несколько листов данных в другую книгу и хотел простой способ преобразования строк, представляющих собой числа, в числа.Так что я нашел этот код, который делал именно то, что я хотел https://www.thespreadsheetguru.com/the-code-vault/2014/8/21/convert-numbers-stored-as-text
Он работал быстро и плавно, что очень ценилось, но когда я начал работать с данными, я заметил несоответствие.Я обнаружил, что две клетки превратились в два совершенно разных числа.На момент написания статьи это единственные два, которые я нашел, но это довольно тревожно, может ли быть больше.Примером является строка «1,225», ставшая -611779.(Да, я использую десятичные запятые)
Почему-то решили, что эти две «строки» чисел были чем-то совершенно другим.Тем не менее, те же цифры на другом листе были правильно преобразованы.
Мой вопрос сейчас: есть ли какая-то причина, по которой эти две (и, возможно, больше ячейки) могли привести к тому, что скрипт полностью не смог правильно преобразовать эти числа.Или код некорректен?
Sub CleanData(sRange As Range)
'PURPOSE:Clean up selected data by trimming spaces, converting dates,
'and converting numbers to appropriate formats from text format
'AUTHOR: Ejaz Ahmed (www.StrugglingToExcel.Wordpress.com)
'SOURCE: www.TheSpreadsheetGuru.com/The-Code-Vault
Dim MessageAnswer As VbMsgBoxResult
Dim EachRange As Range
Dim TempArray As Variant
Dim rw As Long
Dim col As Long
Dim ChangeCase As Boolean
Dim ChangeCaseOption As VbStrConv
Dim rng As Range
'User Preferences
ChangeCaseOption = vbProperCase
ChangeCase = False
'Set rng = Application.Selection
Set rng = sRange
'Warn user if Range has Formulas
If RangeHasFormulas(rng) Then
MessageAnswer = MsgBox("Some of the cells contain formulas. " _
& "Would you like to proceed and overwrite formulas with values?", _
vbQuestion + vbYesNo, "Formulas Found")
If MessageAnswer = vbNo Then Exit Sub
End If
'Loop through each separate area the selected range may have
For Each EachRange In rng.Areas
TempArray = EachRange.Value2
If IsArray(TempArray) Then
For rw = LBound(TempArray, 1) To UBound(TempArray, 1)
For col = LBound(TempArray, 2) To UBound(TempArray, 2)
'Check if value is a date
If IsDate(TempArray(rw, col)) Then
TempArray(rw, col) = CDate(TempArray(rw, col))
'Check if value is a number
ElseIf IsNumeric(TempArray(rw, col)) Then
TempArray(rw, col) = CDbl(TempArray(rw, col))
'Otherwise value is Text. Let's Trim it! (Remove any extraneous spaces)
Else
TempArray(rw, col) = Application.Trim(TempArray(rw, col))
'Change Case if the user wants to
If ChangeCase Then
TempArray(rw, col) = StrConv( _
TempArray(rw, col), ChangeCaseOption)
End If
End If
Next col
Next rw
Else
'Handle with Single Cell selected areas
If IsDate(TempArray) Then 'If Date
TempArray = CDate(TempArray)
ElseIf IsNumeric(TempArray) Then 'If Number
TempArray = CDbl(TempArray)
Else 'Is Text
TempArray = Application.Trim(TempArray)
'Handle case formatting (if necessary)
If ChangeCase Then
TempArray = StrConv(TempArray, ChangeCaseOption)
End If
End If
End If
EachRange.Value2 = TempArray
Next EachRange
'Code Ran Succesfully!
'MsgBox "Your data cleanse was successful!", vbInformation, "All Done!"
End Sub
------------------------------------------------------------------------
Function RangeHasFormulas(ByRef rng As Range) As Boolean
'PURPOSE: Determine if given range has any formulas in it
'AUTHOR: Ejaz Ahmed (www.StrugglingToExcel.Wordpress.com)
'SOURCE: www.TheSpreadsheetGuru.com/The-Code-Vault
Dim TempVar As Variant
TempVar = rng.HasFormula
'Test Range
If IsNull(TempVar) Then
'Some of cells have fromulas
RangeHasFormulas = True
Else
If TempVar = True Then
'All cells have formulas
RangeHasFormulas = True
Else
'None of cells have formulas
RangeHasFormulas = False
End If
End If
End Function