拆分不工作的Excel VBA
在Row 2
H
Row 2
input
column H 90 million + 550 million + 150 million + 2.1 billion + 110 million + . . .
Row 2
J
Row 2
预期输出
90 550 150 2.1 110 . . .
VBA代码:
Option Explicit Sub ConvertRange() Dim str As String Dim Cet Dim i, j, l As Long Dim FinalRow As Long Dim wk As Worksheet Application.ScreenUpdating = False Set wk = Sheets("Sheet1") FinalRow = wk.Range("H900000").End(xlUp).Row For i = 2 To FinalRow str = Cells(i, "H").Value str = Replace(str, " ", "+") str = Replace(str, "", "+") str = Replace(str, " ", "+") Cet = Split(str, "+") Range("J" & i) = Cet(LBound(Cet)) Next i Application.ScreenUpdating = True End Sub
但是我在列J
输出错误如下
90 million 550 million 150 million 2.1 billion 110 million . . .
我相信这些命令中的任何一个都会用+
符号代替空格
str = Replace(str, "", "+") str = Replace(str, " ", "+")
和下面的行将有一个数组,其中LBound值ID CET应该只有数字
Cet = Split(str, "+")
我错在哪里?
基本上我想要的是Cet(0)应该是长或整数,并且Cet(1)应该是文本数十亿或百万,这取决于文中的每一个循环,以便我可以进一步处理
因此,如果列H行2值是9000万Cet(0)= 90和Cet(1)= million
似乎有一个问题可能是整数和文本string之间没有space
。 而是有一个NBSP
。 既然如此,以下应该工作:
Option Explicit Sub ConvertRange() Dim Cet Dim FinalRow As Long Dim wk As Worksheet Dim i As Long Set wk = Sheets("Sheet1") With wk FinalRow = .Cells(.Rows.Count, "H").End(xlUp).Row For i = 2 To FinalRow Cet = Split(Replace(.Cells(i, "H"), Chr(160), Space(1))) .Range("J" & i) = Cet(0) .Range("K" & i) = Cet(1) Next i End With End Sub
Split()
工作正常,你只是没有为你的Replace()
方法提供正确的参数。
我相信这些命令中的任何一个都会用+符号代替空格
str = Replace(str, "", "+") str = Replace(str, "", "+")
""
只是一个空string – 你想replace有vbConstants的新行字符:
vbCr '// Carriage Return vbLf '// Line Feed vbCrLf '// Carriage Return Line Feed vbNewLine '// Carriage Return Line Feed
或者你可以使用Chr()
代码:
Chr(13) '// Carriage Return Chr(10) '// Line Feed
所以你需要像这样的东西:
str = Replace(str, vbCrLf, "+")
J列这样的公式还不够吗?
=LEFT(H2,FIND(" ",H2)-1)
它提取第一个空格字符之前的所有字符。
VBA的方法是这样的:
Sub test1() Dim mystring As String Dim newstring As String mystring = "1.2 million +" 'hard-coded string newstring = Left(mystring, InStr(1, mystring, " ") - 1) 'alteration of my formula suggestion MsgBox (newstring) 'see the output End Sub
只要放弃不需要的信息字段,就不需要循环遍历单元格,而是使用批量的Range.TextToColumns方法 。
您提供的样本在数字和“百万”之间有一个非破坏空间(例如, Char(160)
)。 从网页复制信息时,这是一个常见的exception情况。 这应该照顾那个stream氓空间特征以及正常的(例如Chr(32)
)空间。
With Worksheets("Sheet9") '<~~ set this worksheet refernce properly With Columns(1) .TextToColumns Destination:=.Cells(1), DataType:=xlDelimited, _ ConsecutiveDelimiter:=True, _ Tab:=False, Semicolon:=False, Comma:=False, _ Space:=True, Other:=True, OtherChar:=Chr(160), _ FieldInfo:=Array(Array(1, 1), Array(2, 9), Array(3, 9)) End With End With