将单元格内容转换为新格式

时间:2015-09-24 15:43:28

标签: excel excel-vba formatting excel-formula vba

我的工作场所正在改变CMS系统,我们有大约5,000种产品需要导入。问题来自图像URL格式化,因为这两个系统的布局截然不同。我需要一个函数或VB代码来转换一个单元格:

  

主| 1 | Vaterra / VTR03014C-1.JPG; VTR03014C | 2 | Vaterra / VTR03014C-2.JPG; VTR03014C | 3 | Vaterra / VTR03014C-3.JPG; VTR03014C | 4 | Vaterra / VTR03014C-4.JPG ; VTR03014C | 5 | Vaterra / VTR03014C-5.JPG; VTR03014C | 6 | Vaterra / VTR03014C-6.JPG; VTR03014C | 7 | Vaterra / VTR03014C-7.JPG; VTR03014C | 8 | Vaterra / VTR03014C-8.JPG; VTR03014C | 9 | Vaterra / VTR03014C-9.jpg; VTR03014C | 10 | Vaterra / VTR03014C-10.JPG; VTR03014C | 11 | Vaterra / VTR03014C-11.JPG; VTR03014C | 12 | Vaterra / VTR03014C-12.JPG; VTR03014C | 13 | Vaterra / VTR03014C-13.jpg; VTR03014C | 14 | Vaterra / VTR03014C-14.JPG

分为两个单元格:

  

Vaterra / VTR03014C-1.JPG

这就是它变得棘手的地方:

  

Vaterra / VTR03014C-2.JPG; Vaterra / VTR03014C-3.JPG; Vaterra / VTR03014C-4.JPG; Vaterra / VTR03014C-5.JPG; Vaterra / VTR03014C-6.JPG; Vaterra / VTR03014C-7.JPG ; Vaterra / VTR03014C-8.JPG; Vaterra / VTR03014C-9.jpg; Vaterra / VTR03014C-10.JPG; | Vaterra / VTR03014C-11.JPG; Vaterra / VTR03014C-12.JPG; Vaterra / VTR03014C-13.jpg; Vaterra / VTR03014C-14.JPG

注意" Main|1|"已被删除,棘手的部分是,并非所有这些都以#34; Main|1|"开始或包含#34; $('li.nav-about').click(function () { $('#arrow-about').toggleClass("rotate"); $('#arrow-indusrty').removeClass("rotate"); $('#arrow-application').removeClass("rotate"); $(this).find('ul').toggle(); }); $(' li.nav-industry').click(function () { $('#arrow-about').removeClass("rotate"); $('#arrow-indusrty').toggleClass("rotate"); $('#arrow-application').removeClass("rotate"); $(this).find('ul').toggle(); }); $('li.nav-application').click(function () { $('#arrow-about').removeClass("rotate"); $('#arrow-indusrty').removeClass("rotate"); $('#arrow-application').toggleClass("rotate"); $(this).find('ul').toggle(); }); "并非所有选项都以" Vaterra"。

开头或包含

主要步骤是删除每个图像的后缀,然后捕获文本行,直到" .jpg"并将其移至一个单独的单元格。

3 个答案:

答案 0 :(得分:0)

Splitted and Junk Removed Before Regexp

After Regexp Replace All

通过一些微调,你可以在没有VBA的情况下实现它。

首先,将 | / 替换为; ,以便您可以拥有一致的分隔符。

此外,您可以删除Main | 1 |用空格替换它。

现在,选择Data =>文本到列 选择Delimeted选项 您现在可以使用分隔符分号,并且您将在单独的单元格中使用每个单元格中的as进行数据。

您现在可以删除不需要的条目。

答案 1 :(得分:0)

作为替代方案,这是一个公式解决方案。假设大单个文本块在单元格A1中,将此公式放在单元格B1中并向下复制,直到它开始给出错误:

=TRIM(MID(SUBSTITUTE("|"&$A$1,";",REPT(" ",LEN($A$1))),LEN($A$1)*(ROW(A1)-1)+1+LOOKUP(2,1/(MID(SUBSTITUTE("|"&$A$1,";",REPT(" ",LEN($A$1))),LEN($A$1)*(ROW(A1)-1)+ROW(INDIRECT("1:"&LEN($A$1))),1)="|"),ROW(INDIRECT("1:"&LEN($A$1)))),LEN($A$1)))

错误意味着没有更多条目要返回,因此您可以删除有错误的单元格,然后选择具有公式的所有单元格 - >复制 - >右键单击 - >选择性粘贴 - >将它们转换为文本而不是公式的值。 (我强烈建议这样做,因为间接功能是不稳定的,如果你有很多配方单元,它可能会大大减慢你的工作簿。)

答案 2 :(得分:0)

由于您拥有VBA标签,因此这是一种最快的VBA方法 假设您的数据位于第1页上第1行的第A列中 该宏将分别在B列和C列中写下以下两行。

Column B
  

Vaterra / VTR03014C-1.JPG

Column C
  

Vaterra / VTR03014C-2.JPG; Vaterra / VTR03014C-3.JPG; Vaterra / VTR03014C-4.JPG; Vaterra / VTR03014C-5.JPG; Vaterra / VTR03014C-6.JPG; Vaterra / VTR03014C-7.JPG ; Vaterra / VTR03014C-8.JPG; Vaterra / VTR03014C-9.jpg; Vaterra / VTR03014C-10.JPG; | Vaterra / VTR03014C-11.JPG; Vaterra / VTR03014C-12.JPG; Vaterra / VTR03014C-13.jpg; Vaterra / VTR03014C-14.jpg

这是宏。

Public RegMatchArray
Sub test()

    Dim sh As Worksheet
    Dim rowCount As Long
    Dim i, j As Integer
    Dim strValue, strValue1, strValue2 As String

    Set sh = Sheets("Sheet1")

    rowCount = sh.Range("A1048576").End(xlUp).Row

    For i = 1 To rowCount
        strValue = sh.Cells(i, 1).Value
        If InStr(1, strValue, "Main|1|") > 0 Then
            strValue = Replace(strValue, "Main|1|", "")
        End If
        iPos = InStr(1, strValue, ";")
        strValue1 = Left(strValue, iPos - 1)
        strValue2 = Mid(strValue, iPos + 1, Len(strValue) - iPos - 1)
        Call splitUpRegexPattern(strValue2, "([\w\s-]+?)\/([\w\s-]+?\.jpg)")
        For j = LBound(RegMatchArray) To UBound(RegMatchArray)
            If j < 1 Then
                strValue2 = RegMatchArray(j)
            Else
                strValue2 = strValue2 & ";" & RegMatchArray(j)
            End If
        Next
        sh.Cells(i, 2).Value = strValue1
        sh.Cells(i, 3).Value = strValue2
    Next

    Set sh = Nothing
End Sub

Public Function splitUpRegexPattern(targetString, strPattern)
    Dim regEx As New RegExp
    Dim strReplace As String
    Dim arrArray()
    i = 0

    'CREATE THE REGULAR EXPRESSION
    regEx.Pattern = strPattern
    regEx.IgnoreCase = True
    regEx.Global = True

    'PERFORM THE SEARCH
    Set Matches = regEx.Execute(targetString)

    'REPORTING THE MATCHES COLLECTION
    If Matches.Count = 0 Then
        RegMatchArray = ""
    Else
        'ITERATE THROUGH THE MATCHES COLLECTION
        For Each Match In Matches
            'ADD TO ARRAY
            ReDim Preserve arrArray(i)
            arrArray(i) = Match.Value
            i = i + 1
        Next
        RegMatchArray = arrArray
        RegExpMultiSearch = 0
    End If

    If IsObject(regEx) Then
        Set regEx = Nothing
    End If
    If IsObject(Matches) Then
        Set Matches = Nothing
    End If
End Function

注意:您必须添加&#34; Microsoft VBSript正则表达式5.5&#34;通过进入 Tools -> References 进行参考。

如果您不想保留原始列A,请更改以下行。这将删除原始数据,并在A和B列中显示结果。

来自:

sh.Cells(i, 2).Value = strValue1
sh.Cells(i, 3).Value = strValue2

致:

sh.Cells(i, 1).Value = strValue1
sh.Cells(i, 2).Value = strValue2

enter image description here