2016-05-13 105 views
1

我有以下字符串:VBA分裂小数点后的字符串由2个字符

股息
34.3228.1028.0028.0028.0028.0028.0028.0029.5030.50

我期待分割它,所以我可以得到它为34.3228.1028.00等等,然后在excel中放入一行。我的问题是特别,我在找2个字符把它分解到小数点右边,因为表的数据IM从报废是它例如一块钱格式:

Picture on website

这是我已经尝试,但再次我不知道如何根据小数点后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

是字符串已经在Excel中?如果一个excel公式可用,那么这将是合适的,还是您特别寻找VBA? –

+1

你尝试过什么吗?你的代码在哪里?你问*我们*为你写吗? –

+0

你可以在前面有超过3个字符。你可以在前面少于2个字符。 ?总共会有10个号码被分开吗? –

回答

1

Excel的解决方案,而VBA。

假设您的字符串位于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 

其独特的,因为它是你的数据的开始和模式还没有开始。你知道第一个数字总是以第五个字符开头,因为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行将结果作为数字返回。

enter image description here

+0

如果你需要一个纯粹的VBA解决方案,你可以在这里考虑一下你可以转换成VBA的思维过程。此外,如果您只需要VBA解决方案,那么您应该将标签从excel更改为excel-VBA –

+0

谢谢感谢我的回复!是的,这绝对有助于我收集一个想法。 – Default001

+0

我认为用VBA路线,split会让你开始,但是你将需要从每个数组元素周围交换字符来构建你的号码。可能会有点痛苦的屁股。你可能会更好地通过你的字符串,直到你计算出来的数字为+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是不是我的强项所以可能会有一些在那里有巨大的语法问题,但你能看到我直接写入数组/单元格的位置吗?你在建立你的字符串的同一时刻完成它。

1

需要更多TECHNIC,并确保你需要2位小数点。
感谢@Forward埃德的想法。

请尝试:

' 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