• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAのユーザーフォームについて)

Excel VBAのユーザーフォームで表示されるエラー対処方法とファイル操作の注意点

このQ&Aのポイント
  • Excel VBAでユーザーフォームを作成している際、ユーザーフォームで表示されるエラー「インデックスが範囲内にありません」の解決方法について説明します。
  • また、ユーザーフォームで使用するファイルの操作に注意が必要です。ファイルの表示中にエラーが発生しても、ユーザーフォームはマルチ画面を作成するため、出力ファイルを生成することができます。しかし、出力ファイルのファイル名には注意が必要です。
  • 初めてユーザーフォームを作成する初心者の方に向けて、ユーザーフォームの作成方法やエラー対処方法についてアドバイスを提供します。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 > を、起動していると必ず「インデックスが範囲内にありません」 > といった内容のエラーが表示されます。 エラーメッセージは先頭にあるエラーナンバーを添えて、 正確な文言を提示するように心がけましょう。 エラーメッセージのダイアログには、多くの場合 [デバッグ]というボタンが表示されます。 このボタンの有無も解決に役立つ情報のひとつです。 [デバッグ]ボタンを押すことができるタイプのエラーなら、 ボタンを押すことでデバッグモードに切り替えることが出来ます。 エラーの原因となっている記述が行ごと、VBE上でハイライトされますから、 不適切な記述上の誤りを特定する作業から始めることになります。 エラーの原因となっている記述が判れば、 (或いは判らない場合でも) 次に、エラーナンバーやエラーメッセージを頼りに、 記述内容の誤りを確認します。 恐らく ーーーーーーーーーーーーーーーーーーーー ! 実行時エラー '9': インデックスが有効範囲にありません。 ーーーーーーーーーーーーーーーーーーーー というエラーなのだと思います。 この場合だと、例えばWorkbooks(引数)のような書き方の 括弧の内側の引数に不適切な指定をしている可能性が大です。 いわゆる「インデックス」だったり「名前」だったり「オブジェクト名」だったりの指定に誤りがないか 確認する作業が必要です。 [デバッグ]ボタンが表示されないタイプのエラーの場合は、 実際の作業でどんなことをしたタイミングでエラーになったか、 という情報が頼りです。 ユーザーフォームモジュールに書かれた各種のイベントプロシージャの内、 どのプロシージャが呼び出されたタイミングでエラーになったのか、、、 そこから辿っていけばある程度、原因となる記述を(最悪でもプロシージャ単位で)特定することが可能です。 例えば、CommandButton1をクリックした場合に発生するなら、 CommandButton1_Clickの記述をチェックします。 ご自分で記述内容の誤りを見つけることが出来ない場合は、問題の箇所の記述を提示する必要があります。 今回の問題が解決してからでも、デバッグについて勉強してみてください。 コーディングとデバッグは、「料理と洗い物(食器洗い)」のような関係と考えてください。、 差し当たり、怪しいイベントプロシージャの先頭に、   Stop と一行Stop ステートメントを一時的に書き加えておいて、 実行時にデバッグモードに切り替わり、Stopの行がハイライトされますから、 その状態から、キーボードのF8キーを繰り返し押すことで、 コードを1行ずつ実行します。 Excelブック関連のオブジェクトを処理している限りでは、殆どの場合、 デバッグモードでもエラーを再現できますから、 どの行がエラーなのか、確認するのは難しいことではありません。 > ユーザーフォームで使用するファイルの表示中に > そのようなエラー画面が出てきても仕方がないと思うのですが、 仕方がない、なんてことはありません。 どんな処理をしている時のエラーなのか、ということが判らないと 何も言えません。 そもそも不可能な処理をしようとしている?というような意味なら、 処理の仕方そのものを再検討するべきです。 > ユーザーフォームはマルチ画面を作成したので マルチページコントロールを使っているのかな?という所までは察することが出来ますが、 > ファイルは「出力ファイルC」も出すことができる仕様です。 これはちょっと理解できません。 尚、もしかして"ユーザーフォームはマルチ画面"というのが、 ユーザーフォームを複数、同時に表示する、という意味でしたらば、 別の観点からの話も必要ですが、ここでは触れません。 > また、「出力ファイルA」「出力ファイルC」は > コンボボックスで選択した西暦がファイルの先頭に付くので > (例:2014_出力ファイルA.xls) > 必ず同じファイル名が出力されるとは限りません。 以前のご質問に私がお応えしたものでは、ブックやシートについて 存在しないものを指定した場合のエラー回避は出来ていたと思いますから、 恐らくまだ見ぬ記述に原因があるのでしょうけれど。 今回チェックするべき記述としては、 WorkBooks()、Sheets()、など、 括弧の中に指定した値が適切かどうかが主です。   WorkBooks.Open "フォルダパス\ブック名.xls" と、ブックを開く時はフルネームでも、 既に開いているブックを参照する時は   WorkBooks("ブック名.xls").Sheets("シート名")..... のようにショートネームで指定する必要がある、とか。   WorkBooks.Open "フォルダパス\ブック名.xls" を二重に開こうとしている、とか。 逆に、どこかで   WorkBooks("ブック名.xls").Close しているのに   WorkBooks("ブック名.xls").Sheets("シート名")..... のような呼び出しをしているとか。 単に、フォルダ名やファイル名の指定と実際の名前に細かな相違があるとか、 ファイル名の文字列の整形に失敗しているとか、 変数に名前を格納するのを忘れている箇所がある、とか。 一応参考にして、疑いの目で客観的に見直すようにしてみてください。 > なので、そのようなエラーが表示されないようにしたいのですが可能でしょうか? > また、特別なコードは記述していないのですが、 > なのでボタンとかコンボボックスのコードを書けばよいのか・・・という感じなのですが、 > どのように対処すればよいかわかりません。 問題の切り分けに努め、エラーの原因となる記述を付き止めて、 その記述の直し方を相談する、というのが理想的ではありますが、 場合によっては丸ごと提示しないと解らないこともあるでしょう。 また、何らかの記述を書き加える前は問題なく動作していた、 というような記憶も重要な手がかりになりますし、 コーディング中にデバッグや動作確認をマメに行うようにできれば、 問題を先送りすることも減ります。 > それと、出力したファイルの内容を確認するためにアクティブには、 > ユーザーフォーム画面を終了させるしかならず、 > そもそもそうゆう仕様なのかがわかりません。 ユーザーフォームを閉じた方が、(画面を広く使え)シートの内容を確認し易いですから、 閉じることに支障がないなら閉じる方が良いという考え方が多いと思います。 ユーザーフォームを閉じたくない場合は、 ユーザーフォームの表示方法をモードレスにしておけばいいです。 具体的には、  UserForm.Show に引数をしていして  UserForm.Show vbModeless のようにします。 但し、モーダル表示を前提にデザインされたUserFormが そのままモードレス表示で完全に機能するとは限りません。 この点は簡単に説明できるものではありませんので、 実際に、そして具体的に経験する中で習得するしかありません。 > ユーザーフォームを作成するのは初めてなので初心者丸出しで > お恥ずかしい限りなのですが、 > どなたかアドバイスいただけますと幸いです。 > こんな抽象的ですが、どうお伝えすればよいのかがそもそもわからず困っていて、 > それに時間もなく頭を抱えているので > お手柔らかに願います。 "お手柔らか"なレスというのが、どんなものかってそれは人それぞれだと思いますが、 抽象的な質問文を今は書いていたとしても、この前よりは解り易い、とか、 次はもっと具体的、とか、そういうのを見ることができれば、 こちらにとっては、やりがいにも繋がります。 エラーもデバッグも、初心者とか、関係ないです。 今でも私は毎日のようにエラー(バグ)と格闘していますし、 エラーを出して解決した数だけ自分のスキルが上がるものとさえ思っています。 "間違い探しゲーム"のようなものだったりする訳ですが、 QA掲示板を介して回答する立場では、具体物が見えないもどかしさで力及ばぬ場面も多かったり、 質問者さんも客観的な観察をすることが出来なくて迷い、さぞ心細いことでしょう。 ですが、問題点を特定(限定)することさえできれば、解決できないことはありませんから、 "間違い探しゲーム"、頑張ってみてください。

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

関連するQ&A