宏将文本转换为数字产生不一致的结果

时间:2018-07-27 14:27:15

标签: vba excel-vba

我的个人工作簿中有一个宏,由于将数据加载到我们的一台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

鉴于返回值的差异,我找不到导致它的原因的押韵或原因,我希望有人能够有更好的方法,或者以前已经处理过这种方法。

感谢大家提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

IsNumeric基本上是在测试是否可以成功转换为数字类型的VariantVal()函数将其与String解析器组合在一起,因此可以预期它表现出不同的行为。因此,与其使用Val()来转换字符串,不如将其简单地转换为适当的类型:

If IsNumeric(MyVar) Then
    'Cast to a number.
    DataRange(lrow, lcol) = CDbl(MyVar)
End If

请注意,这是一个幼稚的实现-可以想象得到的值只能转换为Currency,或者可以更好地表示为Long,等等。

答案 1 :(得分:1)

您已经知道范围Range("A1:FZ6000"),不知道为什么要设置lrowlcol,列156也是EZ列而不是FZ。话虽如此,您不必遍历所有列,下面是将文本转换为数字的一种简单方法。

With Range("A1:FZ6000")
    .NumberFormat = "General"
    .Value = .Value
End With