Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2007)
時刻の文字列変換についてお願いします
投稿日時: 19/05/01 16:20:44
投稿者: santana

時刻を文字列に変換し、「:」の前後(時間・分)を取り出す処理を作っているのですが、VBAでの文字列変換が望む形にならない為、ご相談です。
A1の値:「9:12」 
B1の値:=TEXT(A1,"h:mm")   シートで関数で行った場合はOKですが、
VBAで、Range("C1").Value = Format(Range("A1"), "h:mm")としますと、
「9:12:00」の様に、秒まで値を持ってしまいます。 
 
実際は、たくさんのデータを一括で処理を行う様に作っていますが、時刻の文字列変換の
ところだけをシート関数でやっています。 方法をご存知の方、アドバイスをお願いいたします。

回答
投稿日時: 19/05/01 16:40:21
投稿者: 角田
投稿者のウェブサイトに移動

> 時刻を文字列に変換し、
> 「:」の前後(時間・分)を取り出す
何故、Hour / Minute 関数を使わない?
( シート関数なら、HOUR / MINUTE )
 

回答
投稿日時: 19/05/01 17:16:00
投稿者: mattuwan44

引用:
A1の値:「9:12」 
B1の値:=TEXT(A1,"h:mm")   シートで関数で行った場合はOKですが、
VBAで、Range("C1").Value = Format(Range("A1"), "h:mm")としますと、
「9:12:00」の様に、秒まで値を持ってしまいます。

 
この認識が間違っています。
この場合、A1セルには、少数の数値が値として入っていて、
セルの書式設定で、時間に変換して表示されています。
そして、B1セルは数式で文字列を返す関数の結果(値も文字列)が表示されています。
(セルの書式設定は標準?)
で、C1はVBAで値をセルに設定する場合は、
キーボードから入力するときと同じように、
勝手にエクセル君が勝手に「時間が入力された」と忖度して、入力された値を少数の数値に、
表示形式を時間にというような風に変えてしまっていると、
現状の説明からは想像されます。
 
なので、
値を転記し、せるの書式設定も同じにすると考えるか、
セルの書式設定を文字列にし、そこに期待する文字を表示してもらうと考えるかで、
対応するようにすると、
期待した文字列が表示されると思います。
 
sub test()
     range("C1").value = "'" & range("A1").text
end sub

 
上はtextプロパティで表示されている文字列を取得し、
その前に文字列とエクセルに認識させるためにシングルクォーテーションを付加して、
Valueプロパティに値をセットして、期待する文字列を表示させるサンプルです。
 
ただし、事前にセルの表示形式を期待する結果を返すように設定しておけば、
今回の件の場合はよいかと思います。

回答
投稿日時: 19/05/01 18:05:53
投稿者: WinArrow
投稿者のウェブサイトに移動

>「:」の前後(時間・分)を取り出す処理
「時」と「分」を分けて取り出したい
と解釈するならば、
掲示のVBAのコードは、その意図とは異なります。
 
また、なぜ、VBAなんですか?
 
角田 さん、レスにあるように
シート関数で、充分対応できます。
 
「時」と「分」は別々のセルする必要あります。
 
VBAより早いと思います。
 
 
 
 

回答
投稿日時: 19/05/01 22:47:50
投稿者: VBA-stepup

>「:」の前後(時間・分)を取り出す処理
 
 
>実際は、たくさんのデータを一括で処理を行う様に作っていますが、時刻の文字列変換の
>ところだけをシート関数でやっています。
 
シート関数でやっていますは?
TEXT(A1,"h:mm")のシート関数を使っているのですか?
ほしい結果は"h:mm"の文字列ですかそれとも、WinArrowさんの言う様に
「時」と「分」を分けて取り出したいですか?
 
「時」 Hour(Range("A1").Value)
「分」 Minute(Range("A1").Value)
 
mattuwan44さんのコメントを参考にコードの中で使い分けてください。
 
"h:mm" Hour(Range("A1").Value) & ":" & Minute(Range("A1").Value)
 
長くなるけど"h:mm"は上記でも良いかと。

回答
投稿日時: 19/05/01 23:04:45
投稿者: WinArrow
投稿者のウェブサイトに移動

>長くなるけど"h:mm"は上記でも良いかと。
 
1つのセルに代入するのであれば、
Format(A1,"hh:mm")
でも
Hour(Range("A1").Value & ":" & Minute(Range("A1").Value
でも、結果は同じでしょう。(エクセル君の小さな親切が・・・・)
 
>、「:」の前後(時間・分)を取り出す処理
この説明は、
「時」と「分」を分離して
と解釈できるが、
>文字列〜〜
との関連が、記述したコードでは説明と食い違うので
具体的に、どのセルにどのような形で入れるのか?
を説明しましょう。
加えて、シート関数では、ダメなのか?
も説明しましょう。
 

回答
投稿日時: 19/05/02 01:10:28
投稿者: VBA-stepup

WinArrowさんコメント有難う御座います。
 
自分で
>mattuwan44さんのコメントを参考にコードの中で使い分けてください。
言っておきながら肝心な文字列の解釈が曖昧のまま文字列にならないコードを書いていました。
 
質問者さんは
>実際は、たくさんのデータを一括で処理を行う様に作っていますが、時刻の文字列変換の
>ところだけをシート関数でやっています。
 
なので理由は解らないがシート関数を使わずにVBAだけで処理を完結したいと解釈しました。
 
但し自分もシート関数を使ったりセルの書式を文字列に設定したりと
あらかじめシート装飾を設定しておいた方が余分なコードの作成や処理時間の短縮になったり
とても有効な手段だと思う。

回答
投稿日時: 19/05/02 22:20:55
投稿者: WinArrow
投稿者のウェブサイトに移動

手操作で文字列にしている部分を
一連のVBAの中に組み込みたい
ということでしょうか?
 
それであるならば、
hh:mm形式の文字列化(B列)の部分を経由しなくても
初めから「hh」部分と「mm」部分をに分けて目的のセルに代入すればよいと考えます。
 

トピックに返信