ミスチルの大名曲の数々が配信決定!! 31日間無料!!【PR】

初心者ですが、宜しくお願いします。

Application.OnTime EarliestTime:=TimeValue(time_ptn), Procedure:="my_func"

上記コードの、末尾のプロシージャの指定において、

Dim prm1 As String, prm2 As Long

Function my_func(prm1,prm2)
   ~内容~
End Function

または、

Sub my_func(prm1,prm2)
   ~内容~
End Sub

というプロシージャを指定したいのですが、
末尾の書き方が分からず困っております。

「Procedure:="my_func(prm1,prm2)"」
「Procedure:= my_func(prm1,prm2)」

のようにやっても、うまくいきません。
正しい書き方をどなたか教えて下さい。

A 回答 (5件)

Option Explicit



Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  'MsgBox x
  'Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:=x
  
End Sub

Sub my_func(prm1 As String, prm2 As Long, prm3 As Long)
  MsgBox prm1 & prm2 & prm3
End Sub
    • good
    • 1
この回答へのお礼

レスポンスが大変遅くなり、申し訳ございませんでした。
早速、試させて頂きました所、うまくいきました。
ありがとうございます。

ちなみに、
Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"

の箇所における、「_Procedure:="」の部分にあります、先頭のアンダーバーは、
これは何でしょうか?

このアンダーバー無しで試して上手くいきましたので、これは無視していますが、
何か意味のある記号なのでしょうか。
もしよろしければ、また教えて下さい。

近々、締め切らせて頂くつもりです。
その際には、ベストアンサーとさせて頂きます!

お礼日時:2010/04/28 12:53

VisualBasicEditorでの作法みたいなものです。


基本、コードは1ステップを1行で記述します。
右に長くなりすぎると見にくいですよね。
適宜折り返して可読性を良くします。
http://www.accessclub.jp/actips/tips_108.htm
    • good
    • 0
この回答へのお礼

なるほど、よく分かりました。
この度は終始、丁寧に回答下さり、誠にありがとうございました。
とても助かりました!

お礼日時:2010/04/28 23:29

先のアドバイスコードをそのままコピーペーストしてもらえればいいんですけど。


新規Book、新規標準モジュールで試して、どうなのか教えてください。


MsgBox "a"
ってやると『a』と表示されますよね。
VBAで『"』で囲むと文字列とみなされます。
では『"』をMsgBoxで表示させたい場合はどうするか。

MsgBox """"

外側の『"』2つは、中の文字を文字列として扱うために囲ったものです。
中の『"』2つでMsgBoxの結果『"』を表示します。
ダブルクォートを2つ重ねる事で『"』を表現します。

今回、引数Procedure:=に設定したいプロシージャ名の文字列は

'my_func "a",1'

です。

MsgBoxで文字列として表示させる場合
MsgBox "'my_func ""a"",1'"

シングルクォート
my_func
半角スペース
ダブルクォート
ダブルクォート
a
ダブルクォート
ダブルクォート
カンマ
1
シングルクォート

と記述しなければいけません。

まずは単純なもので確認するなら
Sub test()
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func 1'"
End Sub

Sub my_func(prm As Long)
  MsgBox prm
End Sub
こんな感じのものからやってみてください。
    • good
    • 0
この回答へのお礼

再度、分かりやすく教えて頂き、ありがとうございます。
教えて頂いたコードをテストし、そのコードに問題がないことが確認できました。

しかし、私の問題は依然として解決していません。
なぜかと言いますと、
プロシージャの引数に渡したいものは、「変数(prm)」なのです。

1とか"a"という、具体的な数値や文字列ではないので、
それが原因でうまくいかないようです。

つまり、
Procedure:="'my_func 1'"  :○(うまくいく)

Procedure:="'my_func prm'"  :×(うまくいかない)

とすると、プロシージャが見つかりません、とアラートが出ます。
(prm は変数です。prm = "この変数を渡したい" とでもしておきましょうか。)

変数を引数として渡す場合の記述方法はまた違ったものになりそうですね?
もし、お分かりでしたら、教えて頂けると助かります。
ちなみに、引数に渡したい変数の数は、3つあります。
(当初2つでしたが、3つになりました)
型としては、string、long、それぞれ1つは含む可能性があります。

以上、宜しくお願い致します。

お礼日時:2010/04/16 05:23

Sub test()


  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func ""a"",1'"
End Sub

Sub my_func(prm1 As String, prm2 As Long)
  MsgBox prm1 & prm2
End Sub
こんな感じでスペースで区切って引数を渡し、シングルクォートでプロシージャ文字列を括ります。

でも
>Dim prm1 As String, prm2 As Long
>
>Function my_func(prm1,prm2)
>:
という書き方から推測すると、グローバル変数を利用する事を想定しているのでしょうか。

Option Explicit
Dim prm1 As String
Dim prm2 As Long

Sub test2()
  prm1 = "a"
  prm2 = 1
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="my_func2"
End Sub

Sub my_func2()
  MsgBox prm1 & prm2
End Sub

この回答への補足

「お礼」を書かせて頂いた後、実際に試してみましたところ、

「マクロ"~~ファイルの存在場所~~ my_func "a",1" が見つかりません」
というようなアラートが出ました。

教えて頂いた記述の、シングルorダブルクォートが、とても繁雑であるため、
本当に、これで良いのだろうかとも思ってしまっているのですが、
教えて頂いたアドバイスの記述には、問題はないでしょうか?

ちなみに、もし宜しければですが、
ここで教えて頂いているクォートの意味、について、
分解して教えて頂けると大変助かります。
またよろしければ、教えて下さい。

補足日時:2010/04/15 23:36
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます

> Procedure:="'my_func ""a"",1'"
> こんな感じでスペースで区切って引数を渡し、シングルクォートでプロシージャ文字列を括ります。

そういった方法があるのですね!
まだ試していませんが、早速試してみたいと思います。
試しましたら、改めて、こちらにてご連絡致します。

> という書き方から推測すると、グローバル変数を利用する事を想定しているのでしょうか。

いえ、グローバル変数を利用しようという考えは、今のところありませんが、
本件の解決にあたり、必要とあれば、使うかもしれません。
ただ、本件とは関係のない所における、グローバル変数の使用というのは、ない、と考えて頂いて結構です。

では、早速、教えて頂いた記述方法を試してみますね。

お礼日時:2010/04/15 23:23

タイムアウトルーチン(my_func)は引数なしプロシジャーなので無理でしょう。


何らかの値を渡したいのであれば、グローバル変数で渡すのが普通です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

「引数なしのプロシージャ」ということを知らずに使っておりました。
グローバル変数で対処する方法を検討してみます。
どうもありがとうございました。

お礼日時:2010/04/15 23:15

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

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

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

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

QApplication.OnTimeで引数付き関数を呼び出したい

Application.OnTimeで引数付き関数を呼び出したいのですが、可能でしょうか?
例を挙げると、

  Sub Procedure1 (index as integer)
      MsgBox index
  End Sub

を、呼び出してみたいです。
詳しい方、よろしくお願いいたします。

Aベストアンサー

こんなのはどうでしょうか?
Application.OnTime Now + TimeValue("00:00:02"), "'Procedure1(100)'"
Application.OnTime Now + TimeValue("00:00:03"), "'Procedure1(200)'"

QエクセルVBAにおけるON TIMEメソッドの解除方法について

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマンドボタンがついているフォームを表示する

End Sub

マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。
変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。
以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。
マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか?
また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマ...続きを読む

Aベストアンサー

>ON TIMEメソッドを解除
OnTimeのヘルプはごらんになられましたか?
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Schedule にfalseを設定することで、直前の実行指定を解除することができます。
具体的には
Application.OnTime timekp + TimeValue("1:00:00"),"endform",,false
とでもすればいいです。

Qエクセルで定期的(30分おき)にマクロを実行させる方法は?

エクセルにて刻一刻変る外部データ(株価)を表示させています。それを自動で30分置きにデータ蓄積させる方法はありませんか?

現在は自分で作ったキーボードマクロで 時計を見ながらボタンを押し、データを取り込ん出る始末です。

その簡単マクロに「30分置きに実行させる」と云う記述を付け足す程度で自動実行させる事は可能でしょうか? 
当方キーボードマクロでの自動書き込みしか出来ない素人ですが、少々複雑な物であっても頑張ってみるつもりですので、どなたかご教授下さい。

Aベストアンサー

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、

 ・ブッククローズをトラップした
 ・進捗状況をステータスバーに表示するようにした
 ・その他しょうもないこと

です。

このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。


Option Explicit

Dim mcolTask As Collection

Sub 実行予約()

  Dim i      As Date
  Dim strProcName As String
  Dim datBigin  As Date
  Dim datEnd   As Date
  Dim datInterval As Date
  Dim datTimeout As Date
  Dim blnJustTime As Boolean

  ' Setting-------------------------------------------------------

  datBigin = TimeValue("10:00:00")  ' 開始時刻
  datEnd = TimeValue("18:00:00")   ' 終了時刻
  datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
  datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
  blnJustTime = True         ' datInterval で丸めるか
  strProcName = "MACRO1"       ' 実行するマクロ名

  '---------------------------------------------------------------

  ' 既に実行予約されているか確認
  If mcolTask Is Nothing Then

    ' 日付シリアル値を加算
    datBigin = datBigin + Date
    datEnd = datEnd + Date
    ' 終了時刻が開始時刻より小さければ日をまたぐので補正
    If datEnd < datBigin Then datEnd = datEnd + 1
    ' 現在時刻が既に終了時刻を過ぎている場合
    If datEnd < Now() Then
      MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
      Exit Sub
    End If
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin < Now() Then
      ' 開始時刻を datInterval で指定された値で丸めるか
      If blnJustTime Then
        datBigin = Application.Floor(Now() + datInterval, datInterval)
      Else
        datBigin = Now() + datInterval
      End If
    End If

    ' 初期化
    Set mcolTask = New Collection

    ' メイン部分
    For i = datBigin To datEnd Step datInterval
      ' 後から取り消せるようにコレクションに退避
      mcolTask.Add CStr(i) & "," & strProcName
      ' Application.Ontime で実行予約を行う
      Application.OnTime EarliestTime:=i, _
                Procedure:=strProcName, _
                LatestTime:=i + datTimeout, _
                Schedule:=True
    Next i
  Else
    MsgBox "既に実行中です", vbInformation
  End If

End Sub

Sub 未実行予約強制解除()
 
  Dim i  As Long
  Dim vntS As Variant
 
  On Error Resume Next
  Application.StatusBar = "タスク破棄中... "
  For i = 1 To mcolTask.Count
    vntS = Split(mcolTask.Item(i), ",")
    Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
  Next i
  Application.StatusBar = ""
  Set mcolTask = Nothing

End Sub

' タスク管理用
Private Sub RemoveTask()
  
  On Error Resume Next
  mcolTask.Remove (1)
  Application.StatusBar = "待機中のタスク... " & mcolTask.Count
  DoEvents
  Beep
  If mcolTask.Count = 0 Then
    Application.StatusBar = ""
    Set mcolTask = Nothing
  End If

End Sub

Sub Auto_Close()

  Dim intRes As Integer
  If Not mcolTask Is Nothing Then
    intRes = MsgBox( _
        Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
           & "破棄して終了しますか?", _
        Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
        Title:="問い合わせ")
    If intRes = vbOK Then
      Call 未実行予約強制解除
    Else
      ' ブッククローズをキャンセル
      Application.ExecuteExcel4Macro ("Halt(True)")
    End If
  End If

End Sub

' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()

  Dim lngRow As Long
  With ThisWorkbook.Sheets("Sheet1")
    lngRow = .Range("V65536").End(xlUp).Offset(1).Row
    .Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
    .Cells(lngRow, "Y").Value = Now()
  End With

  ' ご自分のマクロの最後に次の一行を追加しておいて下さい
  Call RemoveTask

End Sub

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QExcel VBAにて2つの処理を同時実行可能?

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.Label1.Visible = True Then
Form2.Label1.Visible = False
Else
Form2.Label1.Visible = True
End If

Form2.Repaint

DoEvents

Application.OnTime Now + TimeValue("00:00:01"), "Blink"

End Sub


これを実行すると、メイン処理が終了した後にForm2内の文字が
点滅します。

実現したいのは「使用者が動いていることを(ハングアップしていない
ことを)確認出来る」という点です。

どうぞ よろしくお願いします。

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.L...続きを読む

Aベストアンサー

単純に、HTMLファイルを表示するとかいうのではだめでしょうか?VBAに影響を与えることなくブラウザ側が勝手にやってくれるので、負荷は少ないように思うのですが。
的を外した回答でしたらすみません。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QVBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。

マクロを含むエクセル(EXCEL2000)をHTMLのページからハイパーリンクで呼び出しています。そのエクセルでボタン操作に従い罫線やセルの着色を行っています。しかし、着色結果が更新されません。スクロールバー等で画面を移動すると正しく着色されています。このエクセルを通常に起動した場合は、問題なく動作するのですが、シート全体を更新する方法を教えて下さい。
各関数では、以下のスクリーンアップデータの処理を入れています。
Application.ScreenUpdating = False
    (処理)
Application.ScreenUpdating = False

Aベストアンサー

たぶん、EXCEL独特の問題だと思うのですが、HTML の場合、すでに色の部分を表面上で使用しているので、それでメモリが占有させているのではないかと私は思っています。

他にも、

 ActiveWorkbook.HTMLProject.RefreshDocument True

というのがありますね。
ホスト アプリケーション内のブックに含まれる HTML プロジェクトを更新する、というのがありますね。


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

人気Q&Aランキング