我有一个VBA脚本,可以成功从html中提取数据并将其转储到Excel工作表中。当一些数据是一个非常大的整数(30位+数字)时,我的问题就出现了。默认情况下,microsoft excel将其存储为科学记数法,并且我会遭受数据丢失。
所以数据存储在html中,如下所示:
<tr>
<td>
11111111111111111111111111
</td>
</tr>
所以我的脚本循环遍历行(tr),每个单元格(td)将值拉入我的工作表,如下所示:
Set mydata = appIE.Document.getelementsbytagname("tr")
x=1
For Each e In mydata
Set mytd = e.getelementsbytagname("td")
For Each c In mytd
Cells(x, 2).Value2 = e.Cells(1).innerText
x = x + 1
Next c
Next e
所以我认为错误正在发生,因为我使用.value2将数据存储在我的单元格中,所以我尝试切换到.value,它重现了错误,而.text却无法运行。如何在不丢失数据的情况下将此数据类型设置为长或文本正确?
答案 0 :(得分:1)
您在Excel VBA中能够做的最好的事情是使用变量并显式声明Decimal类型转换。这允许最多29个数字存储(我只使用1来测试它。它与其他数字一样无关紧要,但把它放在那里)。
你会想做这样的事情:
Sub Test()
Dim InputString As String
Dim DecimalHolder As Variant
' Put the string representation of your number into a string variable
' For my purposes, this was mostly to verify the input since the editor
' will convert this number to Scientific Notation otherwise.
InputString = "11111111111111199999999999999"
' Using the variant variable, store the number by converting the string to a decimal.
DecimalHolder = CDec(InputString)
' This now works, and is accurate
DecimalHolder = DecimalHolder + 1
End Sub
如果您的任何输入数字长度超过29个字符,则需要创建一种将其修剪为29个字符限制的方法。如果不这样做,在尝试将数字存储在DecimalHolder变量中时会出现溢出错误。
所有这一切的原因是VBA授予每种数据类型的字节数。我们在这里使用变体,因为变体有16个字节可以使用(转换为十进制时减少到12)而double类型有8个,long类型有4个,int类型有2个。
如果你最终不需要这个数字,但你需要一个数字的字符表示(例如,如果这些'数字'正在提供Id的功能),那么你可以将数字存储为字符串。你不能在没有转换的情况下对字符串进行数值运算(虽然隐式转换可能就是这样做,而不是告诉你)。