2014-02-10 39 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

問題是,有些項目只有寬度/高度,沒有深度,而其他項目(其中大多數)都有三個。

邏輯:

找到"的數量和它的位置。如果沒有第3個",則在第2個"之後查找" ",如果有第3個",則在此之後查找空格。

比方說,你的數據看起來像這樣

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:很高興能有幫助:) –