2015-11-12 7 views
1

Вход в колонке H от Row 2Split не работает Excel VBA

column H 
90 million + 
550 million + 
150 million + 
2.1 billion + 
110 million + 
. 
. 
. 

Ожидаемый выход в колонке 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 идентификатор Cet должны быть только цифры

Cet = Split(str, "+") 

Где я ошибаюсь?

В основном то, что я хочу Cet (0) должен быть длинным или целым числом и Cet (1) должен быть текст миллиардов или миллионов в зависимости от текста в Col H для каждого цикла, так что я могу обработать это далее

Таким образом, если значение Колонка H Строка 2 составляет 90 миллионов Cet (0) = 90 и Cet (1) = млн

+0

Просто разделите пространство и сохраните его: 'Range (" J "& i) = split (str," ") (0)'. Без «Replace» –

+0

'str = Replace (str," "," + ")' не заменяет пробел. Он ничего не меняет. Другими словами, замена вообще не происходит там, где вы думаете. Я бы добавил, что вам, вероятно, не нужен VBA для этого; достаточно простой формулы. – Marc

+4

Я не знаю ваших намерений, поэтому это может быть спорным, но удаление единиц может быть плохой идеей, учитывая, что '2.1' является самым большим числом здесь ... – findwindow

ответ

3

Кажется, один вопрос может быть, что не существует 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 
+0

Да, это сработало спасибо, я могу узнать, что означает NBSP – newguy

+1

@RohanK 'NBSP' = свободное пространство; или нет места для разрыва. Проверьте его в Википедии или Google для получения исчерпывающего ответа. –

+0

хорошая работа, определяющая неразрывное пространство из данных образца. – Jeeped

0

бы 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 
+0

Нет, потому что это часть макроса, который имеет другую цель – newguy

1

Split() работает нормально, вы просто не поставляет правильные аргументы для метода Replace().

Я считаю, что любой из этих команд заменил бы белое пространства знака +

str = Replace(str, "", "+") 
str = Replace(str, "", "+") 

"" просто пустая строка - вы хотите заменить символы новой строки, для которых Есть 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, "+") 
0

Вместо зацикливания через клетку, насыпная Range.TextToColumns method была бы целесообразен до тех пор, как вы сбрасываете поля информации, которые вы не хотите.

Образец, который вы поставили, имеет неразрывное пространство (например, Char(160)) между числом и «миллионом». Это обычная аномалия при копировании информации с веб-страницы. Это должно заботиться об этом знаке пробела, а также о регулярных (например, 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 
Смежные вопросы