タイトル : Re: Excel処理の繰り返しでNG 投稿日 : 2010/02/11(Thu) 18:38 投稿者 : 魔界の仮面弁士
> Dim xlApp As Excel.Application > Set xlApp = CreateObject("Excel.Application") 参照設定している場合は、 Set xlApp = New Excel.Application と書けますよ。 参照設定していない場合は、 Dim xlApp As Object Set xlApp = CreateObject("Excel.Application") のように、CreateObject が必要ですけれどね。 > xlApp.Visible = True > With xlSheet ここまでは良いですが… > .Rows("10:10").Select '行を選択 > With Selection 'コピーして下へ ここが NG。 ここで「Selection」と書いていますが、対象オブジェクトが指定されていません。 どのオブジェクトの Selection プロパティなのか、親オブジェクトを明記しましょう。 たとえば仮に、このアプリから Excel を同時に 2 つ起動していたとしたらどうでしょう。 その場合、「xlSheet.Rows("10:10")」であれば、変数 xlSheet の方の Excel を 操作しているのだと分かりますが、これが「Rows("10:10")」や「Selection」のように 親オブジェクト無しで指定されると、どちらを操作しようとしているかが、 曖昧になってしまいますよね。 親オブジェクトが指定されなかった場合、暗黙の Excel インスタンスが グローバル オブジェクトとして参照される事になります。Excel VBA であれば、 「自分自身」を操作するだけなので問題はありませんが、外部(VB6 等)から 操作する場合には、親オブジェクトを必ず指定する必要があります。 親オブジェクトの指定漏れは、今回のような 2 回目以降の処理が行われないという 問題だけではなく、Excel が終了しない(Excel が非表示のまま残ってしまう)という、 解放漏れの障害をも引き起こしますので、十分に注意してください。 なお、参照設定を使わない場合には、このような親オブジェクトの指定漏れの箇所が 「オブジェクトが必要です」のコンパイルエラーになるため(Options Explicit の場合)、 問題箇所を容易に発見できます。 > .Range("B15:E15").Select > With Selection.Borders(xlEdgeBottom) このあたりも同様ですね。 また、そもそも Selection というのは多用すべきコードではありません。 普段、VB6 を操作する際にも、 Form2.Text1.Text = "New Text" というコードを、わざわざ Form2.Activate ActiveForm.Text1.SetFocus ActiveForm.ActiveControl.Text = "New Text" などと書いたりはしませんよね? それと同じ事です。 |