2014-02-10 2 views
2

У меня есть столбец, который смешивает вещи размеры с именем своей продукции, что-то вдоль линий:Использование VBA отфильтровать столбцы контента

   A 
47"H X 18"W Six-Light ChandW Three-Light Pendant 
29"H X 38"W X 33"D Eight-Lt Chandelier 
40"H X 32"W Four-Light Chand 
43"H X 36"W X 29"D Three-Light Sconce 
60"H X 50"W Eighteen-Light Chand 

... // another 600 rows 

Я пытаюсь импортировать его в наш магазин с помощью Magmi. Я хочу отделить имя продукта от его размеров.

Проблема в том, что некоторые предметы имеют ширину/высоту и не имеют глубины, в то время как другие (большинство из них) имеют все три. Использование текста в столбцах не показалось достаточно определенным для фильтрации этих данных, поэтому я предполагаю, что мне нужно использовать VBA.

Будучи новым для VBA, я не уверен, с чего начать. У кого-нибудь есть идеи/указатели?

+0

ли какие-либо из данных имеют размеры меньше, чем 10" ?? –

ответ

1

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

Логика:

Найти число " и это положение. Если нет третьего ", тогда найдите " " после 2-го ", и если есть третий ", тогда ищите пробел после этого.

Допустим, вы данные выглядит следующим образом

enter image description here

Код:

это то, что вы пытаетесь?

Option Explicit 

Sub Sample() 
    Dim ws As Worksheet 
    Dim Delim As String 
    Dim Pos1 As Long, Pos2 As Long, Pos3 As Long 
    Dim i As Long, lRow As Long 

    '~~> This is " 
    Delim = Chr(34) 

    '~~> Set this to the relevant worksheet 
    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 
     '~~> Find Last Row of Col A 
     lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     For i = 1 To lRow 
      '~~> Get 1st position of " 
      Pos1 = InStr(1, .Range("A" & i).Value, Delim) 
      '~~> Get 2nd position of " 
      Pos2 = InStr(Pos1 + 1, .Range("A" & i).Value, Delim) 
      '~~> Get 3rd position of " 
      Pos3 = InStr(Pos2 + 1, .Range("A" & i).Value, Delim) 

      '~~> Check if 3rd " is present 
      If Pos3 = 0 Then 
       Pos1 = InStr(Pos2 + 1, .Range("A" & i).Value, " ") 
      Else 
       Pos1 = InStr(Pos3 + 1, .Range("A" & i).Value, " ") 
      End If 

      '~~> Extract relevant text into Col B 
      .Range("B" & i).Value = Mid(.Range("A" & i).Value, Pos1 + 1) 
     Next i 
    End With 
End Sub 

Выход:

enter image description here

+1

BTW один может сделать этот код еще быстрее с помощью массивов Использование массивов рекомендуется. если у вас большое количество строк. –

+0

@SiddarthRout: отлично работает, спасибо! – Adrift

+0

@Adrift: Рад помочь! :) –

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