- ベストアンサー
(Excel)時間と文字列を抽出
セルに時間と文字列が一緒に入ってる場合、 これを別々のセルに抽出する方法を教えて下さい。 例えば、 A1 -> 28:51 Good Job なら B1 -> 0:28:51 C1 -> Good Job のようにです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
B1: =TEXT(LOOKUP(10^17,LEFT(A1,COLUMN($1:$1))*1),"[h]:mm") C1: =TRIM(SUBSTITUTE(A1,B1,""))
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
多分質問者は、Excel関数での回答を望んでいるのだろう。 であれば、シコシコややざるを得ないが、プログラムを組める人は こういう課題の型の処理は、「正規表現」というツールで処理すると思う。 小生は、下記のPatternの書き方が苦手で、下記も十分でないかもしれないが、VBAでやってみた。 ーー 例データ A列1-3行 15:23 山田が到着 12:23:12 3号機停止 遅延 15:23:34 --- データについて約束事(前提すること)。質問には説明が不十分だ。 時刻・時間部分は半角数字と、半角:で入力されているとする。 時刻・時間部分が、先頭に限る場合はパターンが少し変わる。 下記では、文字列の途中出現でも可。 ーー 標準モジュールにの画面を出して、下記を貼り付け。 (エクセルのシート画面で、ALTキーを押しつつ、F11キーを押せば出る白紙画面に貼り付け) 挿入ー標準モジュールで画面が出る。 ーーー Sub 正規表現02() lr = Range("A10000").End(xlUp).Row 'MsgBox lr For i = 1 To lr x = Cells(i, "A") MsgBox x 'RegExpオブジェクトの作成 Dim reg As Object Set reg = CreateObject("VBScript.RegExp") '正規表現の指定 With reg .Pattern = "([0-5][0-9]:[0-5][0-9]) |(([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9])" 'パターンを指定 .IgnoreCase = False '大文字と小文字を区別するか(False)、しないか(True) .Global = True '文字列全体を検索するか(True)、しないか(False) Dim Matches Set Matches = reg.Execute(x) '正規表現でのマッチングを実行 Dim msg As String For Each Match In Matches 'MsgBox Match.Value ' msg = msg & Match.Value & " が" & Match.FirstIndex & "文字目に見つかりました" & vbCrLf Cells(i, "B") = Trim(Match.Value) Cells(i, "C") = Trim(reg.Replace(x, "")) Next Match End With Next i End Sub ’--- 上記プログラム実行後 B,C列(1-3行は) 15:23 山田が到着 12:23:12 3号機停止 15:23:34 遅延 少数でしか例でしかテストしてないので、結果で不都合が出るかもしれませんがご免。 こういう課題の型の処理の1方法の、臭いだけ嗅いでください。
お礼
VBAでの回答ありがとうございます。 (こちらでVBAの質問をする場合、コードを教えて下さい的な 丸投げ質問は歓迎されないのでなるべくVBAで無い方向で考えるようにしています。) せっかく、VBAの回答が出てきたので完成形が見てみたいです。 ------------------------------------------------ A列の並びは、 「時間 名前」で「名前 時間」のように逆になることは無いように 作成しています。 データについて約束事は、 時刻・時間部分は「半角数字」と、「半角:」で入力で 時間は1時間以上の場合もありえる h:mm:ss 1時間以下の場合は、mm:ss mm:ss 但し、mmが10分以下の場合は、m:ss 時間と名前の間には、半角に空欄がある (区切りは、半角空欄) データの並びは常に「時間 名前」 (「名前 時間」のように逆になることは無い) B列の抜き出し部は常にh:mm:ssで表記される事 例えば、 0:08 ----> 0:00:08 5:53-----> 0:05:53 実際のDATAでマクロをトレースすると B列において 1)0:08 Cluster One の場合 5:53 Learning to Flyの場合 B列に何も表示されない 2)11:22 High Hopes の場合 0:11:22と表示されるべきが11:22と表示される 3)27:05 A New Machine Part 1 の場合 0:27:05と表示されるべきが27:05:00と表示される 4)1:01:16 One of These Days の場合 1:01:16と表示されるべきが1:16と表示される 以上が修正できれば嬉しいです。
- SI299792
- ベストアンサー率47% (774/1618)
私は超能力者ではありません。そのような例があるなら、最初から書いて下さい。 例は1つにしなければならないというルールはありません。 B1: =IFERROR(("0:"&LEFT(A1,FIND(" ",A1)-1))+0,LEFT(A1,FIND(" ",A1)-1)+0)
お礼
追加の回答ありがとうございます。 サンプル数が少なく 時間(Hr)まで対象にすることを記載せずにお手数をお掛けしました。 頂いたコードで処理が出来るようになり改めてお礼申し上げます。
- yumi0215
- ベストアンサー率30% (1335/4411)
B1 =left(a1,5) 表示形式の設定で対応してください C1 =mid(a1,7,10) 最大文字数で対応してください
- SI299792
- ベストアンサー率47% (774/1618)
例が1つしかないのでどのようなパターンがあるか判らないのですが、必ず 分:秒 スペース 文字列 になってるという前提で、 B1: =("0:"&LEFT(A1,FIND(" ",A1)-1))+0 セルの書式設定、時刻 C1: =MID(A1,FIND(" ",A1)+1,99)
お礼
回答ありがとうございます。 時間が「分:秒」の場合は、OKですが 「時間:分:秒」のように60分を超える1時間以上の場合も 選択肢に入れたいのですが可能でしょうか ?
お礼
興味を持っていただきありがとうございます。 提示いただいた式を以下のように 一部改ざんして上手く処理できました。 B1: =TEXT(LOOKUP(10^17,LEFT(A1,COLUMN($1:$1))*1),"[h]:mm:ss") C1: =TRIM(SUBSTITUTE(A1,B1,""))