我有以下字符串:
股息
为34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50
我希望将其拆分,以便我可以将其34.32
,28.10
,28.00
等转换为excel中的一行。我的问题特别在于我希望将它分成2个字符到小数点的右边,因为从中删除它的表数据是一个美元格式,例如:
这是我尝试的但是我再也不知道如何根据小数点后的2个字符拆分它:
Dim eTR As Object, cTR As Object, a As Integer
Set cTR = doc.getElementsByTagName("tr")
a = 0
For Each eTR In cTR
If Left(eTR.innerText, 9) = "Dividends" Then
TR = doc.getElementsByTagName("tr")(a).innerText
Debug.Print TR
'Debug.Print a
End If
a = a + 1
Next
Dim s As Variant
s = (Split(TR, ".")(1))
Cells(1, 2).Value = s
Cells(1, 3).Value = s(1)
Cells(1, 4).Value = s(2)
Cells(1, 5).Value = s(3)
End Sub
我也厌倦了使用以下代码获取每个表格数据(因为它在图像上看起来):
'get divs/share
chk = 0
dividends:
Dim eTR3 As Object, cTR3 As Object
Set cTR3 = doc.getElementsByTagName("td")
g = 0
For Each eTR3 In cTR3
If Left(eTR3.innerText, 9) = "Dividends" Then
TR5 = doc.getElementsByTagName("td")(g).innerText
r = 1
i = g + 10
For h = g To i Step 1
TR5 = doc.getElementsByTagName("td")(h).innerText
Cells(s + 4, r + 1).Value = TR5
r = r + 1
Next h
End If
g = g + 1
Next
但由于某种原因,我不断获得不属于该行的随机表数据输入。作为一种解决方法我想到抓住表格行并将字符串分开。
先谢谢了!
汤姆
答案 0 :(得分:1)
没有VBA的Excel解决方案。
假设你的字符串在A列中,并且字符串中有10个数字要被拔出。
在M栏或更右侧使用:
=FIND(".",$A$1,L1+1)
确保此公式左侧的列为空。将公式向右复制10列。在我的测试用例中,它是第V列。这将返回每个的位置。在字符串中。如果你向右移动足够远,它最终会返回一个错误,表明没有进一步的错误。在要找到的字符串中。
在B栏中使用以下公式:
=MID(A1,5,M1-2)
'or if you want it as a number and not a string
=MID(A1,5,M1-2)*1
它的独特之处在于它是数据的开始,而且模式还没有开始。您知道第一个数字将始终作为第5个字符开始,因为DATA长度为4个字符。 M1-2根据小数点的位置告诉返回多少个字符。
在C栏中使用此公式,可以在模式重复后立即复制:
=MID($A1,N1-(N1-M1-3),(N1-M1))
'or if you want it as a number and not a string
=MID($A1,N1-(N1-M1-3),(N1-M1))*1
将其复制到右边9次,在测试用例中复制到列K它基本上是测量它们之间的距离。并确定从当前小数返回的字符数以及要返回的字符数。
现在,您可以为放在A栏中的每个新字符串复制B1:V1。完成后,您可以根据需要复制和粘贴值。
概念证明
我在图像中的交错行上有结果,以节省空间并显示所有点。另外请不要这样,因为除非您格式化单元格,否则某些数字以单尾或双尾零excel结尾将不会显示它们。在图像中,行2将结果作为字符串返回,第4行将结果作为数字返回。
答案 1 :(得分:1)
需要更多技术并确保您需要2位小数点 感谢@Forward Ed的想法。
请尝试:
' This sub is example to call splittext() function
Sub test()
Dim retArr() As String
retArr = splittext("Dividends34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50")
' us reArr to do other stuff here
End Sub
Function splittext(str) As String()
Dim startPos As Integer
Dim splitArr() As String
Dim arrSize As Integer
str = Replace(str, "Dividends", "")
startPos = 1
arrSize = 0
Do While InStr(startPos, str, ".") > 0
ReDim Preserve splitArr(arrSize)
splitArr(arrSize) = Mid(str, startPos, InStr(startPos, str, ".") + 3 - startPos)
arrSize = arrSize + 1
startPos = InStr(startPos, str, ".") + 3
Loop
splittext = splitArr
End Function
答案 2 :(得分:0)
VBA想:
我没有要测试的链接文档,但是这个概念怎么样:
Sub test()
Dim eTR As Object, cTR As Object
Dim a As Integer
Dim s() As Variant
Set cTR = doc.getElementsByTagName("tr")
ReDim s(1)
a = 0
For Each eTR In cTR
If Left(eTR.innerText, 9) = "Dividends" Then
TR = doc.getElementsByTagName("tr")(a).innerText
Debug.Print TR
'Debug.Print a
s(a) = doc.getElementsByTagName("tr")(a).innerText
End If
a = a + 1
ReDim Preserve s(a)
Next
'this range needs to be equal in size to your array.
Range(Cells(1, 2), Cells(1, a+1)).Value = s
End Sub
VBA不是我的强项,因此可能存在一些巨大的语法问题,但你能看到我在直接写入阵列/单元格的位置吗?你可以在构建字符串的同一点上完成它。