我的个人工作簿中有一个宏,由于将数据加载到我们的一台SQL服务器中的方式存在一些问题,我使用该宏将文本转换为数字。问题是它产生不一致的结果。代码是:
var url = 'http://www.exemple.local/en/node/28'
var myURLObj = new URL(url);
console.log(myURLObj.pathname) // '/en/node/28'
console.log(myURLObj.pathname.split('/')[1]); // 'en'
多数情况下,这种方法有效;但是,我今天注意到,一些格式化为文本的值未正确转换。
单元格Sub ConvertTextToNumber()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Dim DataRange As Variant
Dim r As Range
Dim i As Long
Dim lrow As Long
Dim lcol As Integer
Dim MyVar
DataRange = Range("A1:FZ6000").Formula
For lrow = 1 To 6000
For lcol = 1 To 156
MyVar = DataRange(lrow, lcol)
If IsNumeric(MyVar) Then
MyVar = Val(MyVar)
DataRange(lrow, lcol) = MyVar
End If
Next lcol
Next lrow
Range("A1:FZ6000").Formula = DataRange
Application.ScreenUpdating = False
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
的值为Q33
,单元格105,238
的值为Q35
。当我运行宏时,这两个单元格将转换为零。我打开了一个新的工作簿来测试问题,将689,563
放入单元格'128,899
中,以便将其格式化为文本格式,运行我的宏,然后将其转换为A1
。
鉴于返回值的差异,我找不到导致它的原因的押韵或原因,我希望有人能够有更好的方法,或者以前已经处理过这种方法。
感谢大家提供的任何帮助!
答案 0 :(得分:1)
IsNumeric
基本上是在测试是否可以成功转换为数字类型的Variant
。 Val()
函数将其与String
解析器组合在一起,因此可以预期它表现出不同的行为。因此,与其使用Val()
来转换字符串,不如将其简单地转换为适当的类型:
If IsNumeric(MyVar) Then
'Cast to a number.
DataRange(lrow, lcol) = CDbl(MyVar)
End If
请注意,这是一个幼稚的实现-可以想象得到的值只能转换为Currency
,或者可以更好地表示为Long
,等等。
答案 1 :(得分:1)
您已经知道范围Range("A1:FZ6000")
,不知道为什么要设置lrow
和lcol
,列156也是EZ列而不是FZ。话虽如此,您不必遍历所有列,下面是将文本转换为数字的一种简单方法。
With Range("A1:FZ6000")
.NumberFormat = "General"
.Value = .Value
End With