EXCELに直線を引きたい


トッチャン  2007-10-05 18:05:07  No: 137698

Excelに手作りで「折れ線グラフ」を作成しているのですが、
以下のコードですと、EXCELのアプリケーションを閉じているつもりなのに、
プロセスが残ってしまい、2回連続で実行すると「実行時エラー'462':
リモートサーバがないか、使用できる状態ではありません。」とエラー表示されます。

■のコード(Selection.ShapeRange.〜)1行をコメント化すると正常に動作するのですが、
直線の太さ、色等を指定したいのです。
色々調べたのですが、解決方法(というより直線の修飾方法)が分からず困っています。

アドバイスを頂きたいのですが、よろしくお願いします。(長文ですみません)

    Private Sub Command1_Click()
    
        Dim objExl              As Excel.Application
        Dim objBook             As Workbook
    
        Set objExl = CreateObject("Excel.Application")
    
        'ブックを開く
        Set objBook = objExl.Workbooks.Open("C:\須佐\Vb\ICCバージョンアップ\01.Doc\Book1.xls")
    
        'EXCELをタスクバーに表示するか
        objExl.Visible = False
    
        With objBook.Worksheets(1)
                .Shapes.AddLine(0, 100, 300, 200).Select    '線を引く
                Selection.ShapeRange.Line.Weight = 0.75     '■線の太さ
        End With
    
        'ブックを閉じる時にメッセージを表示しない
        objExl.DisplayAlerts = False
    
        'ブックをセーブしないで閉じる
        objBook.Close SaveChanges:=False
    
        'メモリの開放
        Set objBook = Nothing
        objExl.Quit
        Set objExl = Nothing
    
    End Sub

環境は以下のとおりです。
WindowsXP Professional(SP2)
VB6.9 SP5
Excel 2003


魔界の仮面弁士  2007-10-05 18:38:37  No: 137699

コードをもう一度見直してみましょう。
多くの場合、Selection を使わずとも操作できるはずですよ。

たとえば、
  oSheet.Shapes.AddLine(0, 100, 300, 200).Line.Weight = 0.75
とか。

> Set objBook = Nothing
今回の場合、Nothing 代入は必ずしも必須ではありません。

objBook 自体が Sub Command1_Click() 内の変数なので、
プロシージャを抜けた時点で、自動的に参照されなくなります。

> VB6.9 SP5
何故(SP6 ではなく)SP5 なのでしょう?

# "VB6.9" は、VB6.0(あるいは VBA6.5 ?)の誤記でしょうけれども。


トッチャン  2007-10-05 18:49:46  No: 137700

とても分かり易い回答をありがとうございました。
早速試してみます。

ちなみに色や始点のスタイルを同時に変えるこは
出来るのでしょうか?
図々しいついでに、教えて頂けないでしょうか?

よとしくお願いします。


魔界の仮面弁士  2007-10-05 18:52:24  No: 137701

> Selection.ShapeRange.Line.Weight = 0.75     '■線の太さ

もし、Selection に頼る場合であっても、最低でも、
objExl.Selection〜 などのコードにしましょう。

単に Selection だけ書いてしまうと、たとえば、Excel を 2 つ同時に
  Set objExl1 = CreateObject("Excel.Application")
  Set objExl2 = CreateObject("Excel.Application")
と起動した場合、どちらが操作されるか曖昧になってしまいますよね。

そして起動数が 1 つだけだったとしても、Selection の呼び出しによって、
Excel への内部的な参照が増加してしまうため、Excel が終了しなかったり
2 回目以降の操作が失敗するなどの弊害が出てしまうわけです。

Excel VBA がオブジェクト名を修飾しないで済むのは、それが
「自分自身」を表すことが明確であるからです。外部から操作する場合は、
どのオブジェクトのプロパティを操作しようとしているのかを、
省略せずに明記する必要があります。

> 解決方法(というより直線の修飾方法)が分からず困っています。
こういう時は……先のコードを元に、
  MsgBox TypeName(Selection.ShapeRange.Line)
  MsgBox TypeName(Selection.ShapeRange)
などを実行してみてください。
それぞれ、『LineFormat』『ShapeRange』などの型名を得られるはずです。

次に、[F2]キーで表示される「オブジェクト ブラウザ」を使って、
それらの型を調べてみると、
    ShapeRange という型には、Line プロパティがあり、
    その Line プロパティは、LineFormat 型のオブジェクトを返す。
という事がわかるはずです。

そして、「.Shapes.AddLine(0, 100, 300, 200))」は Shape 型を返すので、
あとは「オブジェクト ブラウザ」を用いて、
  (1) Shape 型のメンバで、LineFormat 型を返すメンバが存在するか?
  (2) Shape 型のメンバで、ShapeRange 型を返すメンバが存在するか?
  (3) Shape 型のメンバで、「LineFormat 型を返すメンバを持つオブジェクト」を返すメンバが存在するか?
  (4) Shape 型のメンバで、「ShapeRange 型を返すメンバを持つオブジェクト」を返すメンバが存在するか?
といった調査をしていけば、目的のコードを割り出せるかと思います。

今回の場合でいえば、(1) の段階で「Line プロパティ」を発見できるかと。


魔界の仮面弁士  2007-10-05 18:55:36  No: 137702

> ちなみに色や始点のスタイルを同時に変えるこは
> 出来るのでしょうか?

同時というか、個別に設定する事は簡単にできますよ。

オブジェクト ブラウザで、LineFormat オブジェクト等に、
それらしい名前のメンバが無いか、探してみてください。


トッチャン  2007-10-05 19:43:24  No: 137703

魔界の仮面弁士さん、本当にありがとうございます。
お陰様で解決出来そうです。

また、今までに私自身の中で曖昧にしていた事も
頂いたアドバイスにより今後、理論的に考える事が出来そうです。

丁寧な説明、貴重なお時間を割いて頂き本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加