2016-01-12 4 views
0
Apples, Oranges, Strawberries, Pears, Almonds, Peanuts, Peaches 

Я хотел бы найти «» с задом наперед (InStrRev) и выполнить что-то похожее на текст для функции столбцов в Excel, которая будетExcel VBA Текст по столбцам Backwards с максимальным # колонн

#1 > Apples, Oranges 
#2 > Apples | Oranges 

выполнить действие, которое занимает от 1 до 2.

Однако, я хотел бы иметь максимальные столбцы 5 (разделен на 5 частей и сплит-база символов искали от назад)

так, чтобы верхний пример приведет к:

Apples, Oranges, Strawberries | Pears | Almonds | Peanuts | Peaches 
  • Пожалуйста, имейте в виду, что это возможно текст не иметь запятые, так что мне нужно проверить, если они существуют первые

Спасибо за помощь!

+0

Когда вы говорите, что текст не может иметь никаких запятых, вы имеете в виду, что это будет просто одно слово/фраза, которые будут входить в колонку самостоятельно? Или что у вас может быть несколько слов, но без запятых. Яблоки Апельсины Клубника –

+0

@JpadLimited Извините за путаницу, я имею в виду, что может быть несколько слов, но без запятых. В действительности, они являются предложениями, а разделителем является период. Это описание продукта, которое находится в одной ячейке, которое необходимо разделить на 5 столбцов, для использования в качестве объекта с точкой пули. Таким образом, даже если существует более 5 предложений, мне нужно ограничить столбцы до 5. Кроме того, могут быть предложения без периодов. – 1tntla

+0

ОК, я думаю, что ответ, который я только что опубликовал, должен заставить вас идти. Дайте мне знать, если у вас появятся дополнительные вопросы - если это поможет вам отметить в качестве ответа/upvote. Спасибо –

ответ

0

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

Sub SplitIntoColumns() 
Dim intMaxCols   As Integer 
Dim intCommaFoundPos As Integer 
Dim intNumCommasFound As Integer 
Dim strTextToCheck  As String 
Dim strFoundText  As String 
Dim intRowToWriteTo  As Integer 
Dim intColToWriteTo  As Integer 

    'this should be max num of columns you want -1 
    intMaxCols = 4 

    'just putting the text into the activecell and running on that 
strTextToCheck = ActiveCell 

'row to write output to 
intRowToWriteTo = 10 

'column to write output to - it will go backwards from here 
intColToWriteTo = 10 

'find the comma 
intCommaFoundPos = InStrRev(strTextToCheck, ",") 

'if there is a comma 
If intCommaFoundPos > 0 Then 

    'loop until you have looped the max columns number of times, or until there are no commas left in the string 
    Do Until (intNumCommasFound = intMaxCols) Or intCommaFoundPos = 0 

     'get comma position 
     intCommaFoundPos = InStrRev(strTextToCheck, ",") 

     'if there is still a comma 
     If intCommaFoundPos > 0 Then 

      'keep track of the number found 
      intNumCommasFound = intNumCommasFound + 1 

      'take everything to right of comma 
      strFoundText = Trim(Mid(strTextToCheck, intCommaFoundPos + 1, Len(strTextToCheck))) 

      'write to sheet, adjust next column number 
      ActiveSheet.Cells(intRowToWriteTo, intColToWriteTo) = strFoundText 
      intColToWriteTo = intColToWriteTo - 1 

      'change the text to check to not include the word just found 
      strTextToCheck = Left(strTextToCheck, intCommaFoundPos - 1) 

     End If 

    Loop 

    'if there is any text left, write to sheet 
    If Len(strTextToCheck) > 0 Then ActiveSheet.Cells(intRowToWriteTo, intColToWriteTo) = strTextToCheck 

End If 

End Sub

+0

@ 1tntla, если у вас много данных, это будет работать медленный. Если вы спросите меня, я построю более быстрое разрешение для вашего –

+0

. Он работает с 10 000 строк данных менее чем за 1 секунду.Это не значит, что он не может быть более эффективным, но он предназначен только для того, чтобы дать плакат отправной точкой. –

+0

@JpadLimited Спасибо за ответ. Я получил его работу, но без второго оператора if, который проверяет запятую. Не могли бы вы рассмотреть это, прежде чем я выберу это как ответ? Спасибо =] – 1tntla

0

Вы также можете реализовать его в формулу:

=IF(LEN(A3)-LEN(SUBSTITUTE(A3,",",""))<5,SUBSTITUTE(A3,",","|"),REPLACE(A3,FIND("@",SUBSTITUTE(A3,",","@",LEN(A3)-LEN(SUBSTITUTE(A3,",",""))-4))+1,LEN(A3),SUBSTITUTE(MID(A3,FIND("@",SUBSTITUTE(A3,",","@",LEN(A3)-LEN(SUBSTITUTE(A3,",",""))-4))+1,LEN(A3)),",","|")))

строкой в ​​A3

Как это работает:

  1. Определите число «,» в строке, вычитая длину строки без запятой из полной строки.
  2. если менее 5 запятых, то замените все «,» на «|»
  3. если оно равно или больше 5 запятыми, тогда найдите позицию символа 5-й запятой справа и замените строку после этой позиции символа на замещенную строку.
Смежные вопросы