- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的单元格内有一个字符串:105501008962100001
单元格 A10 包含此文本。
当我运行 ISTEXT(A10) 时,它返回 TRUE。
我使用了 VALUE(A10),但它返回了 105501008962100000
当我乘以 A10 * 1 时,我也会得到 105501008962100000。
我还创建了一个 VBA 函数来转换为整数,但是当我创建检查点时,它会创建一个错误,指出转换为整数失败。
我不明白为什么我无法将此单元格内的字符串完全由数字组成时转换为整数。该数字是从 CSV 文件导入的。
Function ConvertToInteger(v1 As Variant) As Integer
On Error GoTo 100:
'MsgBox Len(v1)
Dim tempArray As Variant
Dim arraySize As Integer
arraySize = (Len(v1) - 1)
ReDim tempArray(arraySize)
Dim tempText As String
Dim finalNumber As Integer
Dim i As Integer
For i = 1 To Len(v1)
tempArray(i - 1) = CStr(Mid(v1, i, 1))
Next
tempText = Join(tempArray, "")
tempText = CStr(tempText)
'MsgBox tempText
finalNumber = CInt(tempText)
MsgBox finalNumber
'ConvertToInteger = finalNumber
Exit Function
100:
MsgBox "Failed to convert """ & v1 & """ to an integer.", , "Aborting - Failed Conversion"
End
End Function
我对代码进行了修改,但仍然在末尾得到 0,而不是数字中的 1:
Function ConvertToInteger(v1 As Variant) As Double
Dim tempArray As Variant
Dim arraySize As Double
arraySize = (Len(v1) - 1)
ReDim tempArray(arraySize)
Dim tempText As String
Dim finalNumber As Double
Dim i As Integer
For i = 1 To Len(v1)
tempArray(i - 1) = CStr(Mid(v1, i, 1))
Next
tempText = Join(tempArray, "")
tempText = CStr(tempText)
finalNumber = CDbl(tempText)
MsgBox finalNumber
'I get an error here when assigning finalNumber to ConvertToInteger
'ConvertToInteger = finalNumber
End Function
最佳答案
您可以使用内部 Err
对象的 Description
属性在错误处理 block 中识别此错误(溢出):
100:
MsgBox "Failed to convert """ & v1 & """ to an integer." & vbCrLf & Err.Description, , "Aborting - Failed Conversion"
End
当您实现它时,错误处理程序可以工作,但不会显示用于调试问题的有用信息。
确定为溢出错误后,请注意值 105501008962100001
超出了 Integer 或 Long 数据类型允许的大小。将其声明为 Double
。
Dim tempArray As Variant
Dim arraySize As Double
arraySize = (Len(v1) - 1)
ReDim tempArray(arraySize)
请注意 Excel 中使用大数字的限制。您的数据可能会超出此范围。
Handling numbers larger than Long in VBA
随后:
http://tushar-mehta.com/misc_tutorials/project_euler/LargeNumberArithmetic.htm
这是一个将两个大数相加的简单示例。您将能够使用 cLarge
类对这些“数字”(实际上是字符串)执行算术运算。您的函数需要将类型声明从 Long/Double
更改为 String
。
在标准模块中,执行以下操作:
Sub foo()
Dim lrg As New cLarge
MsgBox lrg.LargeAdd("105501008962100001", "205501231962100003")
End Sub
创建一个名为cLarge
的类模块,并在该模块中添加以下代码:
'### Class module for adding very large (> Decimal precision) values
' http://tushar-mehta.com/misc_tutorials/project_euler/LargeNumberArithmetic.htm
'
' Modified by David Zemens, 9 December 2015
Option Explicit
Public cDecMax As Variant, cDecMaxLen As Integer, cSqrDecMaxLen As Integer
Private pVal As String
Public Sub Class_Initialize()
Static Initialized As Boolean
If Initialized Then Exit Sub
Initialized = True
cDecMax = _
CDec(Replace("79,228,162,514,264,337,593,543,950,335", ",", ""))
'this is 2^96-1, the limit on Decimal precision data in Excel/VBA
cDecMaxLen = Len(cDecMax) - 1
cSqrDecMaxLen = cDecMaxLen \ 2
End Sub
Function Ceil(X As Single) As Long
If X < 0 Then Ceil = Fix(X) Else Ceil = -Int(-X)
End Function
Private Function addByParts(ByVal Nbr1 As String, ByVal Nbr2 As String) _
As String
Dim NbrChunks As Integer
If Len(Nbr1) > Len(Nbr2) Then _
Nbr2 = String(Len(Nbr1) - Len(Nbr2), "0") & Nbr2 _
Else _
Nbr1 = String(Len(Nbr2) - Len(Nbr1), "0") & Nbr1
NbrChunks = Ceil(Len(Nbr1) / cDecMaxLen)
Dim I As Integer, OverflowDigit As String, Rslt As String
OverflowDigit = "0"
For I = NbrChunks - 1 To 0 Step -1
Dim Nbr1Part As String
Nbr1Part = Mid(Nbr1, I * cDecMaxLen + 1, cDecMaxLen)
Rslt = CStr(CDec(Nbr1Part) _
+ CDec(Mid(Nbr2, I * cDecMaxLen + 1, cDecMaxLen)) _
+ CDec(OverflowDigit))
If Len(Rslt) < Len(Nbr1Part) Then
Rslt = String(Len(Nbr1Part) - Len(Rslt), "0") & Rslt
OverflowDigit = "0"
ElseIf I = 0 Then
ElseIf Len(Rslt) > Len(Nbr1Part) Then
OverflowDigit = Left(Rslt, 1): Rslt = Right(Rslt, Len(Rslt) - 1)
Else
OverflowDigit = "0"
End If
addByParts = Rslt & addByParts
Next I
End Function
Function LargeAdd(ByVal Nbr1 As String, ByVal Nbr2 As String) As String
'Initialize
If Len(Nbr1) <= cDecMaxLen And Len(Nbr2) <= cDecMaxLen Then
LargeAdd = CStr(CDec(Nbr1) + CDec(Nbr2))
Exit Function
End If
If Len(Nbr1) > cDecMaxLen Then LargeAdd = addByParts(Nbr1, Nbr2) _
Else LargeAdd = addByParts(Nbr2, Nbr1)
End Function
所以,长话短说,您实际上不能使用这些“数字”,并且严格不能将它们“转换”为整数/长整型值。您需要使用自定义类实现来对字符串值执行数学运算。
关于vba - 无法在 VBA 或 Excel 公式中将字符串转换为整数(即使字符串全是数字,也无法转换或数字错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181236/
我对为什么我的 Excel 工作簿中的 if 公式不起作用感到目瞪口呆。 像 =if(F2=0, TRUE, FALSE) 这样简单的事情会引发一般错误“这个公式有问题”。不知道在哪里可以解决这个问题
在链接的电子表格中,我试图总结从一月到单元格 B1 中的日期的列 R 类别的所有实例(对于这个例子,让我们说“CAM 收入”)。 在这种情况下,总和应该是 ( B7:F7 ) 和 ( B9:F9 )
这是一个两部分的问题。我想根据价格的生效日期查找商品的价格。我看过垂直生效日期的例子,但我的有点不同。我在第一列 (A) 中有项目。其余列包含带有价格生效日期的标题。希望我能够附上格式示例。我以这种方
我想从第一个单元格开始自动增加月份。 A1 = 2019-01 以下单元格中的公式应自动填充其余单元格。 A2 = 2019-02 : : A13 = 2020-01 有没有一种简单的方法可以做到这一
在 Excel 中,如果 2021 年是基准年(第 1 年),并且我正在以月份为单位进行财务模型(但仍想知道该月份对应于哪一年),我可以使用什么公式来表示月份 0- 12 是第 1 年,第 13-24
我有以下公式,但它不起作用,因为当我在名称周围添加加利福尼亚时它只是失败了,所以它只是告诉我一切都是英国。我怎样才能解决这个问题? =IF(OR(N10776="*California*",N1077
我有这个公式: =IF(AD491="In progress" OR AD491="Reopened"(ROUND($BW$1-AI491,0),($BW$1-BB491+1)) 它正在检查单元格 A
我想做一个总结表。 我创建了一个名称下拉列表:Bob、Jack、Beth 和一个包含两个选项的下拉列表:已完成或更正待定。 在任务旁边的 Sheet2 上,您将选择名称,然后选择两个选项之一。 在摘要
如果我在 A 列中有以下数据: A1 = 3.5.15 A2 = 2.6 A3 = 8.4.3.16.7 我想要一个公式,它可以在下一列 B 中返回以下内容: B1 = 3.5 B2 = 2 B3 =
我在 Excel 2013 中有一张水果表。 我想通过从当前行到顶部搜索直到第一次出现“::”来填充“类别”列,这是表中类别的关键字。 如果有某种方法可以反转范围,我可以执行类似 "=Match(":
我这里有 2 张 table : 我要填写Code表 1 中的列,引用表 2。值的条件是开始日期必须在 ProductionDate 之间。和 ExpiryDate表 2 的类型,表 1 中的类型必须
我有以下工作表: 网格填充有以下公式(此示例来自单元格 H4),该公式根据左侧表格中的输入填充网格,=IF($A4="","",IF(AND($E4="Daily",H$2>=$D4,H$2=$D4,
我在 A1 中有以下值。当我向下拖动时,它应该以如下所示的方式增加。 B 应该首先增加,保持 C 不变。一旦 B 达到最大值,即 2,则 C 应该增加。 C 的最大值实际上取决于行号,行号除以 2 或
我会尽我所能理解这一点。我很讨厌把事情说清楚。 :) 所以……就这样…… 我有一张电子表格,上面列出了我种植辣椒的种子。这是我的专栏,我会在后面解释更多。 裁剪 |颜色 |一代 |物种 |来源 |斯科
我在 Excel 电子表格中有两个列表。 第一个列表有字符串,例如 1234 blue 6 abc xyz blue/white 1234 abc yellow 123 另一个列表包含第一个列表的子字
我正在尝试创建一个 SumIf 公式,该公式根据一个标准将多个列添加在一起。 =sumif(F$8:F$58,F73,L$8:L$58+I$8:I$58) 这给了我一个错误,并且不会将两列加在一起。
你好我想知道是否有一个公式相当于每个语句。 我知道使用 VBA 可以做到这一点,但鉴于这是一份官方报告,我更愿意让它无宏。 基本上我有一个列(假设是 A),其中包含支付发票的时间 ` |------
任何用于计算频率表中数据平均值(众数、标准差、...)的简单 Excel 公式,如下所示: value frequency 5 3 8 5 4 1
例如:您希望在 Z# 年的每年年初以今天的美元收到 $X。假设 3% 的恒定通货膨胀率和 7% 的复合年返回率。 我知道计算通货膨胀调整后 yield 的公式;对于返回率,您必须使用以下公式: [[(
需要一些帮助来找出一个公式来计算一个值在列中列出的次数。我将尝试解释下面的要求。 下图显示了数据集的示例。 要求是列出每个客户的问题和行动。 如您所见,即使从单元格中聚集的值中,我们也需要找出各个唯一
我是一名优秀的程序员,十分优秀!