Excel (VBA)

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

 
(Windows 8.1 : Excel 2013)
取得したタイムについて
投稿日時: 19/07/22 13:33:54
投稿者: rinahana

いつもお世話になっています。
出退勤のプログラムを考えています。ほぼ出来ているのですが、
特定セルを入力したら、プログラムが走るように設定して、その入力時間を「now()」で日付、時間を取得しています。ディスクトップ右下に表示される時間と取得した時間が2から3分の差が出るのでます。これを訂正することはできませんか?
差が出た状態でも、「このコンピュータのタイムで処理する」と言って通せば済むことかな と思いますが、なぜ数分の差がでるのか?訂正が可能か? など 教えてください。宜しく。
因みに、セルに表示されたタイムとその時点での右下のタイムを比較しています。

回答
投稿日時: 19/07/22 18:13:35
投稿者: sk

引用:
出退勤のプログラム

引用:
特定セルを入力したら、プログラムが走るように設定

そのプログラムの詳細(具体的にどのようなコードを実行しているのか)が
不明瞭です。
 
引用:
その入力時間を「now()」で日付、時間を取得

引用:
スクトップ右下に表示される時間取得した時間が2から3分の差が出る

引用:
差が出た状態でも、「このコンピュータのタイムで処理する」と言って通せば済むことかな と思いますが

「 1 台のコンピューター上で 1 つのマクロ有効ブックを専有している」のか、
「複数台のコンピューター間で 1 つのマクロ有効ブックを共有しようとしている」のか、
どちらの前提でおっしゃっているのでしょうか。

投稿日時: 19/07/22 20:23:49
投稿者: rinahana

 skさんへ
済みませんでした。趣味の会でのことなので、事務所的な複数のコンピュータが稼働しているのではありません。ノートパソコンが1台のみです。
 
ネットで学んで Worksheet の Change イベントを
Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("D4")) Is Nothing Then
        Exit Sub
    Else
        プログラムA ’入力後runするプログラム
    End If
End Sub
 
セルD4 は リスト形式でメンバーの名前がリストして設定してあります。
一人のメンバーを選べば、 プログラムAが実行される となります。
 
 
標準モジュールでは
 
sub プログラムA()
〜〜
〜〜
Dim j15 As Single
〜〜
〜〜
〜〜
Range("C6") = Now() ’必要なデータは hhmm ですが、年月日も使っています。
〜〜
〜〜
〜〜
end sub
 
となっています。
何しろ素人なので、変な点があったら教えてください。

回答
投稿日時: 19/07/23 10:18:43
投稿者: sk

引用:
趣味の会でのことなので、事務所的な複数のコンピュータが稼働しているのではありません。
ノートパソコンが1台のみです。

ならば実際のコードや処理の流れに問題があるのだと思います。
 
引用:
sub プログラムA()
〜〜
〜〜
Dim j15 As Single
〜〜
〜〜
〜〜
Range("C6") = Now() ’必要なデータは hhmm ですが、年月日も使っています。
〜〜
〜〜
〜〜
end sub

そこまで省略されてしまうと、最初の投稿でご説明された内容以上の
情報がほぼないに等しいため、現状では直接の原因について言及する
ことは出来ません。
 
強いて挙げるなら、
 
・C6 セルに設定されている表示形式は具体的にどのようなものなのか。
 
・C6 セルに Now 関数の戻り値(現在のシステム日時)を代入するタイミングは
 本当にその位置で良いのか。
 (それ以降の処理に相当の時間が掛かっているのであれば、
 「 C6 セルにシステム日時が代入された日時」と
 「マクロの実行が完了した日時」との間に
 多少のズレがあってもおかしくはない)
 
・C6 セルの値を編集しているのはそのステートメントだけなのか。
 ( Now 関数の戻り値以外の値を代入している可能性)
 
・Change イベントが発生したワークシートとは
 別のワークシートをアクティブにするステートメントは
 記述されていないのか。
 
・アクティブシートの D4 セルの値を編集するステートメントは
 存在していないのか。
 
・Application オブジェクトの EnableEvents プロパティの値を
 設定するステートメントは存在していないのか。
 
といった点について検討する必要があると思います。

回答
投稿日時: 19/07/25 07:35:10
投稿者: simple

質問です。
(1)
> ディスクトップ右下に表示される時間と取得した時間が2から3分の差が出るのでます。
これはどうやって確認されたのでしょうか。
Sub test()
    ActiveCell.Value = Now()
End Sub
などとやっても、2,3分の誤差があるんですか?
(2)
D4を変更したあと、2,3分経ってから、
D4を含むセル範囲に、例えば値貼付のような作業をしていませんか?
D4とのIntersectはD4となりますから、その場合にも時刻が書き込まれますよ?

回答
投稿日時: 19/07/25 08:06:46
投稿者: simple

追記。
Changeイベントプロシージャは
セルの値は同一であっても
更新処理を行うことで起動します。
 
簡単な例(例えばMsgBox表示)で
セルに同じ値を続けて入力してみて下さい。

回答
投稿日時: 19/07/25 10:06:50
投稿者: mattuwan44

 > Dim j15 As Single
 
Dim j15 As Double
 
にしたらどうでしょうか?
 
j15に時間の値を入れるつもりなら、Single型は不適切です。
誤差の原因になります。

回答
投稿日時: 19/07/26 07:13:11
投稿者: simple

たぶん、mattuwan44さんの指摘があたっているのでしょう。
 
しかし、それにしても、質問(しかもトラブル解決の質問)にあたっては、
事象が他人にも再現できるコードを提示することが必須です。
あれこれ他人が推測するのではなく、確実に再現するものを提示してください。
全部提示する必要はないので、事象が再現する最小限のものを提示してください。

引用:
sub プログラムA()
〜〜
〜〜
Dim j15 As Single
〜〜
〜〜
〜〜
Range("C6") = Now() ’必要なデータは hhmm ですが、年月日も使っています。
〜〜
〜〜
〜〜
end sub

これで時間の差異が発生するんですか?
 
Dim j15 As Single
の宣言は何のためにしているのでしょうか。
それを使った作業そのものを秘密にしている理由は何ですか?
j15を使っているなら、j15がどのような値になっているのか、
Debug.Print j15
などで確認することは、デバッグの基本動作ですから、
まずはご自分で確認して下さい。
 
もっときちんとした質問をお願いします。

投稿日時: 19/07/26 07:15:08
投稿者: rinahana

 skさん、simpleさん、mattuwan44さん
どうもありがとうございました。
 
もともと 稚拙なコードを恥ずかしく思い、コードの多くを記述しなかったことを反省とお詫びをしたいと思います。
コード自体は全く 皆さんが原因かなと思われるような難しいことは一切していなくて、「now()」をsingle型に記憶して、
それを該当セルに表示するだけなので・・・
その結果、mattuwan44さんのご指摘のsingle型をdouble型に変更したところ、私の納得がいく結果(正しい時間)が表示されました。
長い間 本当にありがとうございました。
質問に関して、ご指摘の点は反省し、これからは気を付けたいと思います。