ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュのスピーチ時間管理ツール

  • mixiチェック
  • このエントリーをはてなブックマークに追加
エクセルで1分間スピーチの管理ツールを作成したいのですが、ストップウォッチが
エラーで動かなくて困っています。エラー解決のヒントが頂ければうれしいです。

カメラ1の様な1分間スピーチの管理ツールを作るべく作業を始めました。
↓このページ情報をたよりに、先ずはストップウォッチを作ろうと
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=64853;id=excel
カメラ2と以下のプログラムを書きましたが、
Dim old_time As DateTime の行で
コンパイルエラー:
このオートメーション タイプはVisual Basic ではサポートされていません。
が出て動きません。
Dim old_time As time にしたり、ググってみたのですが解決できません。
解決のアドバイスを頂けると助かります。よろしくお願いします。

Excel2007、Windows7 64bitです。

Dim stop_ev As Boolean
Dim old_time As DateTime

Sub ボタン1_Click()
  stop_ev = False
  old_time = Now()
  Range("a1").NumberFormatLocal = "mm:ss"
  Do Until stop_ev = True
    Range("a1").Value = [now() - old_time]
    DoEvents
  Loop
End Sub

Sub ボタン2_Click()
  stop_ev = True
End Sub

コメント(23)

今実際にExcelで試していないので、どうか分かりませんが
変数の型に"DateTime"はなかったのような気がします
とりあえず、Now関数で返る値の型は何かを考えて
old_time変数の型を変えてみるとか
あと、[] はいらない気がします
よくよく見ると、Now()になっていますね
ワークシート関数のNOW関数を使おうとしているのでしょうか?
角括弧[]はEvaluateメソッドの省略形ですから、使うのであれば
[Now()] - old_time
などというようにすれば良いと思います
>マリ男さん
早急なアドバイスありがとうございます。

Dim old_time As Date で正しく動くようになりました。ありがとうございました。

早速、a1セルに =now() とタイプし返る値を見てみました。
2010/5/1 23:32 と表示されました。

次に、VBAの方で
Dim old_time As までタイプすると自動的に表示されるキーワードなかで Date というの
がありましたので、それを選びました。
Dim old_time As Date でエラー表示が消え、正常に動く様になりました。ありがとうご
ざいました。
制作が次のステップへ進めます。

[]は取り除きました。
何度も助けを求めて申し訳ありません。
ヘルプを見たり、ググってみたのですが解決に至りません。

UserForm1にスピーチ時間を表示するプログラムを以下の様に作成しましたが
Me.Label1.Caption = [text(now() - old_time,"mm:ss")] の行で
実行時エラー'13':
型が一致しません。
のエラーが発生し動きません。

日時データのハンドリングはホント手強いですね。
解決のヒントを頂けると助かります。

Me.Label1.Caption = Now()
だと写真1の様に動きました。
Me.Label1.Caption = [text(now(),"mm:ss")]
も写真2の様に動きました。
Me.Label1.Caption = [text(now() - old_time,"mm:ss")]
が動かないんです。アドバイスよろしくお願いします。

Dim stop_ev As Boolean
Dim old_time As Date

Private Sub CommandButton1_Click()
  stop_ev = False
  old_time = Now()
  Do Until stop_ev = True
    Me.Label1.Caption = [text(now() - old_time,"mm:ss")]
    DoEvents
  Loop
End Sub

Private Sub CommandButton2_Click()
  stop_ev = True
End Sub
> 5 いさおさん
| Me.Label1.Caption = [text(now() - old_time,"mm:ss")] の行で
Me.Label1.Caption = format(now() - old_time,"mm:ss") にしてみてください。
まず、Evaluateが何かわかって使っているのでしょうか?

>6でAmlaidさんが仰っていますがFormat関数を使用すれば
面倒なく出来ると思います

ワークシート関数であるTEXT関数を使用し
text(now() - old_time,"mm:ss")
という式を使いたいのであれば
Evaluateを省略せずに

Dim stop_ev As Boolean
Dim old_time As Double
Private Sub CommandButton1_Click()
stop_ev = False
old_time = [Now()]
Do Until stop_ev = True
  Me.Label1.Caption = Evaluate("text(" & [Now()] - old_time & "," & """mm:ss""" & ")")
  DoEvents
Loop
End Sub
Dim stop_ev As Boolean
Dim old_time As Double
Private Sub CommandButton1_Click()
stop_ev = False
old_time = [Now()]
Do Until stop_ev = True
  Me.Label1.Caption = Application.WorksheetFunction.Text([Now()] - old_time, "mm:ss")
  DoEvents
Loop
End Sub
>7の Evaluate("text(" & [Now()] - old_time & "," & """mm:ss""" & ")") は
Evaluate("text(" & [Now()] - old_time & ",""mm:ss"")")
でもいけると思います
>Amlaidさん
>マリ男さん
早急なアドバイスありがとうございます。

先ず、old_time をDouble型に定義変更しました。
Dim old_time As Double

次に
Me.Label1.Caption = Format(Now() - old_time, "mm:ss")
にしたら、写真1の様に「12:01」からカウントが始まってしまいます。
(意味不明???)
次に
Me.Label1.Caption = Format(Now() - old_time, "hh:mm:ss")
にしたら、写真2の様に「00:00:01」と正常なカウント表示になります???

次に
Me.Label1.Caption = Evaluate("text(" & [Now()] - old_time & ",""mm:ss"")")
にしたら、写真3の様に希望通りの「スピーチ時間表示タイマ」が動く様になりました。
皆様、ありがとうございました。
>>7 マリ男さん
> まず、Evaluateが何かわかって使っているのでしょうか?
わかってないと思います。
↓Evaluateメソッド:文字列を式に変換する
http://www.nurs.or.jp/~ppoy/access/excel/xlM046.html
ピンと来ていないと思います。

Now()に代表される様にエクセル関数とVBA関数の分別も全然出来ていない事がそもそも
の大きな問題ではないかと感じ始めました。
そもそもエクセル関数のNow()を使って本件のプログラムを作ろうとしている所に
グチャグチャになっている原因があるのでは?と感じる様になっています。
本件は本来ならどのようにプログラムして行くのが本筋なのでしょうか?
どちら様かアドバイス頂けるとうれしいです。
Format関数を使うのであれば、以下で出来ると思います

Dim stop_ev As Boolean
Dim old_time As Date
Private Sub CommandButton1_Click()
stop_ev = False
old_time = Now
Do Until stop_ev = True
  Me.Label1.Caption = Format(Now - old_time, "nn:ss")
  DoEvents
Loop
End Sub
> 11 いさおさん
スタート地点の確認として。
VBAの他にどんな言語を経験していますか?
>>12 マリ男さん
早急なアドバイスありがとうございます。

以下のコードでFormat文が写真1の様に正しく動きました。
"mm:ss"ではなく"nn:ss"がポイントもわかりました。

(以下、正しく動いたコード)
Dim stop_ev As Boolean
Dim old_time As Date

Private Sub CommandButton1_Click()
  stop_ev = False
  old_time = Now
  Do Until stop_ev = True
    Me.Label1.Caption = Format(Now - old_time, "nn:ss")
    DoEvents
  Loop
End Sub

Private Sub CommandButton2_Click()
  stop_ev = True
End Sub
>>16 Amlaidさん
> VBAの他にどんな言語を経験していますか?

趣味で、ASP.NET(VB)を少々、PHP言語、C言語です。
> 18 いさおさん 
それなりに言語を囓っている様ですが、型についての認識はどうですか?
今回であれば、 old_time について明確な根拠も無く(私にはそう見える)、何度か型を変えていますよね。


old_time へ (VBAの)Now関数 で値を格納するとします。
ヘルプを引用します。

 Now 関数
 コンピュータのシステムの日付と時刻の設定に基づいて、
 現在の日付と時刻を表すバリアント型 (内部処理形式 Date の Variant) の値を返します。

ここから、Now関数の戻り値は Variant(Date) である事が分かります。
従って、 old_time の型は Date にしなければなりません。
 (Variant は「何でもあり」 の型なので、
  場合によって型が定まらない場合に限って使う様に心掛けてください)

こんな感じで型を決めていきます。


--
| Now()に代表される様にエクセル関数とVBA関数の分別も全然出来ていない事がそもそも
| の大きな問題ではないかと感じ始めました。
大概の事はVBA関数でできます。
求める機能がVBA関数に無くワークシート関数に用意されている時のみ、用いる癖を付ければ良いと思います。

ですので、今回は Now関数とFormat関数 を使う方が適当です。


--
今回の例に限らず、同じ目的を複数の手段で実現できる為、選択を迷う事はままあります。
この辺は蓄積が必要ですので、使いながら吸収していけば良いと思います。
>>19 Amlaidさん
詳しい解説ありがとうございます。勉強になります。
今まで日時データのハンドリングは思った様にならず、半分あきらめてました。
今回ご指導頂きヘルプの見方も少しわかりました。
Now関数より自分のニーズに合っているTime関数と言うのを見付けました。
今後はTime関数を使って行こうと考えてます。

> | Now()に代表される様にエクセル関数とVBA関数の分別も全然出来ていない事がそもそも
> | の大きな問題ではないかと感じ始めました。
> 大概の事はVBA関数でできます。
> 求める機能がVBA関数に無くワークシート関数に用意されている時のみ、用いる癖を付け
> れば良いと思います。
>
> ですので、今回は Now関数とFormat関数 を使う方が適当です。

Format関数についても調べてみました。
http://www.red.oit-net.jp/tatsuya/vb/date.htm

NowとNow()と言うVBA関数とワークシート関数というのがある事を今回体験できました。
今回の自分のニーズはVBA関数を使うのが良い事がわかりました。
少し問題解決の方法のスキルが上がったかなと感じました。ありがとうございました。
スピーチ管理ツールの作成を進めていて
アクティブセルの左のセルの値を取得する方法がわからなくて困っております。
アドバイスを頂けると助かります。

スピーチ管理表への時刻の入力を以下のプログラムで行える様にしました。
スピーチの進行が遅れているのか?進んでいるのか?の遅進時間をC2セルに表示するため
Range("c2").Value = 「アクティブセルの左セルの値」- Time()
の様にプログラムを書きたいのですが
「アクティブセルの左セルの値」を取得する書き方がわかりません。
アドバイスよろしくお願いします。

Private Sub CommandButton1_Click()
  ActiveCell.FormulaR1C1 = Time() 'アクティブセルに開始時刻を入力
  ActiveCell.Offset(0, 1).Range("A1").Select '時刻入力後、ActiveCellを右に移動
  Range("c2").Value = 「アクティブセルの左セルの値」- Time() '予定からの遅れ・進み時間を表示
  '「スピーチ開始」「スピーチ終了」ボタンの Enable制御
  CommandButton1.Enabled = False
  CommandButton2.Enabled = True
  CommandButton2.SetFocus 'focusをボタン2へ移動
End Sub

Private Sub CommandButton2_Click()
  ActiveCell.FormulaR1C1 = Time() 'アクティブセルに終了時刻を入力
  ActiveCell.Offset(1, -1).Range("A1").Select '時刻入力後、ActiveCellを右に移動
  '「スピーチ開始」「スピーチ終了」ボタンの Enable制御
  CommandButton1.Enabled = True
  CommandButton2.Enabled = False
  CommandButton1.SetFocus 'focusをボタン1へ移動
End Sub
>21
例えば
Sub Macro1()
MsgBox ActiveCell.Offset(0, -1).Value
End Sub
Sub Macro2()
MsgBox Cells(ActiveCell.Row, ActiveCell.Column - 1).Value
End Sub
>>22 マリ男さん
 いつも的確なアドバイスに感謝します。

 以下のプログラムで、アクティブセルの左のセルの値が取得でき、予定からの遅れ・進み
の時間をC2セルに表示出来る様になりました。
 ありがとうございました。

Private Sub CommandButton1_Click()
  ActiveCell.FormulaR1C1 = Time() 'アクティブセルに開始時刻を入力
  '予定からの遅れ・進み時間を表示
  If (Time() < ActiveCell.Offset(0, -1).Value) Then
    '予定より進んでいる場合
    Range("c2").Value = ActiveCell.Offset(0, -1).Value - Time()
  Else
    '予定より遅れている場合
    Range("c2").Value = Time() - ActiveCell.Offset(0, -1).Value
  End If
  ActiveCell.Offset(0, 1).Range("A1").Select '時刻入力後、ActiveCellを右に移動
  '「スピーチ開始」「スピーチ終了」ボタンの Enable制御
  CommandButton1.Enabled = False
  CommandButton2.Enabled = True
  CommandButton2.SetFocus 'focusをボタン2へ移動
End Sub

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。