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

Excel 将单元格内容转换为新格式,excel,formatting,excel-formula,vba,Excel,Formatting,Excel Formula,Vba,我的工作场所正在改变CMS系统,我们有大约5000种产品需要进口。由于这两个系统的布局大不相同,因此图像URL格式也存在问题。我需要一个函数或VB代码来转换一个单元格: Main | 1 | Vaterra/VTR03014C-1.jpg;VTR03014C | 2 | Vaterra/VTR03014C-2.jpg;VTR03014C | 3 | Vaterra/VTR03014C-3.jpg;VTR03014C | 4 | Vaterra/VTR03014C-4.jpg;VTR03014C

我的工作场所正在改变CMS系统,我们有大约5000种产品需要进口。由于这两个系统的布局大不相同,因此图像URL格式也存在问题。我需要一个函数或VB代码来转换一个单元格:

Main | 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 |瓦特拉/VTR03014C-14.jpg

分为两个单元格,其中包含:

瓦特拉/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 |
”是如何被删除的,棘手的是,并非所有选项都以“
Main | 1 |
”开头或包含“
Main | 1 |
”,也并非所有选项都以“vatera”开头或包含“vatera”

主要步骤是删除每个图像的后缀,然后捕获到“.jpg”之前的文本行,并将其移动到单独的单元格中。

使用一些Tweek,您将能够在没有VBA的情况下实现

首先,将|/替换为以便可以使用一致的分隔符

此外,您还可以通过将Main | 1 |替换为空空间来删除它

现在,选择Data=>Text-to-Columns 选择“取消计量”选项 您现在可以使用delimeter分号,并且在单独的单元格中有数据,每个单元格中都有as


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

作为替代方案,这里有一个公式解决方案。假设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)))

错误意味着没有更多的条目可返回,因此您可以删除有错误的单元格,然后使用公式->复制->右键单击->粘贴特殊->值选择所有单元格,将其转换为文本而不是公式。(我强烈建议您这样做,因为间接函数是不稳定的,如果您有许多公式单元格,它会大大降低工作簿的速度。)

由于您有VBA标记,下面是一种最快的VBA方法。
假设您的数据在表格1第1行开始的A列中。
此宏将分别在B列和C列中写入以下两行

Column B
瓦特拉/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

这是宏

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
致:


文本到列在这里可以工作吗?如果没有,你能再举几个例子吗?它似乎被分隔为;'s、 那么你想把它分成两个细胞还是多个细胞?我想没有更多的例子了。它们都是以相同的方式排列的,唯一的区别是一些前缀是“Main | 1 |”,而其他前缀是由产品的SKU编号组成的。没错,是的,每个都是用分号分隔的逗号。@Nelly27281。好的,我首先要完全删除我提到的那些前缀“Main | 1 |”。之后,我希望第一个图像在它自己的单元格中,其余的图像选项在另一个单元格中。这有助于澄清问题吗?这些文件是否保存在本地?如果是这样的话,运行目录搜索并提取filename属性会更容易。问题是结果会产生:“Main;1;vatera;VTR03014C-1.jpg。这会导致三个不正确的选项,而且“Main | 1 |”并不总是这样,有时它是“vatera | 1 |”或其他以|1 |因此简单的搜索/替换是无效的。如果您只确定需要以(SomeText)/someother.jpg格式捕获所有内容,则可以使用正则表达式。例如
([\w\s-]+?)\\([\w\s-]+\.jpg)
。该表达式将瓦特拉作为第一个匹配项,文件名作为第二个匹配项。用这个来了解如何在Excel.Hmm中使用正则表达式,这听起来很有希望。这可以自动完成5000个产品的列表吗?RegExp的神奇之处在于,一旦它工作,您可以对任何文本使用相同的表达式。如果您有权访问任何支持正则表达式文本替换的文本编辑器(如记事本++),则只需在文本编辑器中粘贴记录并执行正则表达式替换即可。请检查更新的答案。我刚用记事本做的。看起来很棒!然而,由于它们都在各自的行中,这不会将它们复制回Excel中的单个单元格吗?嗨,非常感谢。看起来不错,但是宏中有一个错误。它会生成一条错误消息:“运行时错误'13':类型不匹配”。谢谢。另外,由于它们并非都以“Main | 1 |”开头,我可以简单地用通配符替换
If InStr(1,strValue,“Main | 1 |”
,如:
If InStr(1,strValue),*|1 |”
。感谢出现错误。请尝试调试代码并告诉我哪一行抛出了错误。我已经用给定的示例进行了测试,它工作正常。关于
Main | 1 |
,我已经介绍了这一部分,检查单元格A2中的数据,它没有以
Main | 1 |
开始,但是单元格B2和C2给出了预期的结果。确保y您已经添加了Microsoft VBSript Re
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
sh.Cells(i, 2).Value = strValue1
sh.Cells(i, 3).Value = strValue2
sh.Cells(i, 1).Value = strValue1
sh.Cells(i, 2).Value = strValue2