3

У меня есть огромный список путей к папкам в виде текста на листе Excel, из которого я хотел бы извлечь число после каждого обратного слеша. Затем эти цифры нужно собрать в сокращенную ссылку. Например:

Исходная ссылка (скажем, в ячейке A1):

c:\1_Folder\2_Folder\3_Folder

Сокращенная ссылка (желаемый результат):

1.2.3

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

Можете ли вы предложить решение?

5 ответов5

4

Этот VBA будет делать то, что вы хотите. Обратите внимание, мой пример смотрел только из ячейки A1 в ячейку A10 - вам нужно обновить это, чтобы отразить то, что вам нужно (диапазон ячеек)!

Если вы не знаете, как это сделать, добавьте разработчика на ленту. В элементах управления нажмите «Вставить» и добавьте кнопку. Добавьте новый макрос. Вставьте следующее внутри подпрограммы ...

    Dim i As Integer
    i = 1
    For Each c In Worksheets("Sheet1").Range("A1:A10").Cells 'UPDATE THIS ROW ONLY WITH THE RANGE YOU WANT TO USE. This loops through all the cells in the range
        Dim resultsString As String
        resultsString = ""
        Dim splitString() As String
        splitString = Split(c, "\") ' split the value of the current cell by \

        For Each v In splitString
            If v <> "" Then 'only check those with a value
                Dim numberOfDigits As Integer
                numberOfDigits = 0
                For charCount = 1 To Len(v)
                    If IsNumeric(Left(v, charCount)) Then
                        numberOfDigits = charCount ' read how many characters there are (which are numbers)
                    End If
                Next

                If (numberOfDigits > 0) Then
                    resultsString = resultsString & Left(v, numberOfDigits) & "." 'if there are numbers, then read that number of digits from the left
                End If
            End If
        Next

        Dim iLength As Integer
        iLength = Len(resultsString)
        If (iLength > 0) Then ' if there are any values
            Range("B" & i).Value = Left(resultsString, iLength - 1) 'UPDATE THIS ROW ONLY IF YOU WANT TO USE A DIFFERENT COLUMN THAN B TO SHOW RESULTS. This takes the value - 1 character (sicne the last character is a .
        End If

        i = i + 1
    Next  

Я добавил экран результатов

3
  1. Перейти к данным - текст в столбцы
  2. Разделитель на основе \
  3. Затем вы можете использовать формулу, такую как =LEFT(A2,1)&"."&LEFT(B2,1)&"."&LEFT(C2,1)

VBA - при условии, что ваши данные в столбце A

Sub Search_DelimitedSubString_In_String()
Application.ScreenUpdating = False
Dim strFolder As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
j = 1
'Loop through cells
For Each c In Range("A:A")
    'Select non-blanks
    If c.Value <> "" Then
        On Error Resume Next
        For i = 1 To Len(c.Value)
            If Mid(c.Value, i, 1) = "\" Then
                If IsNumeric(Mid(c.Value, i + 1, 1)) Then
                strFolder = strFolder & Mid(c.Value, i + 1, 1) & "."
                End If
            End If

        Next

    Cells(j, 2) = strFolder
    j = j + 1
    End If
 strFolder = ""
 Next c

 For Each c In Range("B:B")
 If c.Value <> "" Then
    k = Len(c.Value)
    c.Value = Left(c.Value, k - 1)
 End If
 Next

Application.ScreenUpdating = True
End Sub
2

Предполагая, что все ваши данные находятся в столбце A, столбец B будет выглядеть так:

Dim RE As Object
Set RE = CreateObject("VBScript.RegExp")
RE.Global = True
RE.Pattern = "\\(\d+)"

For Each c In UsedRange.Columns(1).Cells
    Set matches = RE.Execute(c)
    ReDim all(matches.Count - 1)
    For i = 0 To matches.Count - 1
        all(i) = matches.Item(i).Submatches(0)
    Next
    c.Offset(0, 1) = Join(all(), ".")
Next

Я использовал VBA Regex, два цикла и массив Join

VBA RegEx не поддерживает внешний вид, иначе вы можете использовать (?<=\\)\d+ .

0

это важно использовать VBA? если вы используете версию 2013 Excel, гораздо проще использовать функцию "Flash Fill", чтобы сделать это ...

Flash Fill - это функция для заполнения ячеек по шаблону ячеек рядом с ними:

просто заполните A1, A2, A3, ... строками, из которых вы хотите извлечь символы, заполните B1 так, как вы хотите получить ответ:

в B2 нажмите CTRL + E, Excel заполнит другие ячейки так, как вы хотите:

-1

Если "Папка" действительно является "Папкой" (а не общим именем для специальных имен папок), то эта формула будет самой быстрой. Введите его в B1 и перетащите его вниз или дважды щелкните на заливке плюс:

= ЗАМЕНИТЬ (SUBSTITUTE (ЗАМЕНИТЬ (A1, "_ Папка \",), "C:\" "", ""), "_ Папка", "")

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .