• ベストアンサー

本当に基本的なことなんですが

エクセルVBAでモジュールを使おうと思っています。 以下のようにモジュールにコードを書き、実行したらコンパイルエラー End Subが必要ですとメッセージがでてしまいます。 どこをどう直せばいいんでしょうか? 変数を宣言しているだけだと思うんですが。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2002/10/29 ユーザー名 : ' Sub Main() Public BaseCell As CellFormat Public BaseCellRow, BaseCellColumn As String End Sub End Sub 暇な時でいいですから、回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • layer13
  • ベストアンサー率47% (37/78)
回答No.4

>スタートアッププロシージャとして定義するSub Main これは、呼ぶ側が便宜上そう定義しているだけです。 マクロとしてのVBAであれば、常にMainという名前のプロシージャがコールされる わけではなく、ボタンなりに登録してある名前のプロシージャが必要なときに コールされるという使われ方です。 おそらくそのマニュアルでは、最初にMainが起動されるような「Excelの設定」が 存在し、そこから検索なりの機能を起動するという意味で、「スタートアップ」と 呼んでいるのだと思います。 また、別な言い方をするならば、 >C言語におけるMainのようなもの は、Excel自身。と解釈しておいた方が混乱しなくてよいと思います。 Mainに相当するものはすでに動いていて、どのプロシージャをコールするかは ユーザーの設定しだいということですね。

hibachi
質問者

お礼

回答ありがとうございます。 私のみたのはVisual Basicのマニュアルだったので、ちょっと意味が違っていたかもしれないですね。CにおけるMain=Excel自身という解釈了解しました。わかりやすい説明ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

(1)Publicの宣言は、宣言セクションにしないといけないのでは。 「モジュール レベル変数をほかのモジュールでも利用できるようにするには、モジュールの宣言セクションで Public キーワードを使って "パブリック変数" を宣言します。パブリック変数の値は、アプリケーションのすべてのプロシージャで利用できます。 (2)CellFormatはエクセル2002からできた機能のようで、エクセルのVersionを銘記すべきである。 (3)Main()という名をつけるのは勝手だが、Javaなどのように、コントロール(制御)がここに初めに 来るという保証は無いのはご存知ですよね。

hibachi
質問者

お礼

すばやい回答ありがとうございます。 VBA、VBはまったくの初心者であるためモジュールの使い方とかよくわかっていませんでした。もう少し勉強したほうがよさそうですね。 (2)エクセルのバージョンはご指摘のとおりエクセル2002でした。

hibachi
質問者

補足

もう少し質問させて下さい。私の持っているマニュアルによると、「スタートアッププロシージャとして定義するSub Main」と書いてあります。なので私はMainはC言語におけるMainのようなものだと思っていました。これは間違っていますか?

全文を見る
すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.2

マクロ内で他のマクロを使うには、 call Main とかすればいいです。

全文を見る
すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

マクロのなかにマクロは できません。 Sub Macro1() End Sub Sub Main() Public BaseCell As CellFormat Public BaseCellRow, BaseCellColumn As String End Sub とすれば、いいでしょう。 って、外側のマクロは 何をやってるのかな?

hibachi
質問者

補足

すばやいレスありがとうございます。 >って、外側のマクロは 何をやってるのかな? 実はこのあとSub Main内でUserForm1とUserForm2を表示させようとしています。この際Sub Macro1内ではすることがないんですが、そういうやり方って正しいですか?あるいは書き方としておかしいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAの移行

    エクセルからリブレに移行するにあたり、 エクセルで機能していたVBAコード: Function BeepMe() As String Beep BeepMe = "" End Function を Option VBASupport 1 REM BASIC Sub Main Function BeepMe() As String Beep BeepMe = "" End Function Sub Macro1 End Sub と書き換えました。 でもこれではエラーになってしまいます。 詳しい方、教えてください。

  • vbaの 変数の宣言 記号は使えない?

    vbaの 変数の宣言 記号は使えない? Sub test1() dim st @ End Sub みたいに変数の型を As String ではなく記号で表現ってできないんでしたっけ? エラーになってしまいます。

  • 数値かどうかを取得したい IsNumberではダメ

    Sub Macro2() Dim mystr As String mystr = "1" If IsDate(mystr) = False Then MsgBox "NO" End If End Sub これなら日付型かどうかを取得できるのに、 Sub Macro1() Dim mystr As String mystr = "1" If IsNumber(mystr) = False Then MsgBox "NO" End If End Sub だと、IsNumberがコンパイルエラーになります。 変数に入っている値が数値として評価できるかを取得する方法を教えてください。

  • 記号をマクロで記録することは不可能か?

    記号をマクロで記録することは不可能か? エクセル2003を使用しています。 マクロの記録→挿入→記号と特殊文字で ハートを挿入し、マクロの記録の終了をして標準モジュールを見たのですが Sub Macro1() ActiveCell.FormulaR1C1 = "?" Range("a1").Select End Sub となります。 セルにはハートが入っています。 そのあと、Macro1を実行すると、?がセルに挿入されました。 VBAで記号を挿入することは不可能のなのでしょうか?

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • 実際に宣言した変数を使ってない場合

    vbaです。 標準モジュール内で Public str tmp As String 等で宣言しているのに、 実際に宣言した変数を使ってない場合があるのですが それを見つけ出すことはできますか? 宣言だけしていて使ってない変数が知りたいです。 ひとつずつ検索していくしかないのでしょうか?

  • マクロの記録で何も記録できない理由は?

    「ブックを開く」という動作が知りたかったので、 現在開いているブック1から、マクロの記録ボタンを押し、 デスクトップにあるブック2をダブルクリックして開きました。 しかし記録終了ボタンを押した後、 ブック1の標準モジュールを確認しても Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/10/16 ユーザー名 : ' End Sub と何も記録できていません。 何故でしょう? ちなみにブックを開く方法は http://officetanaka.net/excel/vba/file/file01.htm で確認できました。 なのでマクロの記録で記載されない理由を教えてください。 エクセル2003です。

  • 定数の宣言ってdimは使えないのですか?

    VBAです。 標準モジュールに Option Explicit Public Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub はできるのですが、 Option Explicit dim Const フォルダ名 As String = "新しいフォルダー" Sub aaaa() End Sub は、エラーになってしまいます。 Option Explicit Sub aaaa() dim Const フォルダ名 As String = "新しいフォルダー" End Sub もダメみたいです。 定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

  • 同じマクロ名でも、違うモジュールならエラーにならな

    同じマクロ名でも、違うモジュールならエラーにならない? エクセルVBAについてご教授ください。 標準モジュールに ――――――――― Option Explicit Sub CommandButton1_Click() MsgBox "" End Sub Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― と同じマクロ名を2つ作ったら、コンパイルエラーになりますが、 上記のコードは一度消して、フォームモジュールに ――――――――― Private Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作り、 標準モジュールに ――――――――― Sub CommandButton1_Click() MsgBox "" End Sub ――――――――― を一つ作った場合は、エラーにならずにマクロを実行できました。 これは、フォームモジュールがPrivate Subだからでしょうか? フォームモジュールに1つ、 標準モジュールに1つ なら同じマクロ名を使っても、エラーにならないという事でしょうか? よろしくお願いします。

  • 標準モジュールにpublicで宣言するしかない?

    フォームモジュールと標準モジュールで同じ変数を使って値を行き来したい場合、 標準モジュールにpublicで宣言するしかないのでしょうか? 【フォームモジュール】 Private Sub cmd_コマンド0_Click() test = "aaa" Call 標準モジュールtest End Sub 【標準モジュール】 Public test As String Sub 標準モジュールtest() MsgBox test End Sub でいいのですか?