プロが教えるわが家の防犯対策術!

MS-EXCEL2010 VBAで或るプロシージャの呼び出し元が、プロシージャかボタン操作か、また、プロシージャならプロシージャ名、ボタン操作ならボタン名を呼び出されたプロシージャ内で知る方法は有るのでしょうか。

if文で操作を変えたいのです。よろしくお願いします。

A 回答 (4件)

べたな方法ですが


Sub msgTest(Optional ByVal myCaller As String = "NA")
MsgBox caller
End Sub

call msgtest → NA
call msgtest("are") → are
のように呼び出し元で渡してあげるとか・・・。
    • good
    • 0
この回答へのお礼

ありがとうございます。色々試しましたが、この方法が1番手間はかかりますが、1番確実なようです。

ただ、この方法だと、VBEで呼び出される方に直接ステップインしようとしても出来ません。出来ればステップインを使い、デバッグをしたいのですが、何か好い方法はあるでしょうか?

お礼日時:2012/08/18 16:41

ExcelVBAには,呼び出し元のプロシジャを遡る機能はありません。

ボタン操作かどうかを調べる事なら出来ます。

作成例:
sub macro1()
 if typename(application.caller) = "String" then
 msgbox "from button " & application.caller
 else
 msgbox "from other proc"
 end if
end sub
    • good
    • 1

呼び出し元プロシージャ名を取得する


http://homepage1.nifty.com/rucio/main/dotnet/Sam …
    • good
    • 0
この回答へのお礼

ありがとうございます。

ご指摘のページを見てみました。しかし、どうやら僕が使っているExcel2010では使えないようです。わざわざ教えて下さって、ありがとうございます。

お礼日時:2012/08/15 13:34

ボタンを押したときのイベントに何と書いてありますか?


(ボタンを押したときに、何らかのプロシージャーが起動されているのでは?)
    • good
    • 0

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

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

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

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

QExcelのマクロの呼び出し元を知りたい

お世話になります。

以下の問題の探し方を教えてください。

自分で作成したものでない(作成者は社内にいない)
30前後のシートが入っているエクセルファイルがあります。
そういうファイル(群)を解析しています。

あるマクロのメソッド「商品検索」というものが書かれているとします。
ぱっと見では使われていないような感じもします。
しかし厳密にしたいので、そのメソッドがどこで(どのシート、どのボタン等)呼ばれているか、
を調べたいのですが、うまい方法はありませんでしょうか。

このエクセルファイル群は、初めに使えそうなエクセルファイルから
始まり、様々な方がその基本となったエクセルを元にして、
いろいろ修正、追加、削除しながら分派、育っていったファイルらしく、
数年の経てそれぞれ目的が違うファイルに仕上がってます。
その数が数だけにモジュールの中にあるメソッドが「使われているか」を手早く知りたいのです。
ですので、一つ一つ右クリックで調べる以外の方法を探しています。

手段でもツールの使用でもかまいません。
どなたか教えていただけませんでしょうか。

お世話になります。

以下の問題の探し方を教えてください。

自分で作成したものでない(作成者は社内にいない)
30前後のシートが入っているエクセルファイルがあります。
そういうファイル(群)を解析しています。

あるマクロのメソッド「商品検索」というものが書かれているとします。
ぱっと見では使われていないような感じもします。
しかし厳密にしたいので、そのメソッドがどこで(どのシート、どのボタン等)呼ばれているか、
を調べたいのですが、うまい方法はありませんでしょうか。

...続きを読む

Aベストアンサー

こういうのはどうでしょうか?
各シートに配置されたボタン等のオブジェクトを検索し、それにマクロが登録されていればシート名、オブジェクト名およびマクロ名を新しいワークシート(一番右端に生成します)にリストアップするマクロです。(マクロが登録されていないオブジェクトはリストに入れません。)

Sub test01()
Set ns = Sheets.Add(After:=Sheets(Sheets.Count))
For Each st In Worksheets
st.Activate
For Each obj In ActiveSheet.DrawingObjects
If obj.OnAction <> "" Then
i = i + 1
With ns
.Cells(i, "A") = ActiveSheet.Name
.Cells(i, "B") = obj.Name
.Cells(i, "C") = obj.OnAction
End With
End If
Next
Next
Set ns = Nothing
End Sub

こういうのはどうでしょうか?
各シートに配置されたボタン等のオブジェクトを検索し、それにマクロが登録されていればシート名、オブジェクト名およびマクロ名を新しいワークシート(一番右端に生成します)にリストアップするマクロです。(マクロが登録されていないオブジェクトはリストに入れません。)

Sub test01()
Set ns = Sheets.Add(After:=Sheets(Sheets.Count))
For Each st In Worksheets
st.Activate
For Each obj In ActiveSheet.DrawingObjects
If obj.OnAction <> "" Then
i = i + 1
Wi...続きを読む

QExcel VBA でFunctionプロシジャがどのセルから呼び出されたか知る方法

Excel VBA で御教授いただきたいのですが、

ExcelのセルからFunctionプロシジャを呼び出し、その戻り値を呼び出しもとのセルに返す。
この時その戻り値によって、セルの属性を変化(例えば色替えなど)を、行いたいものです。
セル属性の変更の方法はわかるのですが、Functionプロシジャがどのセルから呼ばれたかが不明のため、どのセルに対して属性変更を行ってよいかがわからず困っています。

Functionプロシジャ中で、Functionプロシジャがどのセルから呼ばれたか知る方法をご存知の方がいらっしゃいましたら御教授御願いします。

OS:Windows2000 Excel:2000 です。

Aベストアンサー

Application.Callerの.Row、.Column、.Worksheet.Nameで取得できます。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

Qプロシージャ名の取得

教えてください。
VBで現在実行しているプロシージャ名を取得指定のですがkのようなことは可能ですか?
可能ならばどのようにすればいいか教えてください。

現在実行ファイルにて起動しているのですが、どこかで「実行エラー」が発生しています。
この実行エラーの場所の特定のために、現在起動中のプロシージャ名をログに保存しようかと考えています。
また、その他このようなエラー箇所特定方法などがありましたら教えてください。
環境:VB6.0  Win2000

Aベストアンサー

残念ながら出来ません。

私のプロジェクトでは全てのプロシージャに On Error コーディングをして、そこでログにどのプロシージャかを書いてました。

そういう方法しかないと思います。

QVBA プロシージャの名前の取得

プロシージャ名を取得できないかなと考えています。
・Form_Openプロシージャ内で「Form_Open」という文字を取得
・フォーム上に「新規登録」というボタンを作成、クリックした時にできる「新規登録_Click」プロシージャ内で「新規登録_Click」という文字を取得
不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが、非効率と考え、やりたくありません。
できればバージョンは2000以降で、ExcelでもAccessでも構いません。
可能かどうかだけでも教えてください。

Aベストアンサー

>不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが

何がしたいのか全く解りませんが、”プロシージャ名取得”の関連情報のリンクだけ紹介しておきます。


http://oshiete1.goo.ne.jp/qa1219426.html
http://park7.wakwak.com/cgi-bin/sbox/~efc21/exqalounge.cgi?print+200905/09050016.txt
http://www.officetanaka.net/excel/vba/vbe/05.htm
http://support.microsoft.com/kb/410621/ja

http://search.goo.ne.jp/web.jsp?dummy=%F3%FE%F3%FE%F3%FE&status=select&from=goo_oshiete&PT=goo_oshiete&nsMT=&MT=vba+%A5%D7%A5%ED%A5%B7%A1%BC%A5%B8%A5%E3%CC%BE+%BC%E8%C6%C0&c=0

>不可能な場合、各プロシージャに「Form_Open」や「新規登録_Click」をベタ書きしようと考えていますが

何がしたいのか全く解りませんが、”プロシージャ名取得”の関連情報のリンクだけ紹介しておきます。


http://oshiete1.goo.ne.jp/qa1219426.html
http://park7.wakwak.com/cgi-bin/sbox/~efc21/exqalounge.cgi?print+200905/09050016.txt
http://www.officetanaka.net/excel/vba/vbe/05.htm
http://support.microsoft.com/kb/410621/ja

http://search.goo.ne.jp/web.jsp?dummy=%F3%FE%F3%FE%F3%F...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

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

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

Aベストアンサー

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

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

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

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
...続きを読む

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


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

人気Q&Aランキング