経過時間を求めるときに、

dim Time as Date
dim Keika as Date
Keika = Now - Time
Keika = Format(Keika, "hh:mm:ss")

でよいと思うのですが、経過時間が24時間以上になる可能性のある
プログラムはどのように書けばいいのでしょうか?
例えば、53:49:12のように計算したいのですが。
Date型は23:59:59の範囲しかダメなんですよね・・・・。

A 回答 (4件)

こんにちは。

itohhといいます。

たしかに、Date型だと上手く計算できません。
でも、経過時間を計算してくれる関数(DateDiff)を併用するとうまくいきますよ。

例.
Dim wTime As Date
Dim Keika As Date
Dim wBuf As String
Dim wNow As Date

wTime = DateValue("2001/7/16")
wNow = Now
Keika = wNow - wTime
wBuf = DateDiff("h", wTime, wNow) & Format(Keika, ":nn:ss")
    • good
    • 1
この回答へのお礼

回答ありがとうございました。ちゃんと動作しました。
DateDiff関数はこのように使えばいいんですね。勉強になりました。

お礼日時:2001/07/16 17:45

どもども田吾作7です。



'日付
Dim wkDate1 As Date
Dim wkDate2 As Date

'差計算ワーク
Dim wkRefDate As Date

'時間計算ワーク
Dim wkHour As Long

'最後に時間を得る文字列
Dim wkStrDate As String


'時間セット
wkDate1 = "2001/7/16 12:00:00"
wkDate2 = "2001/7/15 11:35:21"

'差を求める
wkRefDate = wkDate1 - wkDate2

'時間の算出
wkHour = (Int(wkRefDate) * 24) + Hour(wkRefDate)

'文字列としてセット
wkStrDate = wkHour & ":" & Format(Minute(wkRefDate), "00") & ":" & Format(Second(wkRefDate), "00")

'イミディエイトウィンドウに出力
Debug.Print wkStrDate


ッて感じかな?

DateDiffって使ったこと無いけど、1時間多く計算されるのかな?
実験してみたら、常に一時間大きい値を出してた。実験の仕方が悪いのかな?
うーむDateDiff・・・奥が深い・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ちゃんと動作しました。
常に1時間多く計算されるとのことですが、まだ確認していませんので、
これからやってみたいと思います。
ポイントあげられなくてすみません。
(全員にあげられるように、チェックボックスにすればいいのに・・)

お礼日時:2001/07/16 17:47

dim Time as Date


dim Keika as Date
dim hh as long
Keika = Now - Time
の後に
hh = clng(Month(Keika)) * 24 '時間

cstr(hh) & ":" format$(Keika,"mm:ss")

でOKでしょう。
コードはチェックしてません。ご了承ください。

ちなみに
>Date型は23:59:59の範囲しかダメなんですよね・・・・。
その通りです。

それから(余談)
str = d * 24 + h & ":" & Format(m, "00") & ":" & Format(s, "00")

str = cstr(d * 24 + h) & ":" & Format$(m, "00") & ":" & Format$(s, "00")
と型をそろえた方が良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ちゃんと動作しました。
ポイントあげられなくてすみません。
(全員にあげられるように、チェックボックスにすればいいのに・・)
余談も参考になりました。。。。

お礼日時:2001/07/16 17:43

Keikaには24時間以上の部分も日数として入っていますが、24時間以上は日数として別にするしかありませんが。


表示はちょっとスマートじゃありませんが、こんな感じでいかが?

Dim d As Long, h As Long, m As Long, s As Long
Dim str As String
h = Hour(Keika) ' 時
m = Minute(Keika) ' 分
s = Second(Keika) ' 秒
d = Int(Keika) ' 日
str = d * 24 + h & ":" & Format(m, "00") & ":" & Format(s, "00")
    • good
    • 0
この回答へのお礼

一番最初に回答してくれてありがとうございました。
このソースコードでちゃんと動きました。
自分も、このようにもっと柔軟に考えられたらなぁと。。。。。

お礼日時:2001/07/16 17:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

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

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

QFormat(Date, "dd")と同じ形式で

Format(Date, "dd")の数値表記と
Right("0" & day(Date), 2)の数値表記が
違うものとして認識されるようです。
(例 ピボットテーブルで同じ”11”が2つ存在する)


手動で数値を入れたときや
強制的に月初”01”を入れたいときに
Formatで表記したものと同じ状態にしたいです。

Aベストアンサー

#1補足欄への返信です。

> 検証はしましたが今回の問題とのつながりがわかってはいません。

「ピボットテーブルで同じ”11”が2つ存在する」 というのが 「今回の問題」 ですよね?
単純化すると、
「2つ」のうち、1つは【数値】、1つは【文字列値】、なのではないですか?ということを書きました。
例えば、その日付がC3セルにある場合、適当な空いてる列を使って、
 =ISTEXT(C3)
という数式の戻り値に相違がないか確認してみては如何でしょう。
 見た目の【表示】は "11" 。 【値】が【文字列値】の "11" ならば、TRUE
 見た目の【表示】は "11" 。 【値】が【数値】の 11 ならば、FALSE
相違が見られたならば、どちらかに統一する方法は難しくないですよね。

VBAの Format 関数については既述の通りで補足しなくてもいいと思います。

今回の補足を加味すると
 見た目の【表示】は "11" 。 【値】が【文字列値】の "11" 。
 見た目の【表示】は "11" 。 【値】が【文字列値】の " 11" 。
と、目に見えない半角スペースが紛れているケースも考えないといけないのですかね。
この場合は
 =C3="11"
という数式で確認もできますが、
ワークシートメニューの[検索・置換]機能で、検索値に半角スペースを指定するだけで
確認から解決まで容易にできると思います。

///

> TextBox10.Text = Str("01")
>
> としたときにテキストボックスに「01」ではなく「1」と表示される問題でつまづいています。

〓〓〓〓〓〓〓〓〓以下VBAヘルプから引用〓〓〓〓〓〓〓〓〓
Str 関数

バリアント型 (内部処理形式 String の Variant) の値を返します。
数式の値を文字列で表した値 (数字) で返す文字列処理関数です。

構文
Str(number)

引数 number には有効な数式を長整数型 (Long) で指定します。
この引数は必ず指定します。

解説
数値を文字列に変換すると、戻り値の先頭に符号を表示するためのスペースが常に確保されます。
数値が正の場合は、Str 関数の戻り値の先頭にスペースが挿入されます。
このスペースはプラス記号を意味します。

日付、時刻、通貨、ユーザー定義の書式などで数値を書式設定するときに、Format 関数を使います。
Str 関数と異なり、Format 関数を使用して変換した場合は、
引数 number の先頭にスペースは挿入されません。

メモ Str 関数は、ピリオド (.) だけを有効な小数点記号として認識します。
異なる小数点記号を使用する場合は、CStr 関数を使って数値を文字列に変換します。
〓〓〓〓〓〓〓〓〓以上引用(改行は筆者)〓〓〓〓〓〓〓〓〓〓

    要点整理
  Str 関数の引数は「数字」ではなく【数値】です。
  Str 関数の戻り値は「数字」【文字列値】です。
  数値が正の場合は、Str 関数の戻り値の先頭にスペースが挿入されます。

まず、Str 関数は本来【数値】を【文字列値】に置換する為の関数です。
なので、= Str("01") のような使い方をするものではありません。
TextBox10.Text に "01" を設定したいということなら、
 TextBox10.Text = "01"
または
 TextBox10.Text = Format(1, "00")
です。

【数値】を指定するべき引数に【文字列値】を指定した場合、
引数の【文字列】が「数字」として読めるならば、
自動的に引数の「数字」を【数値】に置換する機能(型のキャスト)が働きます。
よって、
> TextBox10.Text = Str("01")
は、
 TextBox10.Text = Str(1)
と命令しているのと同じことになります。

> ......テキストボックスに「01」ではなく「1」と表示される......

= Str(1) の戻り値は先頭に半角スペースがある ■ 1■ です。■01■でも■1■でもありません。

Str 関数の使い途としては、
  【数値】(正整数)を【文字列値】に変換しながら、先頭に半角スペースを付加する
というのが現代的な存在理由で、他の使い方をする例はここ数年見かけません。

///

確認しておいて欲しいのですが、
今回の#1、そして前スレ、どちらも『セル』の【値】と【表示形式】と【データ型】の話をしました。
『TextBox』は『セル』とは異なり、
「もっぱら【文字列値】を扱う」もので、他は関係ありません。

///

Str 関数が一連の質問とどのように関連付けされるのか、質問者さんにしか判らないことのように思います。
VBAの関数やプロパティなどを覚えたい、ということならば、
それぞれの関数やプロパティなどの用途・目的・条件・用法などの基本的な部分は
教本や辞書など(書籍、Webページ、VBAヘルプなど)を頼りに覚えた方がいいです。
質問掲示板は色々な人が色々な意見を書く場所で、良い面も多くありますが、
初歩的なことを学ぼうという人にとっては、一貫性がない、という負の面もあります。

///

VBAを書き上げる力、というか、上達する為の指標、というか、私流儀の紹介になってしまうのかも知れませんが
「何をしたいのか自分に問うて、自分自身に説明してみる」
「目的を明確にして、目的に適した道具(例えば関数やプロパティ)を選ぶ」
「とにかく動くようになるまで書き上げることに集中する」→あらためて検証する。
といった決め事が、息詰った時に私を助けてくれる私のサブルーティンです。

///

大変でしょうけれど、自分を信じてひとうひとつ覚えていくしかありあせん。
頑張ってください。
それでは、また。

#1補足欄への返信です。

> 検証はしましたが今回の問題とのつながりがわかってはいません。

「ピボットテーブルで同じ”11”が2つ存在する」 というのが 「今回の問題」 ですよね?
単純化すると、
「2つ」のうち、1つは【数値】、1つは【文字列値】、なのではないですか?ということを書きました。
例えば、その日付がC3セルにある場合、適当な空いてる列を使って、
 =ISTEXT(C3)
という数式の戻り値に相違がないか確認してみては如何でしょう。
 見た目の【表示】は "11" 。 【値】が【文字列値】の "1...続きを読む

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報