Jak zwrócić wszystko między dwoma znakami w programie Excel?

6

Jestem programistą z wieloma językami, ale jakoś nigdy nie nauczyłem się makra Excel ani języka formuły. Jestem pewien, że musi to być prosty sposób, ale jestem zakłopotany.

Mam kolumnę nazw plików, które wyglądają tak:

/home/www/shoppermarketexpo/dot/uploads/10DOT_33A_1275_1308304857_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_15G_1184_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_5A_1450_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_18A_1341_1308325044_2.jpg

Muszę tylko zwrócić nazwę pliku, podzieloną na kilka części na podstawie podkreślenia. W porządku, jeśli ma to wiele kroków - formuła 1 zwraca kolumnę z 10DOT_33A_1275_1308304857, następnie formuła 2 używa tego wyniku, aby zwrócić drugą kolumnę za pomocą 10DOT_33A_1275 i tak dalej. Miałem nadzieję, że pojawi się funkcja podobna do eksplodowania PHP, w której możesz wziąć łańcuch i zwrócić tablicę na podstawie separatora (w tym przypadku podkreślenia). Zgaduję, że nie jest to możliwe w formule; Będę w porządku z VBA, chociaż jestem na Macu i nie wiem, czy jest dla mnie dostępny.

Wiem o MID, LEWEJ i PRAWEJ, ale wszystkie one zależą od tego, czy znasz liczbę znaków, które chcesz powrócić, a w tym przypadku nie. Różni się od rzędu do rzędu; jedynym kryterium, które działa, jest podział nazwy pliku na wiele kolumn w podkreśleniach.

czy to możliwe?

EmmyS
źródło
Proponuję opublikować to na forum Microsoft Excel. Powinieneś być w stanie znaleźć kogoś, kto może pomóc w przygotowaniu skryptu VBA.
surfasb
1
@surfasb - dzięki, ale potrzebujesz konta Windows Live, aby pisać na forach MS, a moja firma blokuje dostęp do rejestracji.
EmmyS
O mój zły. Po prostu wiem, że jest to łatwe w C #, ale nie jestem facetem VBA. I prawie nigdy nie widzę żadnego z nich biegającego tutaj.
surfasb

Odpowiedzi:

4

W menu Dane można użyć funkcji Tekst do kolumn programu Excel.

To zajmie kilka przebiegów, ale możesz to zrobić bez formuły lub vba.

Możesz określić własne ograniczniki. Więc możesz wybrać . aby oddzielić rozszerzenie / rozdzielić strukturę katalogów. Następnie możesz wybrać _ aby podzielić nazwę pliku.

Text to Columns Wizard

N.b. Możesz ustawić różne kolumny na Text aby uniknąć traktowania ich przez Excela jako liczby lub ustawiania innych kolumn Do not import (skip) więc są usuwane.

Chris Kent
źródło
Akceptuję to, ponieważ wygląda na to, że moja wersja biurowa na Maca nie pochodzi z VBA. Ale będę pamiętać o innych odpowiedziach na przyszłość; wszystkie są dobre.
EmmyS
6

A oto rozwiązanie oparte na VBA. Zauważ, że pętla przez takie komórki nie jest zbyt wydajna. Jeśli masz dużo wierszy (powiedzmy więcej niż kilka 10.000), są lepsze sposoby

Wybierz zakres, który chcesz przetworzyć i uruchom to

Sub SplitText()
    Dim rng As Range, rw As Range
    Dim cl As Range
    Dim i As Long, j As Long, k As Long
    Dim str As String

    If Not TypeName(Selection) = "Range" Then Exit Sub

    Set rng = Selection
    For Each rw In rng.Rows
        str = rw.Cells(1, 1)
        str = Mid(str, InStrRev(str, "/") + 1)
        str = Left(str, InStr(str, "."))
        j = InStr(str, "_")
        k = 2
        Do While j > 0
            rw.Cells(1, k) = Left(str, j - 1)
            str = Mid(str, j + 1)
            j = InStr(str, "_")
            k = k + 1
        Loop
        rw.Cells(1, k) = str
    Next
End Sub
chris neilsen
źródło
4

Oto rozwiązanie oparte na formule:

Zakładając, że dane znajdują się w kolumnie A, wiersz początkowy 2
i jest co najwyżej 5 sztuk do zwrotu (można je dostosować, aby poradzić sobie z większą ilością)
i że ciągi nie zawierają | lub @ (jeśli tak, użyj innych znaków)

Komórka B2, pobiera nazwę pliku =RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))))

Komórka C2, usuwa rozszerzenie
=LEFT(B2,FIND(".",B2)-1)

Komórki D2: H2 jako formuła tablicowa, nawiasy kolejne terminy z | i @
=SUBSTITUTE(SUBSTITUTE("_"&C2&"_","_","|",{1,2,3,4,5}),"_","@",{1,2,3,4,5})

Komórka I2, a następnie skopiuj I2 do J2: L2: wynik
=IFERROR(MID(D2,FIND("|",D2)+1,FIND("@",D2)-FIND("|",D2)-1),"")

chris neilsen
źródło
2

W VBA istnieje funkcja Split, która pomoże ci w planowaniu, ale nie ma formuły SPLIT.

Sugeruję jednak użycie formuły Excel. Kilka przypadków:

  1. Jeśli ścieżka pliku jest taka sama dla każdego pliku, po prostu użyj PRAWO razem z LEN i FIND, tak jak poniżej:

    = PRAWO (A1, LEN (A1) -FIND („przesyłanie /”, A1) -LEN („przesyłanie /”) + 1)

    gdzie A1 jest komórką ze ścieżką do pliku.

  2. Jeśli wszystkie pliki nie mają tej samej ścieżki, musisz przejść przez coś innego. Może wszystkie pliki to .jpg (?) Lub nie mają okresów z wyjątkiem przed rozszerzeniem pliku.

Excellll
źródło
2

Ponieważ nie ma jeszcze wybranej odpowiedzi, dam ci kolejną opcję VBA, ale tym razem z funkcją split.

    Option Explicit

Sub SplittySplit()

Dim fileLocCell As Range
Dim fileName As String
Dim fileNameBeginsAt As Integer

Dim fileNameSubParts() As String
Dim fileNameExtensionLoc As Integer

Dim rng As Range
Set rng = Selection 'or some more specific rnage
    For Each rw In rng.Rows
        Set fileLocCell = Cells(7, 4)
        fileNameBeginsAt = InStrRev(fileLocCell.Text, "/")
        fileName = Right(fileLocCell, (Len(fileLocCell.Text) - fileNameBeginsAt))
        'if you don't want the ".jpg" at the end or whatever the extension maybe***
        fileNameExtensionLoc = InStrRev(fileName, ".")
        '***
        fileName = Left(fileName, fileNameExtensionLoc - 1)
        fileNameSubParts = Split(fileName, "_") 'an array indexed at 0

        'do whatever you want with the array
        Dim i As Integer
        For i = 0 To UBound(fileNameSubParts)
            Cells(i + 1, 1) = fileNameSubParts(i)
        Next i
    Next rw

End Sub
Brad
źródło
och, była wybrana odpowiedź ... i tak to masz :)
Brad