2013-04-22 3 views
3

Я хочу, чтобы пользователь моего файла excel вводил предложение в ячейке «B2», а затем имел Sub для разбора предложения в другом столбце (от D2 до Dn) , Так, например, если вы наберете "ааа ГЭБ ссс ддд" в В2, вы должны иметь в результате:
D2: ааа
D3: БББ
D4: ссс
D5: DDDVBA - Excel: разделите строку в другом столбце

Я нашел, как чтобы разделить предложение на VBA с помощью функции split, но мне трудно заполнить столбец D, поскольку я не знаю, как определить последнюю строку (Dn). Вот что я использую до сих пор:

Sub splitAddress() 
Dim strAddress As String 

strAddress = Range("B2").Value 
Range("D2:D9").Value = WorksheetFunction.Transpose(Split(strAddress, " ")) 

End Sub 

Я хочу изменить «D2: D9», как D9 не всегда собирается быть в последней строке столбца. Как написать, что он должен заполняться от D2 до Dn в соответствии с количеством слов в моей ячейке B2? Спасибо заранее!

+1

'Range ("D2") Изменение размера (Ubound (обр) + 1,1) .Value = WorksheetFunction.Transpose (обр)'. где 'arr' - массив, созданный с помощью Split() –

+1

http://stackoverflow.com/a/161009 02/1685810 – glh

ответ

4

Есть, вероятно, более элегантные способы сделать это, но если вы разделяете адрес в массив можно получить количество элементов в массиве, используя Ubound и использовать .Resize увеличить количество строк в вашем диапазоне:

Sub splitAddress() 
    Dim strAddress As String 
    Dim strAddressParts() As String 
    Dim numParts As Integer 

    strAddress = Range("B2").Value 

    strAddressParts = Split(strAddress, " ") 
    numParts = UBound(strAddressParts) + 1 

    Range("D2").Resize(numParts).Value = WorksheetFunction.Transpose(strAddressParts) 
End Sub 
+0

Спасибо @Glenn Stevens, ясный и простой в использовании, идеально подходит для того, что я делаю! – Phalanx

+0

+ 1 Nicely Done :) –

2

петлю, как показано ниже будет делать это для вас:

Sub splitAddress() 

Dim i As Integer, x As Integer 
Dim c As Range 

i = 0 
x = 1 

Set c = Range("A5") 

i = InStr(c.Value, " ") 

c.Offset(0, x).Value = Left(c.Value, i - 1) 
x = x + 1 
i = InStr(i, c.Value, " ") 

Do Until InStr(i + 1, c.Value, " ") = 0 

    c.Offset(0, x).Value = Mid(c.Value, i + 1, InStr(i + 1, c.Value, " ") - i) 
    i = InStr(i + 1, c.Value, " ") 
    x = x + 1 
Loop 

End Sub 
+0

Спасибо за ваш ответ, это сложнее, чем ответ Гленна Стивенса, но в любом случае это интересно! – Phalanx

+2

Приветствую вас, я предпочитаю использовать такие петли, поскольку это дает возможность дополнительно добавлять критерии к тому, что вы делаете, - проверяйте наличие дополнительных (двойных) пространств и т. Д. Возможно, переполняйте то, что вы делаете, но можете ответить на чужую проблему , – Simon1979

+0

О да, верно, запомнит это, если мне в конечном итоге придется добавить больше критериев для моей программы! – Phalanx

Смежные вопросы