Excel VBA質問箱 IV

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

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


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

【15011】UserForm上のイメージを動かす ゆう 04/6/13(日) 13:35 質問[未読]
【15012】Re:UserForm上のイメージを動かす つん 04/6/13(日) 14:05 回答[未読]
【15013】Re:UserForm上のイメージを動かす ゆう 04/6/13(日) 14:33 質問[未読]
【15018】Re:UserForm上のイメージを動かす クウガ 04/6/13(日) 15:58 回答[未読]
【15028】Re:UserForm上のイメージを動かす ゆう 04/6/13(日) 20:57 お礼[未読]
【15053】変数 = [Now()]・・・って つん 04/6/14(月) 15:56 発言[未読]
【15057】Re:変数 = [Now()]・・・って ichinose 04/6/14(月) 16:31 発言[未読]
【15059】Re:変数 = [Now()]・・・って つん 04/6/14(月) 17:06 発言[未読]
【15064】Re:変数 = [Now()]・・・って ichinose 04/6/14(月) 18:10 発言[未読]
【15076】Re:変数 = [Now()]・・・って つん 04/6/15(火) 10:46 お礼[未読]
【15079】Re:変数 = [Now()]・・・って クウガ 04/6/15(火) 11:31 発言[未読]

【15011】UserForm上のイメージを動かす
質問  ゆう  - 04/6/13(日) 13:35 -

引用なし
パスワード
   今回初めて質問させていただきます。

UserForm上にイメージを2枚、貼り付けました。
ボタンをクリックすると、
まるで動いているかのように2枚のイメージを
交互に表示させ、移動させたいと思ってます。

どなたかいい案を教えて下さい。
お願いします。

【15012】Re:UserForm上のイメージを動かす
回答  つん E-MAIL  - 04/6/13(日) 14:05 -

引用なし
パスワード
   ゆう さん、こんばんは

>UserForm上にイメージを2枚、貼り付けました。
>ボタンをクリックすると、
>まるで動いているかのように2枚のイメージを
>交互に表示させ、移動させたいと思ってます。
>
>どなたかいい案を教えて下さい。
>お願いします。

イメージには、Visibleプロパティがあるので、
それで、表示・非表示を切り替えられます。

FormのInitializeイベントで、どちらかのイメージの
VisibleプロパティをFalseにしておいて、
あとはボタンのクリックイベントで、If文とかで
切り替えさせればどないでしょう?

【15013】Re:UserForm上のイメージを動かす
質問  ゆう  - 04/6/13(日) 14:33 -

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

すみません、私の質問の仕方が悪かったです。
2枚のイメージを使いフォームの左から右端まで
まるでイメージが歩いているように動かしたいのです。
例えば・・・
ソリティアのゲームであがりの時、トランプがはねてますよね。
あんな感じです。
うまく表現できないですが、分かりますか?

【15018】Re:UserForm上のイメージを動かす
回答  クウガ WEB  - 04/6/13(日) 15:58 -

引用なし
パスワード
   ゆうさん、こんにちは。
つんさん、ご無沙汰しております。

つんさんが書かれたように、IF文で切り替えながら、
Leftプロパティ等を変えていったらいかがでしょうか。
しかしながら、そのままでは初めの位置から、最後の位置まで
いきなり飛んでいってしまうので、
Application.Wait で、時間を止めながら動かした方がよいと思います。

私が、以前こんな風にしたらそれらしく動きました。

まず、15回の動きがあるとして、
A1〜A15 までのセルの表示形式を、h"時"mm"分"ss.00"秒"とします。
そして、A1のセルを =NOW() とし、
A2のセルを =A1+0.0000015
A3のセルを =A2+0.0000015
A4のセルを =A3+0.0000015
  ・
  ・
  ・
A15のセルを =A14+0.0000015
とします。(0.0000015 は大体0.13秒ぐらいです。)

あとは、
 Cells(1, 1)="=Now()" で時間の更新
 For r = 2 To 15
  IF文で、 r が偶数だったら、
  Image1.Visible=True
  Image2.Visible=False
  Image1.Left=Image2.Left+10
  等とします。
  Application.Wait Cells(r, 1) で時間を停止
 Next r

まだ、いい方法があるかもしれませんが、こんな感じでいかがでしょうか。

【15028】Re:UserForm上のイメージを動かす
お礼  ゆう  - 04/6/13(日) 20:57 -

引用なし
パスワード
   クウガさんへ
お返事遅くなりすみません。
理解するのに時間がかかりました。
やっとうごくようになりました。
if文で止まってました。
ありがとうございました。

【15053】変数 = [Now()]・・・って
発言  つん E-MAIL  - 04/6/14(月) 15:56 -

引用なし
パスワード
   こんにちは。

ゆうさん、ボケボケな回答しちゃってすみませんでした。
クウガさん、フォローありがとうございました。
(石鹸箱に書いたけど)

私も、クウガさんの回答を見てやってみました。
ちゃんと動いてちょっと感動(当たり前やけど(笑))
それで、時間の情報をセルに入れないで、
変数に入れて、ループの中で更新していくやり方は出来ないか?と
ちょっくら試行錯誤してみました。

普通に t = Now()
   t = t + 0.0000015

では、当然駄目で、ネットで色々調べてみました。
そしたら、ichinoseさんの過去の回答で、

変数= [Now()]

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=14857;id=excel

というのを発見!
それで、

  Dim r As Long
  Dim t As Double
  
  t = [Now()]
  
  For r = 1 To 15
    If r Mod 2 = 0 Then
      Image1.Visible = True
      Image2.Visible = False
      Image1.Left = Image2.Left + 10
    Else
      Image2.Visible = True
      Image1.Visible = False
      Image2.Left = Image1.Left + 10
    End If
    t = t + 0.0000015
    Application.Wait t
    
  Next r

で、同じように動きました。

Now()を[ ]でくくるとシリアル値(?)になるんですね?
で、セルに入ってる値って、書式は「○○時○○分」とかでも、
実際はシリアル値なんですね・・・やって、セルを使ってやってるときは
普通に=Now()やったもんなあ・・・・
(何を今更言うとんねん!とか言われそうですが(^^;)

他にも、 = [Now()] みたいな技あるんでしょうか?
ね、ichinoseさん♪

【15057】Re:変数 = [Now()]・・・って
発言  ichinose  - 04/6/14(月) 16:31 -

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

こんにちは。
>Now()を[ ]でくくるとシリアル値(?)になるんですね?
うーん、もしかしたら、解釈違ってられるかも・・・。

VBAのnow()関数だって、シリアル値ですよ!!
これね、[]でかこむのは、
Application.Evaluateメソッドの簡単な記述方法なんです。
application.evaluate("now()")
と同値です。
例.
 [a1].value
 [today()]
 [1+2+3+4]
とか
EvaluateメソッドのHelpに出ていたと思います。
よって、
[now()]は、ワークシート関数のNOW()から日付・時間を引っ張ってくると
と言う意味なんです。


>他にも、 = [Now()] みたいな技あるんでしょうか?
>ね、ichinoseさん♪
↑こういうのは、私より、Jakaさんがよく知ってますよ!!

【15059】Re:変数 = [Now()]・・・って
発言  つん E-MAIL  - 04/6/14(月) 17:06 -

引用なし
パスワード
   ichinose さん、早速の返事ありがとうございます(^^)

>>Now()を[ ]でくくるとシリアル値(?)になるんですね?
>うーん、もしかしたら、解釈違ってられるかも・・・。
えっ!?

>VBAのnow()関数だって、シリアル値ですよ!!
そうなの?
だって、
MsgBox [now()] だと「38152.70……」だし
MsgBox Now() だと「04/06/14 17:01.29」だから、
シリアル値に変換するのだとばかり・・・・
うーん、また無知をさらけ出してしまった(>_<)
でも、だったらなんで「t = now()」ではさっきのコード駄目なんだろう?

>これね、[]でかこむのは、
>Application.Evaluateメソッドの簡単な記述方法なんです。
>application.evaluate("now()")
>と同値です。
>例.
> [a1].value
> [today()]
> [1+2+3+4]
>とか
>EvaluateメソッドのHelpに出ていたと思います。

そうなのか。実は「Evaluateメソッド」って初めてお目に掛かりました(^^;
ヘルプも見てきたけど、イマイチよくわかんないな・・・・
もっと、ネットとかでも色々調べてみますね。

>よって、
>[now()]は、ワークシート関数のNOW()から日付・時間を引っ張ってくると
>と言う意味なんです。

では、[now()]と、のNow()はワークシート関数であって、
VBAのNow()とは別物になるのか・・・・

>>他にも、 = [Now()] みたいな技あるんでしょうか?
>>ね、ichinoseさん♪
>↑こういうのは、私より、Jakaさんがよく知ってますよ!!

そか、ではJakaさんのご出馬を待ってみようかなー♪

ほんまに、色々知らないことばかりです。
いつまで経っても「初心者」ですね(>_<)
精進しなくては。

ichinoseさん、ありがとうございました。
また、見当はずれなこと言ってたら、ご指摘お願いしますm(__)m

【15064】Re:変数 = [Now()]・・・って
発言  ichinose  - 04/6/14(月) 18:10 -

引用なし
パスワード
   ▼つん さん:
>>>Now()を[ ]でくくるとシリアル値(?)になるんですね?
>>うーん、もしかしたら、解釈違ってられるかも・・・。
>えっ!?
>
>>VBAのnow()関数だって、シリアル値ですよ!!
>そうなの?
>だって、
>MsgBox [now()] だと「38152.70……」だし
>MsgBox Now() だと「04/06/14 17:01.29」だから、
>シリアル値に変換するのだとばかり・・・・
これは、「VBAのNOW()関数は、Date型で返され、
ワークシート関数の[now()]は、Double型で返されるからだ」
と私は認識しているですが・・・

Helpでは、
「日付型の変数では、日付はコントロール パネルで設定されている短い日付形式に従って表示されます。」となっていました。
'==================================
Sub test()
  Dim bbb As Double
  Dim aaa As Date
  MsgBox Now()
  aaa = [now()]
  MsgBox aaa
  bbb = Now()
  MsgBox bbb
End Sub

このコードを実行して頂いてどうでしょうか?
さらにDate型の場合、
Helpには、
「0:00:00 〜 23:59:59 の範囲の時刻を表すことができます。」
つまり、VBAのNOW()関数は、Date型なので秒単位までしか値を持ってこないのでは
と思っています。

例えば、以下のコード
Sub test2()
  Do While Cells(1, 2).Value = ""
   Cells(1, 1).Value = [now()]
   DoEvents
   Loop
End Sub

セルA1の書式を"hh:mm:ss.00"に設定して実行すると
ちゃんと、0.00秒まで表示されますよね?

でも、

Sub test2()
  Dim aaa As Date
  Do While Cells(1, 2).Value = ""
   aaa = [now()]
   Cells(1, 1).Value = aaa
   DoEvents
   Loop
End Sub

としてしまうと、秒以下は、00になってしまうでしょう?

ワークシート関数のNOW()とVBAのNOW()関数の違い、
私もつい最近なんです。気がついたのは・・・。


>

【15076】Re:変数 = [Now()]・・・って
お礼  つん E-MAIL  - 04/6/15(火) 10:46 -

引用なし
パスワード
   ichinose さん、おはようございます。

丁寧な返事を頂いていたのに、こちらの返信が遅くなりました。
書いていただいてサンプルコード試しました。
なるほど・・・だいぶわかってきた気がします。

>これは、「VBAのNOW()関数は、Date型で返され、
>ワークシート関数の[now()]は、Double型で返されるからだ」
>と私は認識しているですが・・・
これと、以下のサンプルコードで、だいぶ納得出来たかなあ

>Sub test()
>  Dim bbb As Double
>  Dim aaa As Date
>  MsgBox Now()
>  aaa = [now()]
>  MsgBox aaa
>  bbb = Now()
>  MsgBox bbb
>End Sub

>さらにDate型の場合、
>Helpには、
>「0:00:00 〜 23:59:59 の範囲の時刻を表すことができます。」
>つまり、VBAのNOW()関数は、Date型なので秒単位までしか値を持ってこないのでは
>と思っています。

ようするに、データの型の問題なんですね・・・

そういうことで、ichinoseさんの上記のサンプルと同じようなもんですが

Sub test4()
  Dim a As Double
  Dim h As Double 
  a = Now()
  h = [Now()]  
  MsgBox a & vbCr & h
End Sub

というのを試してみて、ほぼaもhも同じ形で戻ってきたので、
最初の、イメージを動かすプログラムも、

  Dim r As Long
  Dim t As Double
  
  t = Now()
    
  For r = 1 To 15
     ’(処理省略)
     t = t + 0.0000015
    Application.Wait t
    
  Next r

で試してみました。
そしたら、ほぼ「t=[Now()]」でしたときと同じように動きました。
ただ、最初だけほんの少し飛ぶみたいな動きになってしまいました。
「t=[Now()]」だとすんなり滑り出すように動くのに・・・
同じようでいて、やっぱり違うんかな・・・

なんだか色々試してる内に、ごっちゃになってきそうになりました(^^;
でも、だいぶわかってきたかな?
どうもありがとうございました(^^)

【15079】Re:変数 = [Now()]・・・って
発言  クウガ WEB  - 04/6/15(火) 11:31 -

引用なし
パスワード
   つん さん、ichinose さん、こんにちは。
出遅れました・・・
[Now()] こんな方法もあったんですね。
私も、ちょっと感動です。
ichinoseさんのサンプルを見て、データの型の大切さを実感しました。

>最初だけほんの少し飛ぶみたいな動きになってしまいました。

これはPCの処理能力の問題だと思っていました。
会社のPCはスペックが低いので・・・
(【15018】は会社で仕事をしているふりして作っていたものです。)
ですので、+0.0000015 は、会社のPCの限界だと思っていました。
+0.000001以下でも可能なのか、自宅で試して見ます。

又この続きは、石鹸箱に!(つんさん、ちゃんとお返事しますからね。)

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