tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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"
などと書いたりはしませんよね? それと同じ事です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。