• 締切済み

エクセルVBAの定数

こんにちは! 定数について質問です。 VBAのユーザー定義定数ってVBEに記述する以外に宣言する方法はありませんでしょうか?詳しくないですがC言語のようにヘッダーファイルにリンクするように手軽でやりたいのですが無理でしょうか?

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 あまり、ここの掲示板では、深い話をする機会はありませんが、もう少し書かせていただきます。あくまでも個人的な意見で、違うという人もいるとは思います。 >dllとかいうライブラリファイルを作らなきゃいけない感じなことはわかりました 基本的には、Excelでは、アドインです。他には、タイプライブラリやActiveX コントロールということになりますが。 まず、VBAに使用する dll の作成のツールは、全部で三種類あります。  1. C言語で作るもの  2. VBで作るもの  3. Developer で作るもの  番外としては、VSTA または、VSTO で作るものになると思います。 マイクロソフトでは、MS-Office は、VSTAに移行しようとしているのはご存知だと思います。言い換えれば、.Net です。VSTA/VSTOは、VB.Net と C#の選択になります。 以前、Developer は、Developer Toolsがあったので、ある程度安価で手に入りましたが、VS2005 では、上位機種でなければダメで、その代わりにVSTOを買えというのでは、とても一介のプログラマでは、単にそのために購入するようなことは出来ません。(MSに付き合っていたら、いくらお金があっても足りません。BASIC系は、今のところMSが中心ですが、何も、BASIC系だけが、プログラミング言語ではありません。)もちろん、VB6の場合は、Professional 以上だったはずで、これも安価ではありません。おまけに、この方面の資料が極端に少ないような気がします。今は、過渡期ですから、次のものにターゲットを置いたほうがよいと思います。資料が極端に減っていますし、あっても、プレミアがついています。仮に手に入れても、有効な範囲が狭まっています。仕事で収入の見込みでもなければ、今更、Developer やVB(非.Net)などには手は出さないほうがよいです。お金が有り余って、達成の目的がない趣味なら別ですが。 たかが、MS-Office のVBAで、そんな専門的なことはしなくてよい、というのが私の思いです。某氏のように、一回の仕事で、何百万円も稼ぐ身ならともかく、私などは、せいぜい、知り合いから頼まれて、貰っても数千円で、中には、トンデモナイ内容で、お断りもありました。 >DLLファイルが簡単に作れる感じでが、言語の選択とかってのがあるのですが 深読みすると、一種のVBAプログラマの足きりです。「Dll のCOMアドインを作りましょう」といっても、本格的な言語を扱えなければ、歯が立ちません。今までの、VBAとは段違いにハードルは高いです。仮に、VB.Netになっただけで、オブジェクト指向が入ってくるので、完全に、今までのものとは違ってしまいます。将来、.Net FrameWorkは使わないとは言っても、おそらく、Vista以上で使うようになっていくと思います。 余談にはなりますが、こちらが私の専門に近いのですが、 >英語で書かれたものを翻訳機械にかけただけで人的な加工はしてないですぜ! あまり詳しくは書きませんが、こちらの内情も知っています。大元凶は元の英文が悪いのです。おそらく、ネイティブでも、そう簡単に読める人は少ないと思います。それでも、もし、分かりにくいと思ったら、英文を読まないといけません。Excelのヘルプの文章がどことなくヘンだと感じるのは、英文自体をそのまま逐語訳したのが原因なのです。残念ながら、どう読んでもプロの仕事ではありません。 >グローバルでの宣言は、気分的にメモリいっぱい使いそうだなあってのでちょっと避けたい 広範囲のセルを参照するようなコードを書かない限りは問題ないはずです。常識的な範囲なら、グローバル変数でも、問題が発生したという話は聞きません。グローバル変数は、ほとんど文字列で、String型です。ただ、あまりグローバル変数が大量のものは、どこかに、改良点があるはずです。 >VBEへの記述ってマクロでは出来ない(?)感じと思いますが、 今は、してはいけないことになっています。そういうコードを書く方法もありますが、それ自体が、ひどく特殊です。 なお、Class は、Classオフジェクトを作って、そこにプロパティを書いていくという感覚ですが、それほど多くは使われません。コードが倍々になっていくので、なかなかややこしいです。 >宣言したものを一個のファイルでまとまとめて見ることができるようにしておきたい感じな感じ Variant 型でなければよいと考えてよいと思います。それと、私が見ている限りでは、名の知れた方でも、非表示のワークシートのひとつを使いますね。VBE側に書いたら、大変な量ですから、やむを得ないのだと思います。 ただし、グローバル変数の代わりに、ワークシートの名前-登録を使う人がいます。いかにも素人くさいし、VBA では、使用しないほうが良いようです。Namesオブジェクトは、その親オブジェクトが曖昧に感じます。 ここらは、実務上では上級の話になるので、かなり経験をつまないと、制作上では、初歩的な部分や基礎的な部分で逆に集中力を欠いて、コケてしまうことが往々にしてあります。 VBAはあくまでも、スクリプト言語ですから、コンパイルしていません。常に、コードはExcel.Applicationが、メモリ上で、監視状態になっていますが、他の言語のようにしたいと思っても、そこには限界があります。別のご質問で、日本地図の上でマウス・クリックした位置の情報を出したいというのを読みましたが、そういう動作を望むのは、言語そのものが違いますから、VBAでは実現は可能・不可能かは分かりませんが、メインはあくまでも、Excel ワークシート本体なので、仮に出来ても、そうした旨味が少ないのではないかと思います。それに対してアイデアとしては持っていますが、それこそ集中力が必要になってしまいます。 Excelは、Excelに向いた仕事があり、そうでないものは別のプログラム言語を使うほうがよいと思うのです。Excelは、その表計算の特性を活かせば、他のプログラム言語では比べ物にならないくらいの力を発揮します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >C言語のようにヘッダーファイルにリンク Cの定数は、VBE の定数の考え方と、基本的には変わらないはずですね。ヘッダファイルは、VB系で言えば、参照設定と同じものだと思います。手続きは、VB系は、非常にややこしいのですが。 ですから、別のプロジェクトを作っておいて、アドイン型にするか、そのまま参照設定で呼び出すか、後は、Class を作っておくぐらいではないでしょうか? 他には、VBAやVBでは、グローバル文字列定数(通常は、そのブックのプロジェクト内)を置いておいて、それを、後で、配列に置き換えるということはします。それらは状況によります。 時々、多言語に慣れている人は、外部ファイルにするという人もいますが、私は、なんとなく、VBAには向かない気がします。なんとか、一つのブックでまとめようとするのに、それを外部に置くのは、「VBAらしく」ありません。それをするなら、非表示シートに定数としておいておくほうがよいです。Excelには、いろんな置き場所があります。

pa-pa-pa-
質問者

お礼

こんにちは! いつも回答いただいちゃいまして、本当ありがとうございます!! 回答をいただくたび、そのぶんだけお馬鹿な私が少しだけ賢くなっちゃう感じです。本当に大感謝! >手続きは、VB系は、非常にややこしいのですが マイクロソフトのページで最初調べていたのですが、いくつかこれかしらんと思ったものがありまして、dllとかいうライブラリファイルを作らなきゃいけない感じなことはわかりましたが、かなり難解で、中にはこれまでに読んできた日本語の中でもトップクラスに迷走した文章で書かれているものもあり、理解することを放棄しました(冒頭に、このページの内容は英語で書かれたものを翻訳機械にかけただけで人的な加工はしてないですぜ!保障の限りではない!みたいな記述があったりする感じ)。 なんか複雑なことだけは分かっちゃいました。 >別のプロジェクトを作っておいて、アドイン型にするか、そのまま参照設定で呼び出すか、後は、Class を作っておくぐらいではないでしょうか? これはどういう感じでしょうか?凄くなんか良い感じな印象がします。いままでアドインとかいうのを使ったことがないのですが、結構ムツカシイのでしょうか? なんでCのようにヘッダーファイルで定数宣言を行うようなことがしたいかというと、まずグローバルでの宣言は、気分的にメモリいっぱい使いそうだなあってのでちょっと避けたいのと、VBEへの記述ってマクロでは出来ない(?)感じと思いますが、定数化したいものはシェイプやグラフのの名前とか、表の名前、なんかのパラメーターとかってもので、こういうのはいちいち記述するのが面倒なので、対象のもを生成すると同時に勝手にヘッダーファイルみたいなのに宣言を追加するようなマクロを組んでしまいたいのと、セルとかテキストを検索するという操作なしに手軽に使用したい感じで、あとは宣言したものを一個のファイルでまとまとめて見ることができるようにしておきたい感じな感じです。 今マイクロソフトのページを読んでいたら、アドインなんとかを使うと(マイクロソフト曰く)DLLファイルが簡単に作れる感じでが、言語の選択とかってのがあるのですが、こここれ以外に何か方法はありませんでしょうか?ないですよね?

関連するQ&A

  • Excel2003 VBA Functionの定数に関して教えて下さい

    Excel2003 VBA Functionの定数に関して教えて下さい。 例えば、 Function test(x, y) test = A * x + B * y + C End Function という数式を定義し、プログラム中で使用したいとします。 数式を見て分かる通り、xとyは変数でA, B, Cは定数です。 そして、これらA, B, Cの値を A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) のようにシート上の値を使用したいのですが、 上記のようにプログラム中で宣言してもFunctionの中では値が入っていないものとみなされてしまいます。 この問題の回避のため、、 Function test(x, y) A = Cells(3,5) B = Cells(3,6) C = Cells(3,7) test = A * x + B * y + C End Function のようにFunctionの中に、定数を宣言を入れてしまうか、 Function test(x, y, A, B, C) test = A * x + B * y + C End Function のようにA, B, Cも定数ではなく、変数として扱う方法があります。 しかしながら、一つ目の方法では、こういったFunctionの数が増えてくると、 同じ定数を複数の場所で宣言することになり、後からプログラムを書き直そうとしたときに 極めて不便です。 一方で、2つめの方法では、test(x, y, A, B, C)のように、 一つのFunctionを呼び出すためにごちゃごちゃしてスペースをとり、 後から見たときに見にくくなります。 後、Constとして定義する方法もありますが、 A = Cells(3,5) のように、シート上のデータを代入する方法をとりたいと考えています。 上記以外の方法以外でもっとスマートな方法がありましたら 教えて頂けますでしょうか?

  • Excel VBA 未使用の変数定数宣言の削除

    Excel2010のVBAで使われていない変数、定数の宣言を削除したいのですが、今は1つずつ検索機能で検索して宣言だけが検索されたものを削除しています。何か簡単に未使用の変数、定数を見つける方法はありますでしょうか。

  • Excel VBAでの定数宣言について

    初心者が書籍とにらめっこしながらマクロを書いています。 お助けください。 複数あるラジオボタンをクリックしたら、そのラジオボタンの種類に応じて、特定の行を表示したり、非表示にしたりしたいと考えています。行の追加や削除で行番号が変わってしまった場合に備えて、この行番号を定数として宣言したいと思ったのですが、うまくいきません。 シートモジュールには、以下のように記述しています。 ============================================================== Private Sub OptionButton1_Click() 'ラジオボタン1を選択 Rows(scope1).EntireRow.Hidden = False 'scope範囲行を表示 Rows(scope2).EntireRow.Hidden = True 'scope範囲行を非表示 End Sub Private Sub OptionButton2_Click() 'ラジオボタン1を選択 Rows(scope1).EntireRow.Hidden = True 'scope範囲行を非表示 Rows(scope2).EntireRow.Hidden = False  'scope範囲行を表示 End Sub ============================================================== 以下の記述で定数を宣言したいのですが、 public const scope1 = "38:48" '38行目~48行目 public const scope2 = "49:52" '49行目~52行目 シートモジュールの最初に書くと、 「コンパイルエラー  定数、固定長文字列、配列、ユーザー定義型およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません」 とエラーメッセージが表示されてしまいます。 エラーの意味がよく分からないのですが、定数宣言は、どこに記述すればよいのでしょうか? お教えください。よろしくお願いします。

  • C言語における定数の使用方法

    こんにちは。 今日質問したいのは、タイトルにありますように、C言語における「定数」の使い方についてです。 私は現在、Visual C++を用いてC言語のプログラミングを勉強しているのですが、条件文(if文)に定数を用いてコーディングを行おうとしても、どうしてもエラー表示が出て、うまくコンパイルすることができません。 具体的には、 if(No>=1 && No<=10){ //具体的な処理部分 } というif文を、予めヘッダファイル内にて定義した定数 #define start 1; #define stop 10; を用いて次のように、 if(No>=start && No<=stop){ //具体的な処理部分 } コーディングしたいと考えています。 しかし、これをコンパイルするとエラーが発生してしまいどうにもうまくいきません。 また、定数ではなく数字で記述するとうまく回ります。 別のところで定数を、 wk = start; のように代入で使用しているのですが、そこではなにも問題がありません。 いったい何が間違っているのか、どのようにすればうまくいくのかを教えていただきたいと考え、書き込ませていただきました。 皆様、どうぞよろしくお願いします。

  • 定数式とはどういう意味でしょうか。

    Microsoft Visual C++ 5.0を使っています。 いつもLINUXでCのコンパイルをしているのですが、Win上でコンパイルすると 「error C2057: 定数式が必要です。」 とでます。 このエラーの指し示すのは、 double x[N]; というような配列の宣言のようです。 ちなみにNは、ヘッダーに const int N = 2; と定義しています。 このエラーを出さなくするにはどうしたら良いでしょうか。 ご回答をよろしくお願いします。

  • C#とCでの定数共用に関して

    現在、C(native)でDLL,C#でそのDLLを使ったアプリを開発しています。(Microsoft VisualStudio2008) DLL/アプリともC#あるいはC/C++で記述すれば問題ないのですが、諸般の事情でこのような形態になっていますので、これに関しての意見は無用です。 質問ですが、DLL内の関数の呼び出し時に引数として意味をもった定数を使用する - (たとえばWIN32で使うWM_**等のように) - のですが、この定数値をC#のアプリとでうまく使いまわす手段がないかを探しています。 C#にはCのようにヘッダファイルをインクルードすることができないので、もしやるとすれば、Cのヘッダを何らかのスクリプトで自動変換してC#でそれ用のenumを含むクラス定義のあるソースファイルを自動生成するなどは思いつきますが、スマートな方法ではないですよね。 #C/C++は何十年と使っていますが、C#はごく最近始めました。 なにかもっと簡便な方法はあるのでしょうか。 よろしくお願いいたします。

  • エクセルのVBA記述のことについて

    エクセルでVBAを記述するのにはいちいちコマンド等を打つ必要があるのでしょうか。既にコマンド、関数等が入っているもの(ライブラリというのですか?)はあるのでしょうか。あとC言語等についてもプログラムの記述にはコマンド等を簡単に呼び出せる方法があると聞きましたが、どの様に入手するのでしょうか。それらはライブラリと呼ぶのですか。

  • エクセルVBAのファイルが開けなくなりました

    比較的長くて複雑なVBAを含むエクセルのファイルが開けなくなりました。ファイルが開いた状態で砂時計がずっと回ったままです。 おそらくVBAで誤った記述をしたまま、無理に閉じてしまったからではないかと 思うのですが、このファイルを何とか開く方法はありますでしょうか?

  • 定数はどこでまとめますか?

    今、複数のCSVファイルを開いて、文字検索を行い、 HTMLとして、結果を出力するというPG組んでいます。 CSVファイル名とかを定数としておくわけですが Cだとヘッダーファイルなりにまとめるとおもいますが、 javaの場合、このような定数はどのように管理するのが、一般的なんでしょうか? たとえば、 定数専用のインターフェースを作ってまとめるとか、定数専用のクラスを作るとかは思いついたのですが...。

    • ベストアンサー
    • Java
  • エクセルのVBA

    お世話になります。 エクセルのVBAで,PDFを開くよう組んでいます。以下がそのVBAです。 CreateObject("Shell.Application").ShellExecute "C:\Users\コンピュータ名\Desktop\フォルダ名\ファイル名.pdf" このエクセルとPDFを別のパソコンに移すと,リンクが切れてPDFが開かなくなってしまいます。 どのようにすれば,別のパソコンに移してもそのまま開くことができますか。パワポなど,ほかのソフトも同様に,リンクが切れてしまいますので,ご教授願います。

専門家に質問してみよう