- ベストアンサー
Functionプロシージャの戻り値が0になるバグの解説と対策
- Excel VBAでタイムスケジュールを作成する際、Functionプロシージャの戻り値が0になるバグが発生しています。
- このバグは、繰り返し処理中に戻り値が意図せず0になってしまうことが原因です。
- 解決策として、時間の比較には文字列ではなく数値を使用し、Select Case文の条件式を数値に修正することが挙げられます。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (7)
- mindatg
- ベストアンサー率48% (110/227)
うん、回答者の皆が不明に思っているところがいまだに一切わかりません。 もう面倒くせぇので以下で処理しちゃえばいいんじゃないの Select Case TimecoluConv Case TimecoluConv Like "8:00*" ESColumn = 2 Case TimecoluConv Like "8:10*" ESColumn = 3 Case TimecoluConv Like "8:20*" ESColumn = 4
- bin-chan
- ベストアンサー率33% (1403/4213)
#2です。 > ESC = ESColumn(EventStart) そもそも、EventStartをどうやってループさせてますか? ”時分秒”の”秒”もCase文に必要?
- Hayashi_Trek
- ベストアンサー率44% (366/818)
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
補足
ご回答ありがとうございます。 Hayashi_Trekさんのご教示の通りコードに加筆してみたのですが、エラーが取れません。(泣) 上記のコードで8:00 ~ 21:20まで実施したところ、 8:10 ~ 9:50までがうまくいきません。 時間が一桁という問題かと思ったのですが、8:00が問題ないことを説明できません。 モジュールをインポートし直してみたのですが、結果変わらずですし。。。 お力を貸していただいているのに泣き言言ってスミマセン。
- mindatg
- ベストアンサー率48% (110/227)
本来は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
補足
ご回答ありがとうございます。 アドバイスに従い、TimecoluConvの中身を確認したのですが、他との違いが見受けられませんでした。 一度 End Selectの後にStopステートメントで格納された時間を確認しましたが、特に問題は見つけられませんでした。
- jcctaira
- ベストアンサー率58% (119/204)
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") ご確認下さい。
補足
ご回答ありがとうございます。 コードの訂正ありがとうございます。 自分が最初に書いたコードでも機能したのですが、特定の時間(8:10 や8:20)のみ戻り値がなくなります。 説明が悪く申し訳ありません。
- bin-chan
- ベストアンサー率33% (1403/4213)
Case else を作って、stop書いておく
補足
ご回答ありがとうございます。 上記手順で停止させ、変数を確認しましたが、どれも問題ないようです。 (ESColumnは0になってますが) 8:20も同様の事象が発生するのですが、8:30は問題ないです。 なにかあるんでしょうか。
- kmee
- ベストアンサー率55% (1857/3366)
TimecoluConv As Dateと文字列を比較していますよね? 8:10のつもりのTimecoluConvをよく調べたら、 8:10:01 とか 2/17 8:10 とかになっていて、"8:10:00"とは一致せずにて、全部のcaseを擦り抜けた、とかではないでしょうか?
補足
ご回答ありがとうございます。 自分も真っ先にそれを疑ったのですが、 他の時間との間で目立った違いはありませんでした。 入力もバーコードを使用しポカヨケしており、可能性としては薄いようです。
お礼
訂正したら正常に機能しました! ご教示いただきありがとうございます。 エクセルのヘルプ見るべきでした。 初歩的な部分まで他人の知恵を借りる始末で申し訳ありません。 またお力をお借りすることがあると思いますが、よろしくお願いします。