「Smith, J. 010112.pdf」の形式でスプレッドシートにファイル名のリストがあります。ただし、「010112.pdf」、「01.01.12.pdf」、「1.01.2012.pdf」のさまざまな形式になっています。これらを「010112.pdf」の 1 つの形式に変更するにはどうすればよいですか?
6 に答える
個人的には、ワークシート関数が機能する VBA を使用するのが嫌いなので、ワークシート関数でこれを行う方法を考え出しました。このすべてを 1 つのセルに詰め込むこともできますが、個別の列で多くの独立したステップに分割して、どのように機能するかを段階的に確認できるようにしました。
簡単にするために、ファイル名がA1であると想定しています
B1 =LEN(A1)
ファイル名の長さを決定します
C1 =SUBSTITUTE(A1," ","")
スペースを何も置き換えない
D1 =LEN(C1)
スペースを何も置き換えない場合の文字列の長さを確認
E1 = B1-D1
は、いくつのスペースがあるかを決定します
F1 =SUBSTITUTE(A1," ",CHAR(8),E1)
最後のスペースを、ファイル名に使用できない特殊文字に置き換えます
G1 =SEARCH(CHAR(8), F1)
特殊文字を検索します。これで、最後のスペースがどこにあるかがわかります
H1 =LEFT(A1,G1-1)
最後のスペースの前のすべてを剥がします
I1 =MID(A1,G1+1,255)
最後のスペース以降をすべて剥がす
J1 =FIND(".",I1)
最初のドットを見つける
K1 =FIND(".",I1,J1+1)
2 番目のドットを見つける
L1 =FIND(".",I1,K1+1)
3 番目のドットを見つける
M1 =MID(I1,1,J1-1)
最初の数字を見つける
N1 =MID(I1,J1+1,K1-J1-1)
2 番目の数字を見つける
O1 =MID(I1,K1+1,L1-K1-1)
3 番目の数字を見つける
P1 =TEXT(M1,"00")
最初の数字を埋め込む
Q1 =TEXT(N1,"00")
2 番目の数字を埋め込む
R1 =TEXT(O1,"00")
3 番目の数字を埋め込む
S1 =IF(ISERR(K1),M1,P1&Q1&R1)
数字をまとめる
T1 =H1&" "&S1&".pdf"
まとめて
Excel には 20 年以上新しい文字列操作関数が 1 つも追加されていないため、これは一種の混乱です。したがって、簡単であるべきこと (「最後のスペースを見つける」など) には、かなりのトリックが必要です。
これは、回答済みの投稿へのコメントで提案されているように、Excel コマンドと数式に基づく簡単な 4 ステップの方法のスクリーンショットです (いくつかの変更があります)...
以下のこの機能は機能します。日付はddmmyy
フォーマットされていると想定しましたが、そうである場合は適切に調整してmmddyy
ください - あなたの例からはわかりません。
Function FormatThis(str As String) As String
Dim strDate As String
Dim iDateStart As Long
Dim iDateEnd As Long
Dim temp As Variant
' Pick out the date part
iDateStart = GetFirstNumPosition(str, False)
iDateEnd = GetFirstNumPosition(str, True)
strDate = Mid(str, iDateStart, iDateEnd - iDateStart + 1)
If InStr(strDate, ".") <> 0 Then
' Deal with the dot delimiters in the date
temp = Split(strDate, ".")
strDate = Format(DateSerial( _
CInt(temp(2)), CInt(temp(1)), CInt(temp(0))), "ddmmyy")
Else
' No dot delimiters... assume date is already formatted as ddmmyy
' Do nothing
End If
' Piece it together
FormatThis = Left(str, iDateStart - 1) _
& strDate & Right(str, Len(str) - iDateEnd)
End Function
これは、次のヘルパー関数を使用します。
Function GetFirstNumPosition(str As String, startFromRight As Boolean) As Long
Dim i As Long
Dim startIndex As Long
Dim endIndex As Long
Dim indexStep As Integer
If startFromRight Then
startIndex = Len(str)
endIndex = 1
indexStep = -1
Else
startIndex = 1
endIndex = Len(str)
indexStep = 1
End If
For i = startIndex To endIndex Step indexStep
If Mid(str, i, 1) Like "[0-9]" Then
GetFirstNumPosition = i
Exit For
End If
Next i
End Function
テストする:
Sub tester()
MsgBox FormatThis("Smith, J. 01.03.12.pdf")
MsgBox FormatThis("Smith, J. 010312.pdf")
MsgBox FormatThis("Smith, J. 1.03.12.pdf")
MsgBox FormatThis("Smith, J. 1.3.12.pdf")
End Sub
それらはすべて戻り"Smith, J. 010312.pdf"
ます。
VBA は必要ありません。「.」を何も置き換えないことから始めます。
=SUBSTITUTE(A1,".","")
これにより、「.PDF」が「PDF」に変更されるため、元に戻しましょう。
=SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
大丈夫?データをテキスト ファイルに取得し、
awk -F'.' '{ if(/[0-9]+\.[0-9]+\.[0-9]+/) printf("%s., %02d%02d%02d.pdf\n", $1, $2, $3, length($4) > 2 ? substr($4,3,2) : $4); else print $0; }' your_text_file
データがあなたが説明したものとまったく同じであると仮定すると、たとえば、
Smith, J. 010112.pdf
Mit, H. 01.02.12.pdf
Excel, M. 8.1.1989.pdf
Lec, X. 06.28.2012.pdf
免責事項:
@ Jean-FrançoisCorbett が述べたように、これは では機能しません"Smith, J. 1.01.12.pdf"
。これを完全に作り直す代わりに、彼の解決策をお勧めします!
Option Explicit
Function ExtractNumerals(Original As String) As String
'Pass everything up to and including ".pdf", then concatenate the result of this function with ".pdf".
'This will not return the ".pdf" if passed, which is generally not my ideal solution, but it's a simpler form that still should get the job done.
'If you have varying extensions, then look at the code of the test sub as a guide for how to compensate for the truncation this function creates.
Dim i As Integer
Dim bFoundFirstNum As Boolean
For i = 1 To Len(Original)
If IsNumeric(Mid(Original, i, 1)) Then
bFoundFirstNum = True
ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
ElseIf Not bFoundFirstNum Then
ExtractNumerals = ExtractNumerals & Mid(Original, i, 1)
End If
Next i
End Function
これをテストケースとして使用しましたが、すべての例を正しくカバーしていません:
Sub test()
MsgBox ExtractNumerals("Smith, J. 010112.pdf") & ".pdf"
End Sub