こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBAのユーザーフォームについて

Excel VBAでユーザーフォームを作成しています。

ユーザーフォームで出力したファイル
「出力ファイルA」

ユーザーフォームで使用するファイル
「ファイルB」

を、起動していると必ず「インデックスが範囲内にありません」
といった内容のエラーが表示されます。

ユーザーフォームで使用するファイルの表示中に
そのようなエラー画面が出てきても仕方がないと思うのですが、
ユーザーフォームはマルチ画面を作成したので
ファイルは「出力ファイルC」も出すことができる仕様です。

また、「出力ファイルA」「出力ファイルC」は
コンボボックスで選択した西暦がファイルの先頭に付くので
(例:2014_出力ファイルA.xls)
必ず同じファイル名が出力されるとは限りません。

なので、そのようなエラーが表示されないようにしたいのですが可能でしょうか?
また、特別なコードは記述していないのですが、
なのでボタンとかコンボボックスのコードを書けばよいのか・・・という感じなのですが、
どのように対処すればよいかわかりません。

それと、出力したファイルの内容を確認するためにアクティブには、
ユーザーフォーム画面を終了させるしかならず、
そもそもそうゆう仕様なのかがわかりません。

ユーザーフォームを作成するのは初めてなので初心者丸出しで
お恥ずかしい限りなのですが、
どなたかアドバイスいただけますと幸いです。

こんな抽象的ですが、どうお伝えすればよいのかがそもそもわからず困っていて、
それに時間もなく頭を抱えているので
お手柔らかに願います。

よろしくお願い致します。

投稿日時 - 2014-03-19 00:42:59

QNo.8519668

すぐに回答ほしいです

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

こんにちは。

> を、起動していると必ず「インデックスが範囲内にありません」
> といった内容のエラーが表示されます。

エラーメッセージは先頭にあるエラーナンバーを添えて、
正確な文言を提示するように心がけましょう。
エラーメッセージのダイアログには、多くの場合
[デバッグ]というボタンが表示されます。
このボタンの有無も解決に役立つ情報のひとつです。
[デバッグ]ボタンを押すことができるタイプのエラーなら、
ボタンを押すことでデバッグモードに切り替えることが出来ます。
エラーの原因となっている記述が行ごと、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掲示板を介して回答する立場では、具体物が見えないもどかしさで力及ばぬ場面も多かったり、
質問者さんも客観的な観察をすることが出来なくて迷い、さぞ心細いことでしょう。
ですが、問題点を特定(限定)することさえできれば、解決できないことはありませんから、
"間違い探しゲーム"、頑張ってみてください。

投稿日時 - 2014-03-19 13:57:46

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問