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

こんにちは。
ACCESS 97 を独学で学んでいます。
初歩の初歩だと思うんですが、教えてください。
マクロ作成の例題で、電卓を起動するというのがありました。

アプリケーションの実行-電卓を開く
コマンドライン-CALC.EXE

とし、保存して閉じて、実行すると電卓が起動します。
そのマクロを、
ツール-マクロ-マクロをVBに変換
とすると、下記のようにモジュールに変換されます。

Option Compare Database
Option Explicit
'-------------------------------------------------
' マクロ1
'-------------------------------------------------
Function マクロ1()
Call Shell("CALC.EXE", 1)
End Function

このモジュールを「デザイン」で開いて、「開始」等で実行することは出来ますが、開いていないときには「実行」ボタンがグレイアウトしています。
閉じた状態で「実行」するのって、どうするんですか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

こんばんは。



先ず、少し用語の説明です。
プロシージャ:実行単位。Sub ~ End Sub または Function ~ End Function がプロシージャです。
モジュール:保存するときの単位。保存するときにモジュール1とか名前を付けられますよね。
実行はモジュールではなくプロシージャであることを注意してくださいね。

で、実行方法ですが・・・

1.マクロの「プロシージャの実行」アクションで指定(Function 限定)

2.メニューまたはツールバーのボタンとして登録し実行(Function 限定)

3.イベントで実行
  例えばコマンドボタンの「クリック時」イベントのボックスに
  =マクロ1()
  と記述します。これは Function の記述です。Sub ではこのような指定は出来ません。

4.他のプロシージャから呼び出して実行
  他のプロシージャのコードの中に
  マクロ1
  と記述します。
  Function なので本来は
  変数名 = マクロ1()
  と書くべきなのですが、今回は最初の記述でOKです。
    • good
    • 0
この回答へのお礼

やっと少し見えました。
ああそうか、という感じです。
たしかにEXCEL のVBE も、実行ボタンのようなものを作って貼り付けてやらないと、自分以外の人には使いにくいものですもんね。
マクロで、プロシージャの実行-マクロ1()として、結果を見ることができました。

ところでせっかく書いてくれていますが、SUB とFUNCTION のちがいがわかりません(>_<)
VBE はずっとSUB で作成してきました。
ACCESS で「マクロの変換」をして、できるモジュールはFUNCTION なんですね(?_?)

また指導をお願いすることもあると思います、本当にありがとうございました。

お礼日時:2006/03/06 10:18

こんにちは。

#2 のWendy02です。

すでに、ご説明があるので、重複しますが、私からひとこと。

>モジュールタブの画面の「実行」ボタンが実行できるようになることはない、ということですね。

そういうことじゃないです。フォームのボタンからクリック時のイベントを設定すればよいのであって、それは、マニュアルなどに載っているはずです。

Access のFunction は、関数として呼び出してあげれば、動きます。プロシージャと関数の本質的な違いは、ここではないはずです。
    • good
    • 0
この回答へのお礼

> マニュアルなどに載っているはずです。

たしかにそんな表記を、どっかのマニュアルで見たような気がします(いまデスクに山積み)。
今はちょっと、しなければならないことと外れているので、知識の片隅に留め置かせていただきます。
何度もありがとうございました。

お礼日時:2006/03/08 15:11

こんにちは。


#3 の GreatDragon です。

> SUB とFUNCTION のちがいがわかりません(>_<)

Sub プロシージャは、記述したステートメントを実行するだけのシンプルなプロシージャっです。

Function は、何らかの値を返すことが出来るプロシージャです。何でも構わないので関数を
思い浮かべてください。関数は何らかの計算などを実行してその結果を返してくれますよね。
Function は俗に「ユーザー定義関数」と呼ばれています。


上記は一般的な説明ですが、下記は Access のテクニック的な説明です。


恐らく?な箇所があると思います。ご質問のプロシージャは Function ですが、値を返す記述が
ありません。で、回答の #3 の 3 をご覧ください。

Function ですと、イベントのボックスにプロシージャ名を記述できます。こうすることにより
複数のコントロールのイベントに共通のプロシージャとして記述できます。Sub だと夫々のコントロール
に個別にプロシージャを記述する必要があります。


このような説明でお分かりいただけたでしょうか?
    • good
    • 0
この回答へのお礼

ご丁寧に何度も、ありがとうございます。(;_;)
関数がFunction なんですね。。
「はあ、なるほど」
と思っても、関数は値を返すものではないかと思ってしまい、この場合のようにプログラムを起動して返す、というのが実感できませんが。。

某入門書にも、「プロシージャの実行」等は、sub は不可とあります。
納得できなくても、そういうものだと解釈して、慣れていくしかなさそうですね。

個人的には、環境が昨日ACCESS 2000になりました(会社がバージョンアップしてくれた)
亀よりも遅いですが、ゆっくりとしたいこと(しなければならないこと)に近づいています。
ありがとうございました。

お礼日時:2006/03/07 13:13

こんにちは。



その後、フォームのボタンなどのクリックイベントに取り付けるのではありませんか?Function のマクロ関数のままでは、どうしようもないと思うのですが。
    • good
    • 0
この回答へのお礼

どうしようもないものなんですね。。
モジュールタブの画面の「実行」ボタンが実行できるようになることはない、ということですね。
(なんか自分に落ち度があるように、思い込んでしまいました)
ありがとうございました。

お礼日時:2006/03/06 10:10

マクロは、一度も、使ったことがありませんが...


思うに、マクロ=プロシージャ(関数)ですよね!

「大きな計算処理を小さな仕事に分割し、最初ゼロから始める代わりに他人の作成したものを組み合せてプログラムをつくるには関数を使うのがよい。
関数をうまくつくれば、プログラム各部の操作の詳細部を隠すことができるし、細部について知らなくても、全体を明確化し、プログラム変更を容易にすることができる。」
(「プログラミング言語C」82頁)

ところで、かかる関数は、プログラムコードで呼び出して使用します。

1、テストフォームを作る。
2、コマンドボタンを配置する。
2、関数をコールするコードを書く。

などしたらどうでしょう!
    • good
    • 0
この回答へのお礼

ありがとうございました。
どうも、このままでは実行できないらしいということがわかりました。

お礼日時:2006/03/06 10:06

このQ&Aに関連する人気のQ&A

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

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

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

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

QAccessのマクロでモジュールを実行させたい。

Access2002を勉強中の初心者です。

AccessでDB1という名前のデータベースを作成し、その中で、モジュール1というモジュールを作成しました。これを実行するマクロを作成したく、次のようにマクロを作成しました。
マクロのデザイン画面でアクションに「プロージャの実行」を選択、プロージャ名入力覧の右側の...のボタンを押して式ビルダ画面を表示、ここの「関数」フォルダを開いてDB1を選択、表示されたモジュール1を貼り付けてOK。
しかし、このマクロを実行すると、次のエラーとなります。「DB1 指定されたDB1が見つけることができない関数名が含まれています」

根本的に方法が間違っているのでしょうか?
アドバイスをよろしくお願いします。

Aベストアンサー

#1です。

ちょっと時間ができたので、Accessのヘルプで、
 "RunCode/プロシージャの実行" アクション
についてのトピックを見てみました。

結論から言うと、基本的な考え方が間違っているみたいです^^;。

「プロシージャの実行」アクションでは、「Function」プロシージャを指定するようです。
Subプロシージャではエラーになります。


つまりご質問の件では、
「Subプロシージャを呼び出すFnctionプロシージャ」をまず書かなけれえばならない。
そして、マクロのアクションでは、あらためてこのFunctionプロシージャを指定しなければいけません。

QAccess VBA標準モジュールについてです。

Access VBA標準モジュールについてです。
現在、仕事上必要にかられAccessVBAを勉強中の初心者です。初歩的な質問で申し訳ありませんが、ご存知の方教えて下さい。
フォーム上のコマンドボタンを押した時に標準モジュールを作動させたいのですが、そんな方法はありますか?【クラスモジュールについての本は沢山あって何とか理解できつつありますが、標準モジュールに関しての記述があまり無い気がします。】
宜しくお願いします。

Aベストアンサー

>クラスモジュールについての本は沢山あって何とか理解できつつありますが
そうですかね。
実情とかけ離れているように思いますが、勉強が足らんのかな。
クラス主義のVB.Netと違いますよね。
普通はAccessVBAでもエクセルVBAでも、標準モジュールにコードを書きますが。
クラスモジュールなど高等すぎて。もっとほかにAccessVBAで勉強することが多いのでね。
フォームのコマンドボタンを押したときのコードは、フォームのコントロールをデザインしている画面ででそのコマンドボタンをダブルクリックすると、プロパティほかの項目の、設定場面が出て、そのイベントの「クリック時」の右端の「・・・」をクリクすると
Private Sub コマンド2_Click()

End Sub
が自動的に現れる。
この間にクリックしたときの処理のコードを直接書くのだが、他のコントロールからも利用したいときや
そっくり標準モジュールに書きたいとき、(ユーザー)関数は、標準モジュールのModule1などに
Sub test08()
MsgBox "sss"
End Sub
と書いて
Private Sub コマンド2_Click()
module1.test03()
End Sub
と書くとボタン2をクリックしたとき「sss」のメッセージボックスが表示される(された).
他のModuleにもTest03はあるので、module1.test03()と限定しただけ。

>クラスモジュールについての本は沢山あって何とか理解できつつありますが
そうですかね。
実情とかけ離れているように思いますが、勉強が足らんのかな。
クラス主義のVB.Netと違いますよね。
普通はAccessVBAでもエクセルVBAでも、標準モジュールにコードを書きますが。
クラスモジュールなど高等すぎて。もっとほかにAccessVBAで勉強することが多いのでね。
フォームのコマンドボタンを押したときのコードは、フォームのコントロールをデザインしている画面ででそのコマンドボタンを...続きを読む

QAccessからExcelにエクスポートする時に常に上書きしたい

AccessのテーブルをExcelへ出力する際に、常に同じファイル名で保存する場合、
2回目以降は、上書きするかどうかを尋ねるメッセージが表示されます。
「常に上書きする」と決まっているので、メッセージを表示させたくないのですが、どうしたらいいのでしょうか。

現在、マクロで作成しており、出力の前後に「メッセージの設定」を入れてみたのですが、ダメでした。
VBAなら可能でしょうか?よろしくお願いします。

Aベストアンサー

こんにちは。maruru01です。

エクスポートする直前に、元のファイルを削除するか、移動するか、リネームするのはどうですか。(VBAですが)


削除
Kill "C:\エクスポート.xls"

移動
Name "C:\エクスポート.xls" As "C:\移動後\エクスポート.xls"

リネーム
Name "C:\エクスポート.xls" As "C:\エクスポート_1.xls"

QExcel VBAからAccessマクロを実行したい

Excel VBAからAccessマクロを実行する方法を知っている人がいましたら
教えてください。
よろしくおねがいしまっす!

Aベストアンサー

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'マクロの実行
objAccess.DoCmd.RunMacro "メッセージ"

''ACCESSクローズ
objAccess.CloseCurrentDatabase
Set objAccess = Nothing

----------------------------------------------------------------------

もっと良い方法があるのかもしれません

参考にしてみてください。

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'...続きを読む

QAccessでテーブル名やクエリ名一覧の抜き出し

Accessでテーブルやクエリを沢山(100個以上?)使っております。

そこで、テーブル名やクエリ名の管理をしたいので、テーブル名(クエリ名)の一覧を抜き出したいのですが、どうすればいいのでしょうか?
または、そういうことは無理なのでしょうか??(;O;)

1個づつコピーペーストでテールブル名をエクセルに貼り付けて行こうかな?と思ったのですが、さすがに数が多すぎるので困っております。

できるだけ簡単な方法がいいのですが、もしなければVBAでもいいです。

おわかりの方がいらっしゃいましたら、よろしくお願いします。

Aベストアンサー

・クエリを新規作成
・以下SQLを貼り付け
SELECT MSysObjects.Type, MSysObjects.Name, MSysObjects.Flags
FROM MSysObjects
ORDER BY MSysObjects.Type, MSysObjects.Name;
・デザインビューで表示
あとは、TypeとFlagsの条件を変えてあげれば一覧できます。

QAccessからExcelのファイルを起動する

Accessのフォーム上にボタンを作成して
クリックすると特定のExcelのファイルが起動する
ようにしたいのですが、簡単な手はありませんか?

Aベストアンサー

こんにちは。maruru01です。

Shell関数を使って、

Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE ファイル名"

とします。
ちなみに、Excelの実行ファイルのパスは環境によって違ってきます。

あと、Excelの実行ファイルのパスがわからなくても、ファイルに関連付けられたアプリケーションで開くには、API関数のShellExecute関数を使用します。
API関数については、WEB上で検索して下さい。
このサイトの過去の質問でもヒットするかも知れません。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QMSアクセスのマクロ・モジュールを実行

MSアクセスのマクロ/モジュールを.batバッチファイル、もしくは.vbsのVBスクリプトでキックさせたいと思っています。

こういった方法は可能でしょうか?ぜひ教えて下さい、よろしくお願いします。

Aベストアンサー

Dim AcApp

Set AcApp = CreateObject("Access.Application")

AcApp.visible = true
AcApp.OpenCurrentDatabase "c:\temp\test.mdb" 'ファイル名
AcApp.DoCmd.RunMacro "マクロ1" 'マクロ名

これでどうでしょう。

QACCESS、VBAでEXCELファイルをコピーはできますか

ACCESS、VBAでEXCELファイルをコピーはできますか。
同じフォルダーにあるEXCELファイル:Aファイルを削除してA_BACKファイルをAファイルとしてコピーしたい。
宜しくお願いします。

Aベストアンサー

Excelファイルの複製でしたら、FileCopyを使用すれば可能だと思います:
http://www.tsware.jp/tips/tips_302.htm

ご質問の内容であれば、仮にcドライブ直下であれば以下のようになります:
FileCopy "c:\A_BACK.xls", "c:\A.xls"


なお、古いファイル「A.xls」を明示的に削除しなくても、上書きされます。
逆にいうと上書き時に確認Msgが出ないので、その確認もしたい場合は、
FileExistを使用してファイルの有無を確認するコードを作る必要があります。
http://www.tsware.jp/tips/tips_103.htm

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

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

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む


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

人気Q&Aランキング