• ベストアンサー

Excelのセルから特定値の抜き取りについて

添付画像のようにB列にラップタイムを貼り付けてあります。 このタイムを区間ごとにC~L列にそれぞれ取り出したいのですが知恵をお貸しくださいm(_ _)m タイムが「12.0」など全て同じ桁なら法則に従い「LEFT関数」などで簡単でしたが、「9.1」と1桁のパターンもあるので苦戦しています・・・ 取り出す数字のパターンは「●●.●」(例:11.5)と「●.●」(例:6.5)の2種類です。 間の「-」ハイフンは半角です。 C~L列にどうにか取り出せる関数はありますでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

数式で対応するなら以下の数式をC2セルに入力し、右方向および下方向にオートフィルコピーしてください。 =TRIM(MID(SUBSTITUTE($B2,"-",REPT(" ",100)),(COLUMN(A:A)-1)*100+1,100))

mzakom
質問者

お礼

素晴らしい。見事にやりたい事が出来ました。 仕組みの理解はいまいちなので、勉強に励みたいと思いますm(_ _)m ありがとうございました。

その他の回答 (6)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.7

#5、6、cjです。たびたびすみません。追加レスです。 戻り値が文字列値では扱い難そうですよね。 数値または空白を意味する空文字を返すように書き直してみました。 関数名変えましたから、数式は、 =SplitVal($B2) に替えて、他同じ手順です。 ※#5の手順中、プロシージャと数式だけ変更です。 因みに =SUM(SplitVal(B2)) =AVERAGE(SplitVal(B2)) =MIN(SplitVal(B2)) 等のように、配列を引数として扱える関数については、 そのまま普通に、引数として渡せば、正しく計算されます。 一度設定してしまえば容易に 応用が利くのがUDFの特長、ではあります。 ' ' ==============標準モジュール============== Function SplitVal(ByVal Source As String, Optional ByVal Delimiter As String = "-")   Const XSize = 29   Dim arrS, arrV, i&   arrS = Split(Source, Delimiter)   ReDim arrV(XSize)   For i = 0 To UBound(arrS)     arrV(i) = Val(arrS(i))   Next i   For i = UBound(arrS) + 1 To XSize     arrV(i) = ""   Next i   SplitVal = arrV End Function ' ' ===================================)

mzakom
質問者

お礼

追加画像確認しました。ありがとうございます(>_<) 今回もユーザー定義関数など、勉強になりました。 ぜひ後学のために参考にさせて頂きますm(_ _)m

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

#5、cjです。 すみません、別件に関する連絡を書き忘れてしまいました。 ///  先回ご質問のNo.8297159について、  締切後に画像を追加しましたので、お暇な時にでも目を通してみてください。 /// 失礼しました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは。お邪魔します。 UDF(ユーザー定義関数)でこなしましょう。 ■VBA ' ' ==============標準モジュール============== Function SplitTxt(ByVal Source As String, Optional ByVal Delimiter As String = "-")   Dim arrV   arrV = Split(Source, Delimiter)   ReDim Preserve arrV(29)   SplitTxt = arrV End Function ' ' =================================== 以上のプロシージャを、当該ブックの標準モジュールに貼り付けます。 ■Excel C2からL2までをドラッグして【C2:L2 選択】(C2 がアクティブな状態で) F2 キーを押して、【C2 を編集モードに】 以下の【数式を数式バーに貼付け】 =SplitTxt($B2) Ctrl + Shift + Enter で、【配列数式として確定】 ※数式バーに {=SplitTxt($B2)} と表示されれば、正しく設定されています。 【C2:L2 選択したまま、下にフィル】 ■手順は以上です。 例示は、C2:L2、10列にしていますが、関数は30列まで対応しています。   ReDim Preserve arrV(29) の 29 という(最大30列迄対応する場合は-1して29の意)数値を必要に合わせて変更可能です。 上の例のように、C2:L2 の範囲で配列数式を設定した場合は、 C2:L2 の一部のセルを、書き換えたり消去することはできません。 C2:L2 を単位として編集するようにしてください。 配列数式にする理由は、UDF(ユーザー定義関数)での計算回数に無駄を出さない為です。 配列数式として設定したセル範囲ごとに、1回だけ計算するので、動作が軽くなります。 UDF(ユーザー定義関数)が自動計算されるタイミングは、 Sourceで指定した参照先が更新された時、です。 一般的なマクロと違って、UDF(ユーザー定義関数)の計算時は、 UnDo(やり直し)を無効にするようなことはありません。 言わずもがなですが、マクロ有効ブックである必要があります。 UDFを複数のブックで使用したい場合は、アドインブックで保存して対応可能です。 (その場合は、マクロ有効ブックでなくとも数式を使用出来るようになります) 以上、運用面など相談、疑問等あれば補足ください。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 >B列のデータを変更したときに自動でC~L列に取り出し出来るようにしたいので とありますので、VBAでの一例です。 画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, endCol As Long, myArray For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row '←2行目~B列最終行まで endCol = Cells(i, Columns.Count).End(xlToLeft).Column If endCol > 2 Then Range(Cells(i, "C"), Cells(i, endCol)).ClearContents End If myArray = Split(Cells(i, "B"), "-") For k = 0 To UBound(myArray) With Cells(i, k + 3) .Value = myArray(k) .NumberFormatLocal = "0.0" End With Next k Next i End Sub 'この行まで ※ 関数でないのでデータ変更があるたびにマクロを実行する必要があります。 尚、「B列のデータを変更したときに」を重視すれば ChangeイベントでB列データ変更時にマクロを走らせる方法もあります。 (1行ずつの変更時) 今回はこの程度で・・・m(_ _)m

mzakom
質問者

お礼

お世話になりますm(_ _)m なるほど。チェンジイベントを使うという手がありましたか。 tom04さんの方法は毎回勉強になります。

回答No.2

ハイフンの位置をFind関数でだして、取り出すことは可能です。 あと、区切り文字であれば列に変換してくれますので、データタブの区切り位置、区切り文字をその他でハイフンにすればいいです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一番簡単は方法は B列すべてを範囲指定 → データ → 区切り位置 → 「カンマやタブ・・・」が選択されているのを確認し「次へ」 → 「その他」を選択 → 右側の窓に「-」(ハイフン)を入力し完了! こんなんではどうでしょうか?m(_ _)m

mzakom
質問者

お礼

返信ありがとうございます。 B列のデータを変更したときに自動でC~L列に取り出し出来るようにしたいので、今回はその方法は使用しない方向です。説明不足で申し訳ありませんm(_ _)m

関連するQ&A