2015-08-02 4 views
2

У меня есть набор данных с именами и адресами в файле Excel в следующем формате.Данные Spit в одной ячейке в несколько строк

Name1 
    134/47/1, 
adrs1, adr2, country 

Name2 
adrs1, adrs2, country 

Name3 
    107/c, 
adrs3, adrs3, country 

etc… 

Я хочу, чтобы разделить эти данные в несколько строк в следующем формате

Name1 
    134/47/1, 
adrs1, 
adrs2, 
country 

Name2 
No 134/63, 
adrs1, 
adrs2, 
country 


etc… 

Я попытался следующие, но он работал только для одной строки ячейки.

Sub tst() 
    Dim X As Variant 
    X = Split(Range("A1").Value, ",") 
    Range("A1").Resize(UBound(X) - LBound(X) + 1).Value =   Application.Transpose(X) 
End Sub 
+0

Что-нибудь с запятой предназначено для разделения? – Jeeped

+0

Вместо простого расширения текущего диапазона ваш макрос должен добавить две новые строки в вашу таблицу (если это то, что вы действительно хотите), так как в противном случае вы переписываете содержимое вашей следующей предполагаемой ячейки ввода. Но как насчет написания матричной функции, которая возвращает массив из 4 смежных ячеек (по вертикали или по горизонтали), а затем использовать эту функцию в другом листе Excel, ссылаясь на исходные ячейки? – cars10m

ответ

1

Я не уверен, были ли конечный ваши данные выборки запятые на отдельных значениях опечатки или, если это то, что точно отражает ваши данные, но которые должны быть учтены. Мошенническая запятая в качестве суффикса создаст дополнительный элемент для варианта массива, тем самым отбрасывая размеры, созданные путем ссылки на UBound function.

Sub split_from_below_space() 
    Dim rw As Long, v As Long, vVALs As Variant 

    With Worksheets("Sheet1") 'set this worksheet reference properly! 
     For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1 
      .Cells(rw, 1) = Trim(.Cells(rw, 1).Value2) 
      If CBool(InStr(1, .Cells(rw, 1).Value2, Chr(44) & Chr(32))) Then 
       vVALs = Split(.Cells(rw, 1).Value2, Chr(44) & Chr(32)) 
       .Cells(rw + 1, 1).Resize(UBound(vVALs), 1).EntireRow.Insert 
       .Cells(rw, 1).Resize(UBound(vVALs) + 1, 1) = _ 
        Application.Transpose(vVALs) 
       For v = UBound(vVALs) - 1 To LBound(vVALs) Step -1 
        .Cells(rw, 1).Offset(v, 0) = _ 
         Trim(.Cells(rw, 1).Offset(v, 0).Value2) & Chr(44) 
       Next v 
      End If 
     Next rw 
    End With 

End Sub 

Вам нужно будет вставлять строки для размещения данных и этот метод почти всегда (как в данном случае) лучше выполняется, работая от дна к вершине.

+0

Большое спасибо за ваши отзывы. Ты спас свой день. У меня есть 2 запроса. 1. Когда мы разбиваемся на строки, можем ли мы включить «,» в конце строки? Пример: например, следующий формат Name1, Adrs1, Adrs2, Страна 2. Если у вас есть время, вы можете объяснить этот код для меня? Настоятельно ценю вашу помощь – LahiruS

+0

1. * * страна * и * имя * в вашем примере не имеют запятых.Что должно получить запятая, а что нет? 2. Извините, в Интернете слишком много информации, чтобы я мог регулировать ее часть. – Jeeped

1

Следующий макрос может вам помочь. Вам нужно будет выбрать самую последнюю ячейку в вашей таблице, содержащую многостраничный адрес. Когда вы запустите макрос, он будет прокладывать путь вверх и вставить строки адреса там, где это необходимо (только в текущем столбце), а затем выйти.

Option Base 1 
Sub trnsfrm() 
    Dim i%, n%, ret(3, 1) 
    Set r = Selection 
    Do 
    a = Split(r, ",") 
    ret(1, 1) = Trim(a(0)) 
    ret(2, 1) = Trim(a(1)) 
    ret(3, 1) = Trim(a(2)) 
    r.Range([a2], [a3]).Insert Shift:=xlDown 
    r.Range([a1], [a3]) = ret 
    If r.Row <= 4 Then Exit Do 
    Set r = r.Offset(-4) 
    Loop 
End Sub 

Если вы хотите вставить линии через всю таблицу, вы должны заменить строку (10)

r.Range([a2], [a3]).Insert Shift:=xlDown 

по

r.Range([a2], [a3]).EntireRow.Insert Shift:=xlDown 

Предположения/Предупреждение

С макрос фактически изменит вашу текущую таблицу и «отменит» не работает с макросами, вы должны обязательно сохранить все, прежде чем попробовать.

Макрос предполагает, что каждый блок адрес состоит из ровно 4 линий. Если на адрес будет меньше или больше строк, маро выйдет из строя и, скорее всего, выведет мусор или остановится.

+0

Благодарим вас за помощь. Это работает хорошо. Как вы сказали, есть некоторые предположения и предупреждения, которые мы должны рассмотреть. Но первый ответ решает мою проблему. Еще раз спасибо за ваше время. – LahiruS