Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


665 / 13645 ツリー ←次へ | 前へ→

【79118】型が違います Ackkn 17/5/16(火) 17:35 質問[未読]
【79119】Re:型が違います マナ 17/5/16(火) 19:16 発言[未読]
【79120】Re:型が違います Ackkn 17/5/16(火) 19:43 発言[未読]
【79121】Re:型が違います マナ 17/5/16(火) 20:24 発言[未読]
【79122】Re:型が違います Ackkn 17/5/16(火) 22:33 発言[未読]
【79123】Re:型が違います カリーニン 17/5/16(火) 23:23 発言[未読]
【79124】Re:型が違います Ackkn 17/5/16(火) 23:41 発言[未読]
【79125】Re:型が違います カリーニン 17/5/16(火) 23:51 発言[未読]
【79126】Re:型が違います Ackkn 17/5/17(水) 0:05 発言[未読]
【79127】Re:型が違います カリーニン 17/5/17(水) 0:26 発言[未読]
【79128】Re:型が違います Ackkn 17/5/17(水) 6:37 発言[未読]
【79129】Re:型が違います Ackkn 17/5/17(水) 9:59 お礼[未読]

【79118】型が違います
質問  Ackkn E-MAIL  - 17/5/16(火) 17:35 -

引用なし
パスワード
   お世話になります。

Dim tm_tmp As Date
Dim tm_str As String

文字列の時刻をループで15分丸めをしたいのですが、下の
行で、実行時エラー'13' 型が違いますでエラーになります。

tm_str = "09:12"
tm_tmp = WorksheetFunction.Floor(tm_str, "00:15")

よろしくお願いいたします。

【79119】Re:型が違います
発言  マナ  - 17/5/16(火) 19:16 -

引用なし
パスワード
   ▼Ackkn さん:

>型が違いますでエラーになります。

TimeValue関数を使用したらどうなりますか?

【79120】Re:型が違います
発言  Ackkn E-MAIL  - 17/5/16(火) 19:43 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>>型が違いますでエラーになります。
>
>TimeValue関数を使用したらどうなりますか?

マナさん

TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
ありました。
困ったものです。

【79121】Re:型が違います
発言  マナ  - 17/5/16(火) 20:24 -

引用なし
パスワード
   ▼Ackkn さん:

>TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
>ありました。
>困ったものです。

VBAに同名の関数があります。
ht tp://www.239-programing.com/excel-vba/func/func036.html

【79122】Re:型が違います
発言  Ackkn  - 17/5/16(火) 22:33 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>>TimeValue関数は、調べましたらWorksheetFunctionでは使えないと
>>ありました。
>>困ったものです。
>
>VBAに同名の関数があります。
>ht tp://www.239-programing.com/excel-vba/func/func036.html

マナ さん

ありがとうございます。
また一つ勉強になりました。

でも、この関数は単に文字列をDate型の値に変換してくれる
だけで、肝心な15分単位での丸めはできません。
この機能にWorksheetFunctionでFloorやCeilingを使いたいのですが、
例の型が違いますで使えないので質問した次第です。
よろしくお願いします。

【79123】Re:型が違います
発言  カリーニン  - 17/5/16(火) 23:23 -

引用なし
パスワード
   横から失礼します。

エクセル2007で試した限りではTimeValue関数とWorksheetFunction.Floorの組み合わせで
いけましたけど。

tm_tmp = WorksheetFunction.Floor(TimeValue(tm_str), TimeValue("00:15"))

【79124】Re:型が違います
発言  Ackkn  - 17/5/16(火) 23:41 -

引用なし
パスワード
   ▼カリーニン さん:
>横から失礼します。
>
>エクセル2007で試した限りではTimeValue関数とWorksheetFunction.Floorの組み合わせで
>いけましたけど。
>
>tm_tmp = WorksheetFunction.Floor(TimeValue(tm_str), TimeValue("00:15"))

カリーニン さん:

ありがとうございます。

会社のExcelのバージョンを明日確認して再度テストしてみます。
ただ、違いはFloor関数の中の"00:15"もTimeValueで変換する必要が
ありますか?
Excelシート上でテストした際は、単に"00:15"でいけましたので、
ここだけ違います。

【79125】Re:型が違います
発言  カリーニン  - 17/5/16(火) 23:51 -

引用なし
パスワード
   "00:15"
は文字列ですよね?

【79126】Re:型が違います
発言  Ackkn  - 17/5/17(水) 0:05 -

引用なし
パスワード
   ▼カリーニン さん:
>"00:15"
>は文字列ですよね?

カリーニン さん:

そうです。

【79127】Re:型が違います
発言  カリーニン  - 17/5/17(水) 0:26 -

引用なし
パスワード
   試しに、セルに

="00:15"+"00:32"

としてみてください。セルの書式をを時刻形式にしておけば
0:47:00
と表示されると思います。
これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
と判断してシリアル値に変えてくれているからです。

逆に、
=00:15+00:32
とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
指定する場合は""で括る必要があります。

シリアル値の一日は「1」
シリアル値の一時間は「1/24」
シリアル値の一分は「1/(24*60)」
になります。

ワークシートで8:47を15分で丸める場合です。
=FLOOR("8:47","0:15")
=FLOOR("8:47",1/(24*4))
=FLOOR(0.365972222222222,1/(24*4))

セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
に変換して計算してくれます。
VBAでは、ユーザーが命令しないといけません。

【79128】Re:型が違います
発言  Ackkn  - 17/5/17(水) 6:37 -

引用なし
パスワード
   ▼カリーニン さん:
>試しに、セルに
>
>="00:15"+"00:32"
>
>としてみてください。セルの書式をを時刻形式にしておけば
>0:47:00
>と表示されると思います。
>これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
>と判断してシリアル値に変えてくれているからです。
>
>逆に、
>=00:15+00:32
>とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
>指定する場合は""で括る必要があります。
>
>シリアル値の一日は「1」
>シリアル値の一時間は「1/24」
>シリアル値の一分は「1/(24*60)」
>になります。
>
>ワークシートで8:47を15分で丸める場合です。
>=FLOOR("8:47","0:15")
>=FLOOR("8:47",1/(24*4))
>=FLOOR(0.365972222222222,1/(24*4))
>
>セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
>に変換して計算してくれます。
>VBAでは、ユーザーが命令しないといけません。

カリーニン さん:

ありがとうございます。
なるほど、分かりました。

そういうことですね。
早速確認してみます。

【79129】Re:型が違います
お礼  Ackkn E-MAIL  - 17/5/17(水) 9:59 -

引用なし
パスワード
   ▼Ackkn さん:
>▼カリーニン さん:
>>試しに、セルに
>>
>>="00:15"+"00:32"
>>
>>としてみてください。セルの書式をを時刻形式にしておけば
>>0:47:00
>>と表示されると思います。
>>これは、"00:15"や"00:32"という文字列をエクセルが自動的に時刻データ
>>と判断してシリアル値に変えてくれているからです。
>>
>>逆に、
>>=00:15+00:32
>>とすることは出来ません。シリアル値やセルを参照する場合は直接指定できますが、文字列を
>>指定する場合は""で括る必要があります。
>>
>>シリアル値の一日は「1」
>>シリアル値の一時間は「1/24」
>>シリアル値の一分は「1/(24*60)」
>>になります。
>>
>>ワークシートで8:47を15分で丸める場合です。
>>=FLOOR("8:47","0:15")
>>=FLOOR("8:47",1/(24*4))
>>=FLOOR(0.365972222222222,1/(24*4))
>>
>>セルの場合は、このように入力した「時刻のように見える」数値や文字列を自動的にシリアル値
>>に変換して計算してくれます。
>>VBAでは、ユーザーが命令しないといけません。
>
>カリーニン さん:
>
>ありがとうございます。
>なるほど、分かりました。
>
>そういうことですね。
>早速確認してみます。

カリーニン さん:
マナ さん:

無知な私にお付き合いくださり、ありがとうございました。
無事に動きましたことご報告いたします。
ワークシート関数をVBAで使う場合のシート上での動作と違うこと
を知り、大変勉強になりました。
以下に最終コードを載せておきます。
本当にありがとうございました。

  Set xlAPP = Application
  tm_str = "09:12"
  tm_tmp = TimeValue(tm_str)
  tm_tmp = xlAPP.WorksheetFunction.Floor(tm_tmp, TimeValue("00:15"))
  tm.Value = Format(tm_tmp, "HH:MM")

665 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free