10

「Smith, J. 010112.pdf」の形式でスプレッドシートにファイル名のリストがあります。ただし、「010112.pdf」、「01.01.12.pdf」、「1.01.2012.pdf」のさまざまな形式になっています。これらを「010112.pdf」の 1 つの形式に変更するにはどうすればよいですか?

4

6 に答える 6

25

個人的には、ワークシート関数が機能する 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 つも追加されていないため、これは一種の混乱です。したがって、簡単であるべきこと (「最後のスペースを見つける」など) には、かなりのトリックが必要です。

于 2012-06-28T15:33:59.087 に答える
7

これは、回答済みの投稿へのコメントで提案されているように、Excel コマンドと数式に基づく簡単な 4 ステップの方法のスクリーンショットです (いくつかの変更があります)...

ここに画像の説明を入力

于 2012-06-29T14:50:52.020 に答える
6

以下のこの機能は機能します。日付は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"ます。

于 2012-06-28T08:30:00.597 に答える
2

VBA は必要ありません。「.」を何も置き換えないことから始めます。

 =SUBSTITUTE(A1,".","")

これにより、「.PDF」が「PDF」に変更されるため、元に戻しましょう。

 =SUBSTITUTE(SUBSTITUTE(A1,".",""),"pdf",".pdf")
于 2012-06-27T20:35:09.673 に答える
1

大丈夫?データをテキスト ファイルに取得し、

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

于 2012-06-28T17:47:46.540 に答える
1

免責事項:

@ 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
于 2012-06-27T20:33:31.120 に答える