- ベストアンサー
Excel VBAで区切り文字前後の文字列を抜き出す方法
- Excel VBAを使用して、区切り文字の前後にある文字列を抜き出す方法について説明します。
- A列には時間と文字列の組み合わせがあります。時間と文字列の順番が異なる場合や、時間が括弧で括られている場合もあります。これらの統一されていないフォーマットを一つのフォーマットに統一したい場合には、Excel VBAを使用することで簡単に実現することができます。
- 具体的な手順は以下の通りです。 1. 指定した区切り文字の前後にある文字列を抜き出すためのVBAコードを作成します。 2. A列の各セルに対してVBAコードを適用し、区切り文字前後の文字列をB列に書き出します。 3. 統一されたフォーマットの文字列がB列に書き出されます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 表示がおかしい所があります。 2か所ある ' Cells(i, "B").Value = mTime & " " & mStr を削除して Nextの前に If Len(mTime) - Len(Replace(mTime, ":", "")) = 1 Then mTime = "00:" & mTime End If Cells(i, "B").Value = Format(mTime, "hh:mm:ss") & " " & mStr を追加してください。 0:00 second hand news が 00:0:00 second hand news になるので Format(mTime, "hh:mm:ss") にしてます。
その他の回答 (4)
- kkkkkm
- ベストアンサー率66% (1734/2604)
> 又はそれ以外の区切り文字列(-,|)で区切られています。 その場合でも時間の後または前に半角スペースがあるので(無ければ駄目ですが) がむしゃらに頭を使わすに力技で ただ 00:00 00 - It's Not All Truth 最後の00の前に「:」が無いのは #1. 00:00 - Heldom - Hávamál 変更後も 「- Heldom - Hávamál」 で頭に「-」があるのは の2点が不明だったのと 00:00の前に00を付けるのか後ろにつけるのか不明だったので mTimeの前か後ろに追加してください。 Sub Test() Dim buf As Variant Dim i As Long, temp As String Dim mTime As String, mStr As String For i = 1 To 14 buf = Split(Trim(Cells(i, "A").Value), " ") If InStr(buf(0), ".") > 0 Then temp = Trim(Replace(Cells(i, "A"), buf(0), "")) Else temp = Cells(i, "A").Value End If buf = Split(Trim(temp), " ") If InStr(buf(0), ":") > 0 Then If InStr(buf(0), "(") > 0 Then mTime = Mid(buf(0), InStr(buf(0), "(") + 1, InStr(buf(0), ")") - InStr(buf(0), "(") - 1) Else mTime = buf(0) End If mStr = Trim(Replace(temp, buf(0), "")) If Left(mStr, 1) = "-" Then mStr = Trim(Right(mStr, Len(mStr) - 1)) End If Cells(i, "B").Value = mTime & " " & mStr Else If InStr(buf(UBound(buf)), "(") > 0 Then mTime = Mid(buf(UBound(buf)), InStr(buf(UBound(buf)), "(") + 1, InStr(buf(UBound(buf)), ")") - InStr(buf(UBound(buf)), "(") - 1) Else mTime = buf(UBound(buf)) End If mStr = Trim(Replace(temp, buf(UBound(buf)), "")) If Right(mStr, 1) = "-" Or Right(mStr, 1) = "|" Then mStr = Trim(Left(mStr, Len(mStr) - 1)) End If Cells(i, "B").Value = mTime & " " & mStr End If Next End Sub
お礼
kkkkkmさん、今回もお世話になります。 記載ミスや説明不足が多くお世話をお掛けします。 >00:00 00 - It's Not All Truth >最後の00の前に「:」が無いのは 「:」が無いのはミス記入です。 00:00:00 - It's Not All Truth が正解です。 >変更後も >「- Heldom - Hávamál」 >で頭に「-」があるのは 頭の「-」は、必要ありません。 成形後は、下記になります。 00:00:00 Heldom - Hávamál >00:00の前に00を付けるのか後ろにつけるのか不明だったので 00:00 は、mm:ss相当で hh:mm:ssに成形するので「00」は、前に付加します。 >mTimeの前か後ろに追加してください。 2か所あるmTimeを下記のようにしましたが、 Cells(i, "B").Value = "00:" & mTime & " " & mStr 表示がおかしい所があります。 添付画像の□で囲った箇所に注目ください。 (添付画像は、実際に即した数値に変更しました。) コードの「00:」の記載方法が変でしょうか ?
補足
添付ミスで 添付画像がありませんでした。 下記参照ください。 https://imgur.com/DQajzq6
- SI299792
- ベストアンサー率47% (780/1630)
- SI299792
- ベストアンサー率47% (780/1630)
グーグルスプレッドシートにはRegexExtractという便利な関数があります。 便利なのでユーザー定義関数で作りました。 使い方はグーグルスプレッドシートと全く同じです。従って、グーグルスプレッドシートならこの関数だけでできます。 B1: =RegexExtract(A1,"\d{1,2}(:\d{1,2}){1,2}") 下へコピペ。 Option Explicit ' Function RegexExtract(Expression As String, Pattern As String) As String Dim RegExp As Object ' Set RegExp = CreateObject("VBScript.RegExp") RegExp.Pattern = Pattern RegexExtract = RegExp.Execute(Expression)(0) End Function
- tanakanono
- ベストアンサー率24% (134/553)
正規表現で抽出できますよ。検索すれば出てきますのでここで詳細に書くより検索したほうが見やすいし理解しやすいと思いますので省略します。 例えば、 https://masalib.hatenablog.com/entry/2013/12/03/094907 https://excel-ubara.com/excelvba4/EXCEL232.html http://excel-vba.jpn.org/section/12/StringOperation-VBA
お礼
kkkkkmさん、今回もおかげさまで 訂正されたコードで上手く処理できました。 お礼申し上げます。