Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
時刻をAMとPMに分けたい
投稿日時: 17/07/15 23:25:41
投稿者: Dellcasio

Range("A1").Value の時刻をAMとPMに分けたいのですが、
正しく動きません
よろしくお願い致します。
 
 
 
Sub t()
 
If Range("A1").Value >= TimeValue("12:00:00") Then
   Range("A3").Value = "AM"
   End If
    
    
If Range("A1").Value < TimeValue("12:00:00") Then
   Range("A4").Value = "PM"
   End If
 
 
End Sub
 
 

回答
投稿日時: 17/07/15 23:35:36
投稿者: simple

正しく動かない、の内容を正確に書いてください。
# AMは午前中、PMは午後だと思いますが。
# その他、演算誤差との関係ですか?

投稿日時: 17/07/15 23:43:16
投稿者: Dellcasio

simple さんの引用:
正しく動かない、の内容を正確に書いてください。
# AMは午前中、PMは午後だと思いますが。
# その他、演算誤差との関係ですか?

 
 
 
  
Range("A1").Value に  14:33:01 と入力されていても
正解は PM なのに、AMと表示されてしまいます。
 
 
よろしくお願い致します。
 

回答
投稿日時: 17/07/15 23:46:13
投稿者: simple

だって、12時過ぎていたら、午前中としているからでは?
If Range("A1").Value >= TimeValue("12:00:00") Then
    Range("A3").Value = "AM"
End If

投稿日時: 17/07/15 23:54:17
投稿者: Dellcasio

simple さんの引用:
だって、12時過ぎていたら、午前中としているからでは?
If Range("A1").Value >= TimeValue("12:00:00") Then
    Range("A3").Value = "AM"
End If

 
 
 
 01:33:01 と入力しても間違った答えが返って来ます
 
よろしくお願い致します。
 

回答
投稿日時: 17/07/16 00:00:27
投稿者: simple

>よろしくお願い致します。
何をですか?
 
あなたのAM(午前中)の定義を書いてください。

投稿日時: 17/07/16 00:48:38
投稿者: Dellcasio

simple さんの引用:
>よろしくお願い致します。
何をですか?
 
あなたのAM(午前中)の定義を書いてください。

 
 
Sub t()
 
If Range("A1").Value = TimeValue("00:00:00") <= TimeValue("12:00:00") Then
   Range("A3").Value = "AM"
   End If
    
    
If Range("A1").Value = TimeValue("12:00:01") < TimeValue("23:59:59") Then
   Range("A4").Value = "PM"
   End If
 
 
End Sub
 
このようにコードを変更したのですが、
 
Range("A1")に 14:33:01 とあっても
Range("A3").Value にAM 、 Range("A4").Value に PM と答えが、両方表示されます。
Range("A1")の 14:33:01 時間、書式に問題があるのでしょうか?
この辺がよくわかりません。

回答
投稿日時: 17/07/16 04:13:31
投稿者: めんたん

なんだろう不思議な数式だけどデバッグエラーにならないんだ。。
 
それはさておき、
 
> 01:33:01 と入力しても間違った答えが返って来ます
 
とありますが、
 

Range("A1").Value = TimeValue("01:33:01")

If Range("A1").Value >= TimeValue("12:00:00") Then
    Range("A3").Value = "AM"
End If

この時、IFステートメントは False を返しますのでA3にはなにも入力されません。
1時33分1秒は午前中じゃないか!おかしい!! と思われるなら、数式をよく見返してみましょう。
 
日本語で書くと
 
セルA1に「1時33分1秒」と入力
もし、セルA1の値が12時0分0秒以上なら、セルA3に"AM"と入力
 
となっています。

回答
投稿日時: 17/07/16 08:17:07
投稿者: simple

ご指摘のとおりかと思います。
 
補足です。
If Range("A1").Value = TimeValue("00:00:00") <= TimeValue("12:00:00") Then
がどのように解釈されてしまうかは以下のとおりです。参考まで。
 
・まず、Range("A1").Value = TimeValue("00:00:00")が評価されて普通は False
・False <= TimeValue("12:00:00") は、
  0 <= TimeValue("12:00:00")と解釈されて True となり、条件を満たして
  処理が実行されます。
 
--------------------------
A1が0時以上12時以下というつもりなんだろうが、気持ちを並べただけで、
文法無視のコードですね。
二つの条件判定をAndでつなげる必要があります。
 

   If Range("A1").Value >= TimeValue("00:00:00") _
       And Range("A1").Value <= TimeValue("12:00:00") Then
もしくは、ふたつの条件の関係がわかりにくければ、
    If (Range("A1").Value >= TimeValue("00:00:00")) _
       And (Range("A1").Value <= TimeValue("12:00:00")) Then
とカッコを書いてもよいでしょう。(前者がお勧め)
継続行文字( _)を使っていますが、本来はそれぞれ一行のコードです。
 
A1セルには時刻データしか入ってこないことが保証されているなら、
上限1,下限0のチェックは不要で、最初のコードの午前と午後を交換するだけで
OKのはずです。

# 午前午後は無論理解されているようなので、コードの意味を考えようとしていない
# ということなんでしょうか。何度も指摘しているのですがねえ。
 
なお、Elseの使い方も勉強されたらどうでしょう。
If 午前中 Then
    ○○
Else       ←午前中でなければの意味
    ××
EndIf

投稿日時: 17/07/16 13:23:42
投稿者: Dellcasio

simple さんの引用:
ご指摘のとおりかと思います。
 
補足です。
If Range("A1").Value = TimeValue("00:00:00") <= TimeValue("12:00:00") Then
がどのように解釈されてしまうかは以下のとおりです。参考まで。
 
・まず、Range("A1").Value = TimeValue("00:00:00")が評価されて普通は False
・False <= TimeValue("12:00:00") は、
  0 <= TimeValue("12:00:00")と解釈されて True となり、条件を満たして
  処理が実行されます。
 
--------------------------
A1が0時以上12時以下というつもりなんだろうが、気持ちを並べただけで、
文法無視のコードですね。
二つの条件判定をAndでつなげる必要があります。
 
   If Range("A1").Value >= TimeValue("00:00:00") _
       And Range("A1").Value <= TimeValue("12:00:00") Then
もしくは、ふたつの条件の関係がわかりにくければ、
    If (Range("A1").Value >= TimeValue("00:00:00")) _
       And (Range("A1").Value <= TimeValue("12:00:00")) Then
とカッコを書いてもよいでしょう。(前者がお勧め)
継続行文字( _)を使っていますが、本来はそれぞれ一行のコードです。
 
A1セルには時刻データしか入ってこないことが保証されているなら、
上限1,下限0のチェックは不要で、最初のコードの午前と午後を交換するだけで
OKのはずです。

# 午前午後は無論理解されているようなので、コードの意味を考えようとしていない
# ということなんでしょうか。何度も指摘しているのですがねえ。
 
なお、Elseの使い方も勉強されたらどうでしょう。
If 午前中 Then
    ○○
Else       ←午前中でなければの意味
    ××
EndIf

 
 
めんたん さん、&nbsp;simple さん 
ご回答ありがとうございます。
 
AM,PMと表示されるようになりました。
 
Range("A1").Value のセルの中に、
日付と時間の表示(2017/7/4 14:33)
だとAM,PMと表示されなく、無反応になります。
 
この場合の日付と時間(2017/7/4 14:33)
がセル内に表示されている場合は
どうすれば表示されるようになりますでしょうか?
 
 
 
 
 

回答
投稿日時: 17/07/16 14:12:23
投稿者: WinArrow
投稿者のウェブサイトに移動

非常に難しく考えているように見受けられます。
 
最も簡単なコードを提案します
 
    Range("A3").Value = Format(Range("A1").Value, "AM/PM")
 
シートのセルA3に下の数式
=TEXT(A1,"AM/PM")
でもできますが・・・

投稿日時: 17/07/16 15:12:21
投稿者: Dellcasio

WinArrow さんの引用:
非常に難しく考えているように見受けられます。
 
最も簡単なコードを提案します
 
    Range("A3").Value = Format(Range("A1").Value, "AM/PM")
 
シートのセルA3に下の数式
=TEXT(A1,"AM/PM")
でもできますが・・・

 
 
 
WinArrow さんご回答ありがとうございました。
 
本当に簡単で驚いています。有難う御座いました。