• ベストアンサー

《エクセル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 なにぶん最初の行で止まってしまうので、このコードできちんと処理ができるかどうかは未確認です。 以上、補足致します。 (すみません、今日はこれで失礼します)

関連するQ&A

  • Access2000のVBAでコンパイルエラー

    Access2000のVBAで初歩的な質問があります。 「tblShi」というテーブルがあります。 フォームにボタン「btn1」を作り、 デザインビューでボタンのプロパティを開いて イベントのクリック時のところで、 「ビルダの選択」をコードビルダにしました。 そして「Private Sub btn1_Click()」の中に、最初に   Dim db As Database という記述をしています。 このフォームを開いてボタンを押すと、なぜか   コンパイルエラー   ユーザ定義型は定義されていません というエラーが表示されてしまいます。 たしかにコードを書いているときに、   Dim db As のところまで入れると、小さいウィンドウの中に たくさん候補が表されますが、 その中に「Database」というのがないです。 「QueryDef」とか「Workspace」とかもありませんでした。 (「Recordset」はありまして、それはコンパイルが通ります) いろいろな解説を見ても、やはり最初はどれも 「Database」型を宣言しているようなんですが… 何がよくないのでしょうか。 もしわかる方がいらっしゃったら教えてください。

  • Excel VBA プロシージャの種類の使い分け

    VBAを勉強中です。 最初に読んだ参考書には、 プロシージャにはsubとfunctionの2種類があると書かれていたので 鵜呑みにしていたのですが、 また違う切り口から、privateとpublicが存在していることを わかり始めて来たところです。 シートにコマンドボタンなどをつけてコードを登録しようとすると 自動的にprivate subになるので、 ひとつのシートにくっついているものはprivate subで あまり他シートから使う必要がないんだなぁという認識なのですが、 まずこれが合っているのか不安なのと、 あと、たとえばまったく同じコマンドボタンを 2枚以上のシートにつける時、 各シートに同じVBAをひとつずつ記述するより、 標準モジュールにprivate subを記述したほうが良いのか、という事が 気になっています。 好き好きなのかも知れませんが、私がつくったものに 他の人が変更を加える可能性があり、できる限り見やすくしたいので、 一般的にはどうされているものなのかお教えくだされば幸いです。

  • エクセルVBAのコンパイルエラー

    下記VBAでコンパイルエラーを起こして進みません 解消法をご教授いただけると幸いです やりたいこととしては ボタンで任意のタブ区切りのテキストを指定し 特定のシートに値をコピーすることです ---- Private Sub CommandButton1_Click() Dim Sh As Worksheet Dim FileN As String Set Sh = ThisWorkbook.Sheets("import") ' <-- 読込みシート指定(※) FileN = Application.GetOpenFilename("テキストファイル,*.txt") If FileN <> "False" Then Workbooks.OpenText Filename:=FileN, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Tab:=True End If Set Sh = Nothing End Sub ----

  • エクセルのVBAのことで

    コマンドボタンで「Macro1」というマクロを実行させるVBAは以下だと思いますが。 Private Sub CommandButton1_Click() Call Macro1 End Sub 上記に、Sheet1・Sheet2・Sheet3に対して実行するということを加えると、どんなふうになるでしょうか。

  • エクセルVBAでコンパイルエラー

    すみません、どうしても腑に落ちないので質問させてください。 わたしが書いて配布したBOOKのコマンドバーを非表示にするコードなのですが、エクセル2000で、myCB のところでコンパイルエラーになるという連絡がありました。 その方は数台PCをお持ちですべての端末でそうなるとのことです。 しかし、下記コードはこれまで2000でも2003でも2007でも何度も試しており、これまでそのようなことはありませんでした。 Private Sub ALLBARS_Hide()   Dim myCB As CommandBar   For Each myCB In Application.CommandBars     myCB.Enabled = False   Next myCB End Sub どういった原因が考えられるでしょうか? なお、上記コードはAuto_OpenからCallされます。

  • Excel VBA --- コマンドボタンが表示上で消える ---

    Excel VBAの初心者です。 今回、マニュアル本を見ながら試行錯誤でマクロにチャレンジしています。 用語や説明が上手くできないかもしれませんがよろしくお願いします。 OSはWindows2000、Excelのバージョンは2000です。 sheet1をメニュー画面として、コマンドボタンをいくつか貼り付けて、そのシート名を表示したコマンドボタンをクリックすると別のシートに 飛ぶようにしています。 別のシートに飛んで、そこで作業を終えたら、今度はそのシート上に貼り付けた『メニューに戻る』コマンドボタンをクリックしてsheet1のメニュー画面に戻るようにマクロを組みました。 ところが、作業用のシートからメニューに戻ると前回クリックしたコマンドボタンが表示上消えてしまっています。 そのコマンドボタンがあった位置にカーソルを持って行ってクリックするとちゃんとコマンドボタンの動作をします。 同じような質問がないか検索してみましたら『コマンドボタン上の文字の表示がおかしくなる』という質問があって、下記コードを入れたら解決したそうなので、Sheet1に下記のようなコードを入れてみました。 でもダメでした。 Private Sub Worksheet_Activate() Application.ScreenUpdating = False ActiveWindow.ScrollRow = 100 ActiveWindow.ScrollRow = 1 End Sub 解決方法のご教授をお願い致します。

  • Excel VBA のコンパイルエラー

    Excel VBA で GDI32 にある API を declare するとメモリ不足のコンパイルエラー となってしまいます。 どなたか解決策を御教示下さい。 使用するAPI は GetTextExtentPoint32 です。 コンパイルエラーが起きるVBAコードは、MSのVBサンプルから拾ったものです。 private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _ ByVal hdc As Long, _ ByVal lpsz As String, _ ByVal cbString As Long, _ ByRef lpSize As CSize) As Long Private Type CSize cx As Long cy As Long End Type 同じ GDI32 にある DeleteObject の declare 文はエラーが発生しません。 環境は以下の通りです。 Excel 2007 OSはVista 32bit メモリは 3G で約60%使用 宜しくお願いします。

  • エクセルの「コンパイルエラー」 

    何回か質問させて頂き回答を頂き 判らないながら本を片手に原因究明?理解にはほど遠い感がします。 お教え下さい。 下記がソフトの一部です、全コードを記載出来れば良いのですが、 このような一部分でも何かヒントをいただけますか。 4台のPC中1台のみエラー発生なく動いてます 他はExCEL とOSのバージョンを全く会わせてもNGです 「モジュール1でコンパイルエラー」デバッグ ステップインで 1行目から実行すると(1)で(2)に飛び(3)まで行って (4)でエラーで止まりますシートとかブックとかが足りない様な気がしますが 構文の書き方が特定のPCのみに有効になってるのでしょうか WorkBook 4行目まで記述されてます Public Sub Workbook_Open() label_101: Call Workbook_Open1-----------(1) End Sub 「ここからはモジュール1です」 Private Sub WorkSheet_Delete(Target_Sheet0 As String) 'シート削除--(4)この行で黄色の行表示で止まる On Error GoTo ErrSheetDelete Application.DisplayAlerts = False Worksheets(Target_Sheet0).Delete Application.DisplayAlerts = True GoTo ExitSheetDelete ErrSheetDelete: Error_Number = Err.Number --- Error_Number が青色で表示される Msg = "仮台帳がアクティブにできませんSub WorkSheet_Delete。Error_Number=" & Error_Number Err.Clear ExitSheetDelete: ' End Sub Public Sub Workbook_Open1() Dim Target_Sheet As String XLSFile_Dir_Name = ThisWorkbook.Path -----(2) XLSData_File_Name = XLSFile_Dir_Name & "\" & "工事台帳DB.xls" XLSSoft_File_Name = XLSFile_Dir_Name & "\" & "工事台帳DB_ソフト.xls" Target_Sheet = "仮台帳" Call WorkSheet_Delete(Target_Sheet)------(3) 以下省略

  • ユーザーフォームが表示前にエラーになります。

    お世話になります。 Excelのシート上にコマンドボタンを配置して それをクリックするとユーザーフォームが表示されるようにしたいのですが、下記のコードだと「フォーカスがありません」と1行目でエラーで止まってしまいます。 解決方法を教えてください。 Private Sub コマンドボタン_Click() ユーザーフォーム.Show End Sub よろしくお願いします!

  • ラウザ経由でエクセルVBAを実行するとエラーになる

    ブラウザからエクセルを表示してコードを実行するとエラーになる htmlでエクセルのファイルにリンクさせてあるのですが、 ブラウザからエクセルファイルを表示してコードを実行するとエラーになります。 エクセル単体で実行すれば問題ありません。 ちなみにhtml側は、 同一フォルダに<a href="test.xls">テスト</a>と記述して、ファイル名がテスト.htmlです。 ----- WinXP、エクセル2003、IE6、です 各々バージョンアップ不可です、これらの対応は却下です。 以下にコードを記載します。 ファイル名がtest.xlsで、sheet1に記載。 sheet1は最初に保護されている状態で、パスワード無しです。 -------- '標準モジュール sub test() activesheet.unprotect range("a2").select end sub ーーーーー 'sheet1にコマンドボタン1を設置してある。標準モジュールに記述 private sub commandbotton1_click() userform1.show end sub ----------------- 'userform1にコマンドボタン2を設置してある。userform1に記述 private sub commandbotton2_click() call test end sub -------------- でsheet1のコマンドボタン1を実行すると、 実行時エラー'91': オブジェクト変数またはwithブロック変数が設定されていません となります。 activesheet.unprotect の行で停止します。 ----- こうすればブラウザからでも出来るよという回答をお願いします。 上の記述ではunprotectが書いてありますが、 別に保護解除が目的ではなく、なぜブラウザ経由ではエラーになるのか?というコード上の矛盾点みたいななのを知りたいのです、 よろしくお願いします。

専門家に質問してみよう