こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Function プロシージャの戻り値にバグ?

いつも拝見させていただいてます。
今回Excel VBAでタイムスケジュールを作成したところ、まったくわけのわからないエラーが発生してしまい途方に暮れており、皆様のお力をお借りしたく投稿させていただきます。

エラーの内容は簡単に言うと Function プロシージャの戻り値がなくなってしまう(0になっている)ことです。

ESC = ESColumn(EventStart)

----------------------------------

Function ESColumn(TimecoluConv As Date) As Integer

Select Case TimecoluConv

Case "8:00:00"
ESColumn = 2

Case "8:10:00"
ESColumn = 3

Case "8:20:00"
ESColumn = 4

・・・
End Select
End Function

と、このようなコードで入力された時間を数値に変換しているのですが、
繰り返し処理をしているといきなり戻り値が0になってしまいます。

今回は8:00を6回取得した後、8:10を変換しようとしたら戻り値が0になっていました。
戻り値を使用して、セルを選択するため、そのタイミングでエラーになります。

なぜ繰り返し処理の途中で発生するのでしょうか。
解説と対策をご教示していただけると大変助かります。

よろしくお願いします。

投稿日時 - 2014-02-17 19:59:27

QNo.8479306

困ってます

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

Format関数のヘルプを見てもらえばわかることですが
この書式指定では、時間部分は24時間制の2ケタです。

Select Case Format(TimecoluConv, "HH:mm:ss")

Case "08:00:00"
ESColumn = 2

Case "08:10:00"
ESColumn = 3

Case "08:20:00"
ESColumn = 4

・・・
End Select
End Function

投稿日時 - 2014-02-20 10:30:30

お礼

訂正したら正常に機能しました!
ご教示いただきありがとうございます。

エクセルのヘルプ見るべきでした。
初歩的な部分まで他人の知恵を借りる始末で申し訳ありません。

またお力をお借りすることがあると思いますが、よろしくお願いします。

投稿日時 - 2014-02-20 14:15:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

うん、回答者の皆が不明に思っているところがいまだに一切わかりません。
もう面倒くせぇので以下で処理しちゃえばいいんじゃないの

Select Case TimecoluConv

Case TimecoluConv Like "8:00*"
ESColumn = 2

Case TimecoluConv Like "8:10*"
ESColumn = 3

Case TimecoluConv Like "8:20*"
ESColumn = 4

投稿日時 - 2014-02-19 21:55:47

ANo.6

#2です。

> ESC = ESColumn(EventStart)
そもそも、EventStartをどうやってループさせてますか?

”時分秒”の”秒”もCase文に必要?

投稿日時 - 2014-02-19 21:32:14

ANo.5

VBAのDate型は、整数部で基準日からの日数、1日の時刻を小数点以下の実数で管理します。
実数なので時刻の最小単位は1秒ではありません。
また、文字列で指定した時分秒もDate型に変換したときに、秒単位の切りの良い値になるとは限りません。(誤差が出ます)
判定するDate型を秒単位の文字列に変換すれば誤差がなくなります。

Select Case Format(TimecoluConv, "HH:mm:ss")

Case "8:00:00"
ESColumn = 2

Case "8:10:00"
ESColumn = 3

Case "8:20:00"
ESColumn = 4

・・・
End Select
End Function

投稿日時 - 2014-02-18 16:04:11

補足

ご回答ありがとうございます。
Hayashi_Trekさんのご教示の通りコードに加筆してみたのですが、エラーが取れません。(泣)
上記のコードで8:00 ~ 21:20まで実施したところ、
8:10 ~ 9:50までがうまくいきません。
時間が一桁という問題かと思ったのですが、8:00が問題ないことを説明できません。

モジュールをインポートし直してみたのですが、結果変わらずですし。。。

お力を貸していただいているのに泣き言言ってスミマセン。

投稿日時 - 2014-02-19 21:17:10

ANo.4

本来はOnErrorなりしておくべきなんですが
簡単な下記のようなステップだけ追加して確認してください

Function ESColumn(TimecoluConv As Date) As Integer
ESColumn = -1 ' 別の問題の場合は-1が返る

Select Case TimecoluConv

Case "8:00:00"
ESColumn = 2

Case "8:10:00"
ESColumn = 3

Case "8:20:00"
ESColumn = 4

Case else
ESColumn = 0 ' マッチしなかった
MsgBox(TimecoluConv) '何が入ってきたのか表示する

・・・
End Select
End Function

投稿日時 - 2014-02-18 15:30:03

補足

ご回答ありがとうございます。
アドバイスに従い、TimecoluConvの中身を確認したのですが、他との違いが見受けられませんでした。
一度 End Selectの後にStopステートメントで格納された時間を確認しましたが、特に問題は見つけられませんでした。

投稿日時 - 2014-02-19 21:19:46

ANo.3

legalistさん

単純なミスだと思います。
文字列("8:00:00")での比較は無理なので、「時刻」で比較してください。

Function ESColumn(TimecoluConv As Date) As Integer
 Select Case TimecoluConv
  Case #8:00:00 AM#

または

Function ESColumn(TimecoluConv As Date) As Integer
 Select Case TimecoluConv
  Case TimeValue("8:00:00")

ご確認下さい。

投稿日時 - 2014-02-18 10:58:04

補足

ご回答ありがとうございます。
コードの訂正ありがとうございます。
自分が最初に書いたコードでも機能したのですが、特定の時間(8:10 や8:20)のみ戻り値がなくなります。
説明が悪く申し訳ありません。

投稿日時 - 2014-02-18 13:00:11

ANo.2

Case else を作って、stop書いておく

投稿日時 - 2014-02-17 21:49:32

補足

ご回答ありがとうございます。
上記手順で停止させ、変数を確認しましたが、どれも問題ないようです。
(ESColumnは0になってますが)
8:20も同様の事象が発生するのですが、8:30は問題ないです。
なにかあるんでしょうか。

投稿日時 - 2014-02-18 09:18:36

ANo.1

TimecoluConv As Dateと文字列を比較していますよね?
8:10のつもりのTimecoluConvをよく調べたら、 8:10:01 とか 2/17 8:10 とかになっていて、"8:10:00"とは一致せずにて、全部のcaseを擦り抜けた、とかではないでしょうか?

投稿日時 - 2014-02-17 20:24:23

補足

ご回答ありがとうございます。
自分も真っ先にそれを疑ったのですが、
他の時間との間で目立った違いはありませんでした。
入力もバーコードを使用しポカヨケしており、可能性としては薄いようです。

投稿日時 - 2014-02-18 09:10:42

あなたにオススメの質問