私はたくさんの言語を扱うプログラマーですが、どういうわけか、Excelのマクロ言語や数式言語を学んだことはありません。これを行う簡単な方法があるはずですが、私は困惑しています。
次のようなファイル名の列があります。
/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
私がする必要があるのは、アンダースコアに基づいていくつかの部分に分割されたファイル名だけを返すことです。これが複数のステップを踏む場合は問題ありません。つまり、式1は10DOT_33A_1275_1308304857
の列を返し、式2はその結果を使用して10DOT_33A_1275
の2番目の列を返します。 PHPのexplodeに似た関数があり、文字列を取得して区切り文字(この場合はアンダースコア)に基づいて配列を返すことができると期待していました。これは数式では不可能だと思います。私はMacを使用していて、VBAが利用できるかどうかはわかりませんが、VBAで問題ありません。
MID、LEFT、RIGHTについては知っていますが、それらはすべて、返したい文字数を知っているかどうかに依存します。この場合、私は知りません。行ごとに異なります。有効な唯一の基準は、ファイル名をアンダースコアで複数の列に分割することです。
これは可能ですか?
[データ]メニューの下にあるExcelの[テキストから列へ]機能を使用できます。
数回のパスが必要ですが、数式やvbaなしで実行できます。
独自の区切り文字を指定できます。したがって、_.
_を選択して拡張子を分離し、次に_/
_を選択してディレクトリ構造を分割できます。次に、__
_を選択して、ファイル名を分割できます。
N.b.異なる列をText
に設定して、Excelがそれらを数値として扱わないようにするか、他の列をDo not import (skip)
に設定してそれらを削除することができます。
そして、これがVBAベースのソリューションです。このようなセルをループすることはあまり効率的ではないことに注意してください。行がたくさんある場合(たとえば、10,000を超える場合)、より良い方法があります
処理する範囲を選択して、これを実行します
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
数式ベースのソリューションは次のとおりです。
データが列Aにあり、行2から始まると仮定します
返品できるのは最大5個です(さらに対応するように調整できます)
そして文字列に|が含まれていないことまたは@(ある場合は、他の文字を使用します)
セルB2、ファイル名を取得します=RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))))
セルC2、.extensionを削除します=LEFT(B2,FIND(".",B2)-1)
配列数式としてのセルD2:H2は、連続する項を|で囲みます。および@=SUBSTITUTE(SUBSTITUTE("_"&C2&"_","_","|",{1,2,3,4,5}),"_","@",{1,2,3,4,5})
セルI2、次にI2をJ2:L2にコピー:結果=IFERROR(MID(D2,FIND("|",D2)+1,FIND("@",D2)-FIND("|",D2)-1),"")
まだ選択された答えがないので、別のVBAオプションを提供しますが、今回は分割機能を使用します。
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
計画に役立つSplit関数がVBAにありますが、SPLIT式はありません。
ただし、代わりにExcelの数式を使用することをお勧めします。いくつかのケース:
ファイルパスが各ファイルで同じである場合は、次のように、RIGHTをLENおよびFINDと一緒に使用します。
= RIGHT(A1、LEN(A1)-FIND( "uploads /"、A1)-LEN( "uploads /")+ 1)
ここで、A1はファイルパスのあるセルです。
すべてのファイルが同じパスを持っていない場合は、別の方法で移動する必要があります。たぶん、すべてのファイルが.jpg(?)であるか、ファイル拡張子の前を除いてピリオドがありません。