• ベストアンサー

《エクセル2000VBA》なぜコンパイルエラーになるのかわかりません…

最近、ここには本当にお世話になっております。 以前作ったVBA(コマンドボタンを押すと、別シートにデータが転記される)のコードを変更したら、一番上のPrivate Subの行の文字が赤くなり、コピー元のシートのボタンにカーソルを持っていくと「コンパイルエラーです」と出るようになってしまいました。 そこでバックアップで保存してあった、問題なく動く過去のファイルを開いてみたのですが、Private Sub周辺の部分の書き方は全く同じです。 というわけで、Private Subがコンパイルエラーになる条件が、よくわからないのですが… 原因が思いつかず、ほとほと困っています。 何とかこの現象を解決したいのですが、どうすればいいでしょうか。

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

  • ベストアンサー
  • TAK_999
  • ベストアンサー率43% (42/96)
回答No.3

よく覚えていませんが、Office97から2000になった時に関数名として使用できる文字の制限が変わったように記憶しています。 補足で記述されている関数名の場合、「・」が気に入らないようです。当然フォームのオブジェクト名も含めて修正する必要があるようです。 以前動いていたのはOffice97ではありませんか?

bari_saku
質問者

お礼

その後、ためしに「・」を外してみたら、なぜかうまく動くようになりました。 まさにご指摘の通りだったのですが、そうなると今まで「・」つきでも問題なく動いていたのは、あれは一体どういうわけだったのでしょうか… ともあれ、どうもありがとうございました。

bari_saku
質問者

補足

こんにちは、質問を読んで下さってありがとうございます。 >以前動いていたのはOffice97ではありませんか? いいえ、今と全く同じ環境です。 付け加えるなら、アプリケーションの再インストールやバージョンアップもしていません。 ご参考になりますでしょうか。

その他の回答 (3)

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

こんばんは。 >コマンドボタンは転記元のシートにあります。 コマンドボタンは、シートの配下に属しています。そして、そのコード自体は、その付けられたコマンドボタン専用のものです。 オブジェクト名が「任意の行のコピー・印刷」というのがあって、そこにイベントのClick() が付けられたもののはずです。 だから、新たに設けるなら、コントロールツールで、シートにボタンを1つ作って、プロパティのオブジェクト名に、「任意の行のコピー・印刷」と替えて、そして、 VBEのシートモジュールのコードペイン上の 「(General)」の部分を、「任意の行のコピー・印刷」に替え、次に、元のコードの中身を貼り付ければ戻ります。そのままコードを貼り付けても、イベント認識しません。 もしくは、オブジェクト名はそのままで、 Private Sub CommandButton1_Click() ' - 中身のコード- End Sub と中身を入れてあげれば良いです。 ただ、それ以前に、Excelは、コンパイルとは言っても、しょせん、インタープリタ言語ですから、ひとつのプロシージャーは100行以内にまとめるべきですね。繰り返しの部分はまとめて、行を減らすというのは、大原則です。 >補足は2000字 とは何でしょうか? 実務のコードは、不必要なものは、最低限なくすようにしたほうがよいですよ。

bari_saku
質問者

お礼

2つの方法をご伝授頂きましたが、私のやり方がわるいのか、どうもうまくいかず… (「もしくは、オブジェクト名はそのままで~」の方は、何も起きない感じでした。処理の都度、チェック用メッセージが表示される作りにしたのですが、それが出なかったので) 何とか解決はしたのですが、まだまだ勉強中なもので、くわしくここに経過をお知らせするのもままならない状態です。ごめんなさい。 >補足は2000字とは何でしょうか? あ、ここの「補足」とは、このサイトの補足欄のことです。 最初、コードを全て補足欄にコピーしたら「2000字までです」とはじかれてしまいまして。 ともあれ、どうもありがとうございました。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

こういった質問の際には、ここをこう変更したらとか、エラーメッセージを正確に書くように心がけた方が良いですよ。 見てない人には解らないですから。 予想ですが、同一のモジュール内に同じ名前の Sub がありませんか? Private Sub CommandButton1_Click() End Sub Private Sub CommandButton1_Click() End Sub のような状況だと、CommandButton 上をマウスが通過すると「コンパイルエラー :名前が適切ではありません:CommandButton1_Click」とエラーメッセージが出ます。

bari_saku
質問者

補足

申し訳ありません、コードを補足いたしましたので、そちらを見ていただけますと助かります。

noname#11256
noname#11256
回答No.1

VBAに限らず一人でプログラム組むと意外なミスをしていることって良くあるんですよね。 参考になる回答ができるかわかりませんが、具体的なコードを教えてもらえませんか

bari_saku
質問者

補足

こんばんは。質問を読んでいただき、ありがとうございます。 VBAは任意の行のA列を選択し(アクティブにし)、その行の内容を別シートに転記して印刷するものです。 なお、コマンドボタンは転記元のシートにあります。 それではコードを… (補足は2000字までなので、あまり影響がないと思われる場所を省略しました) Private Sub 任意の行のコピー・印刷_Click() '出力シートのセルを初期化 Worksheets("出力").Range("B9").Value = Null 【中略】 Worksheets("出力").Range("H19").Value = Null '出力シートのセル結合解除 Worksheets("出力").Range("R10:T10").MergeCells = False 【中略】 Worksheets("出力").Range("R26:S26").MergeCells = False 'セル内容コピー ActiveCell = Worksheets("出力").Range("B9") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("D9") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("F9") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("R10") ActiveCell.Offset(0, 1).Select '選択はじめ Select Case ActiveCell.Value Case Is = "1" Worksheets("出力").Range("G12").Value = "●" Case Is = "2" Worksheets("出力").Range("G13").Value = "●" Case Is = "3" Worksheets("出力").Range("G14").Value = "●" 【中略】 Case Is = "13" Worksheets("出力").Range("G24").Value = "●" End Select ActiveCell.Offset(0, 1).Select '選択終わり・コピー続き ActiveCell = Worksheets("出力").Range("L12") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("O12") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("R12") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("K13") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("H15") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("K15") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("O15") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("H17") ActiveCell.Offset(0, 1).Select ActiveCell = Worksheets("出力").Range("H19") '出力シートのセル結合 Worksheets("出力").Range("R10:T10").MergeCells = True 【中略】 Worksheets("出力").Range("R26:S26").MergeCells = True '出力シートを印刷 Worksheets("出力").PrintOut End Sub なにぶん最初の行で止まってしまうので、このコードできちんと処理ができるかどうかは未確認です。 以上、補足致します。 (すみません、今日はこれで失礼します)