DOBON.NET DOBON.NETプログラミング掲示板過去ログ

AccessによるVBAについて

環境/言語:[XP,Office95]
分類:[その他]

現在、Office95もしくは97で作られたAccess中のVBAに困っています。

どなたか、お力を貸して下さい。内容は、AccessからExelのグラフ機能を用いて
グラフを作成し、Accessのアプリケーション上で表示しているプログラムで、以下の構文で、「このメソッド若しくはプロパティは使用できません。」との内容のエラーが表示されてしまいます。エラーの内容から、Officeのバージョンが、作成時と現在使用しているものが違うためなのか??と思ったのですがOfficw97で開いても、同じ現象です。OSについては、まだ試していません。ちなみに今は、XPで、当時は?です。

エラーとなる構文

'F_グラフ7VISANの画面消去
Forms![F_グラフVISAN]!VISAN.DrawingObjects.Delete

ここまで

おそらく"DrawingObjects"の文法が違うのかな??と考えています。
申し訳ありませんが、どなたか至急ご教授下さい。お願い致します。
> ちなみに今は、XPで、当時は?です。
http://www.ruriplus.com/msaccess/tch/tch_041.html

> 以下の構文で、「このメソッド若しくはプロパティは使用できません。」
> 'F_グラフ7VISANの画面消去
> Forms![F_グラフVISAN]!VISAN.DrawingObjects.Delete
まずはその中の、どの部分がエラーになっているかを確認しておきましょう。
1) Forms![F_グラフVISAN]
2) Forms![F_グラフVISAN]!VISAN
3) Forms![F_グラフVISAN]!VISAN.DrawingObjects
4) Forms![F_グラフVISAN]!VISAN.DrawingObjects.Delete

なお、環境によっては、半角カタカナが自動的に全角カタカナに
補正されてしまうケースがあります。今回の件とは関係ないかも知れませんが、
そうした補正を防ぐためにも、Forms("F_グラフVISAN")の構文を使っておいた方が
無難かもしれません。

> おそらく"DrawingObjects"の文法が違うのかな??と考えています。
とりあえず、Excel8.OLB には、DrawingObjects オブジェクトに Delete メソッドが
実装されていました。となると今回の場合、VISAN メンバが返すオブジェクトの
データ型が何であるのか、また、そのオブジェクトが DrawingObjects プロパティを
持っているのかどうかを確認する必要がありそうです。
>>'F_グラフ7VISANの画面消去
>>Forms![F_グラフVISAN]!VISAN.DrawingObjects.Delete
> まずはその中の、どの部分がエラーになっているかを確認しておきましょう。
> 1) Forms![F_グラフVISAN]
> 2) Forms![F_グラフVISAN]!VISAN
> 3) Forms![F_グラフVISAN]!VISAN.DrawingObjects
> 4) Forms![F_グラフVISAN]!VISAN.DrawingObjects.Delete

分かりましたやってみます!!
やり方が良く分かってませんが・・・。



> なお、環境によっては、半角カタカナが自動的に全角カタカナに
> 補正されてしまうケースがあります。今回の件とは関係ないかも知れませんが、
> そうした補正を防ぐためにも、Forms("F_グラフVISAN")の構文を使っておいた方が
> 無難かもしれません。
>

確かに、プログラム中で、form名は”_”でプログラム中は”_”だったりばらばらです。これが影響しているのでしょうか??
!マークを取れば良いのですよね?


>>おそらく"DrawingObjects"の文法が違うのかな??と考えています。
> とりあえず、Excel8.OLB には、DrawingObjects オブジェクトに Delete メソッドが
> 実装されていました。となると今回の場合、VISAN メンバが返すオブジェクトの
> データ型が何であるのか、また、そのオブジェクトが DrawingObjects プロパティを
> 持っているのかどうかを確認する必要がありそうです。


分かりました、やってみます!!

本当に助かります!!有難うございます。
試しに.Deleteを消して実行してみました。

結果:
実行時エラ−'438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません。


と出ました。

その他、フォーム名称等の部分を変更し実行を試みましたが、変更すると
フォーム自体も認識できない状態になってしまいました。


'F_グラフ7VISANを開く
STDOCNAME = "F_グラフVISAN"
DoCmd.OpenForm STDOCNAME, acDesign, , , , acHidden, stLinkCriteria
'F_グラフ7VISANの画面消去
Forms![F_グラフVISAN]!VISAN.DrawingObject


原因は、このフォーム(Forms![F_グラフVISAN]!VISAN)が、このプロパティ(DrawingObject)を認識できなくなっている事のように思います。
しかし、このプロパティを持っているか?をどのように確認したらいいのかが分かりません。

また、DrawingObjectに限らず、プログラム上のフォームプロパティ全部を認識出来なくなっています。事実、以下の構文実行時にも同じエラーが出ました。

目盛線:

Forms![F_グラフVISAN]!VISAN.Lines.Add(X11, Y11, X22, Y22).Select


フォームがすべてのプロパティを認識できなくなる現象が起こる可能性を教えてください。


周りにも分かる者がいなく、大変困り果てています。
どうか、教えてください!!
お願いいたします。
> 原因は、このフォーム(Forms![F_グラフVISAN]!VISAN)が、このプロパティ(DrawingObject)を認識できなくなっている事のように思います。
前回の質問では "DrawingObjects" 、今度は "DrawingObject" なのですね?


> しかし、このプロパティを持っているか?をどのように確認したらいいのかが分かりません。
まずは、
 MsgBox TypeName(Forms![F_グラフVISAN])
 MsgBox TypeName(Forms![F_グラフVISAN]!VISAN)
などとして、それぞれのデータ型を調べてください。

そしてもし、!VISAN が返す型が ObjectFrame だった場合には、
 MsgBox TypeName(Forms![F_グラフVISAN]!VISAN.Object)
 MsgBox Forms![F_グラフVISAN]!VISAN.Class
のように、どのオブジェクトを使っているのかも調べてみてください。


各メンバの型がわかったら、そのオブジェクトをAccess の
『オブジェクト ブラウザ』で調べれば、その型のオブジェクトが、
どのようなプロパティ/メソッドを持っているかを調査できるかと。

> また、DrawingObjectに限らず、プログラム上のフォームプロパティ全部を認識出来なくなっています。事実、以下の構文実行時にも同じエラーが出ました。
『フォームプロパティ』とは、「(コントロールやフォームの)Form プロパティ」
という意味ですか? それとも、「Form オブジェクトの全プロパティ」の意味ですか?

> Forms![F_グラフVISAN]!VISAN.Lines.Add(X11, Y11, X22, Y22).Select
ActiveXコントロールをお使いなのでしょうか?

Access のオブジェクトに、DrawingObject という名前のメンバを持つものは
居ませんし、Lines プロパティにしても、Lines の名前を持っているのといえば、
標準モジュール等(Moduleオブジェクト)ぐらいだったような…。

# Excel でも貼っているのかなぁ。
> !マークを取れば良いのですよね?

VB や VBA の世界では、
 s = obj!abcde
という表現は、
 s = obj.規定のプロパティやメソッド("abcde")
を指している事になります。


たとえば、Access の Forms コレクションの規定メンバは、
Itemプロパティですから、
 Forms!F_グラフVISAN
という表現は、
 Forms("F_グラフVISAN")
とか、
 Forms.Item("F_グラフVISAN")
などといったコードを意味する、という事になります。


> プログラム中で、form名は”_”でプログラム中は”_”だったりばらばらです。これが影響しているのでしょうか??
影響するかどうかはさておき。

[〜] で囲まれた部分は、大文字小文字などが変化してしまう可能性がありますよね。
一方、"〜" で囲まれた部分は文字列ですから、勝手に変化してしまう事がありません。

ですから、「Forms!フォーム名」よりは、「Forms("フォーム名")」の方が
問題が少ないのではないか……という話です。
> # Excel でも貼っているのかなぁ。

ご回答を頂き、大変感謝しております。またまた、教えて頂きたいのですが、“# Excel”を貼っているとどのような機能があるのでしょうか?

確かに、デ−タベ−ス(Access)に蓄えたデ−タを、Excelのワークシ−ト上にExcelのグラフ機能を用いてグラフ化して表示しております。これは、“# Excel”の機能なのでしょうか?

今回、エラ−が出ているのは、このExcel機能を用いた部分と関連した構文です。具体的には、デ−タをデ−タベ−ス(Access)から引っ張ってきて、プロットするときです……。何かの、設定が変わってしまったのでしょうか?

プログラムの構文は変更していないのに、その他要因??がきっかけとなりプログラムがエラ−を出すようになってしまいました。

お忙しい中、沢山のアドバイスを頂き感謝しております。今後とも宜しくお願い致します。
2006/05/18(Thu) 10:45:34 編集(投稿者)

>># Excel でも貼っているのかなぁ。
> “# Excel”を貼っているとどのような機能があるのでしょうか?

いやいや、“# Excel”ではなく、“Excel”です。

物理行頭にある > が引用記号であるように、物理行頭の # はコメント文、
あるいはそこから転じて、独り言などを表す表記として使われたりするの
ですが…もしかして、この文化は廃れつつあるのかな。(汗
あとは、「名前@居場所」とか「名前%状態」と表記する文化とか。
http://www.drive.co.jp/asp/faq/faq_sanka.asp?q_id=26380&genre=FreeTalk


それはともかく、要するに
>> Access のオブジェクトに、DrawingObject という名前のメンバを持つものは
>> 居ませんし、Lines プロパティにしても、Lines の名前を持っているのといえば、
>> 標準モジュール等(Moduleオブジェクト)ぐらいだったような…。
の点が問題だという事です。

そして Access のオブジェクトには、DrawingObjects や Lines といった
メンバが存在しませんが、Excel のオブジェクトには、それらのメンバが
存在する……という事です。


ただ、DrawingObjects というメンバを持った Excel のオブジェクトは 1 つだけでは
ありませんし、少なくとも掲示板を見ている第三者には、"VISAN" が何であるか
わからないわけですから、まずは「どのオブジェクトを操作しようとしているのか」を
明らかにして欲しかったのです。それが先の、
> そしてもし、!VISAN が返す型が ObjectFrame だった場合には、
>  MsgBox TypeName(Forms![F_グラフVISAN]!VISAN.Object)
>  MsgBox Forms![F_グラフVISAN]!VISAN.Class
> のように、どのオブジェクトを使っているのかも調べてみてください。
などの発言にも繋がってくるわけで。
申し訳ありません。素人過ぎてなかなか理解できなくて…。
何とかやってみまして、以下の内容が表示されました!!
これで、何かがわかるのでしょうか??

たびたび馬鹿な質問で申し訳ありませんが…。
アドバイスをお願い致します。

>  MsgBox TypeName(Forms![F_グラフVISAN])

IForm_F_グラフVISAN

>  MsgBox TypeName(Forms![F_グラフVISAN]!VISAN)

ObjectFrame

>  MsgBox TypeName(Forms![F_グラフVISAN]!VISAN.Object)

Workbook

>  MsgBox Forms![F_グラフVISAN]!VISAN.Class

Excel.Sheet5
> これで、何かがわかるのでしょうか??
Office で使用されるグラフって、Microsoft Graph というコンポーネントや、
Excel Chart など、幾つか種類があるんですよ。


>> MsgBox TypeName(Forms![F_グラフVISAN]!VISAN.Object)
> Workbook
ん…Workbookの方ですか。という事は、おそらくこの場合は、
 Debug.Print Forms![F_グラフVISAN]!VISAN.Object.Sheets.Count
が「2」を返してきて、
 Forms![F_グラフVISAN]!VISAN.Object.Sheets(1または2)
 Forms![F_グラフVISAN]!VISAN.Object.Charts(1)
 Forms![F_グラフVISAN]!VISAN.Object.Worksheets(1)
が、それぞれ「グラフシート」と「ワークシート」を示すかと思います。

となれば、もしかしたら、
Call Forms![F_グラフVISAN]!VISAN.Object.Charts(1).Lines.Add(X11, Y11, X22, Y22)
などのように書けるかも知れません。

もっとも、グラフシート内ではなく、ワークシート上にグラフが置いてあるという
可能性もあるので、実際のところは実物を見ないとわかりませんけれどね。


なお、!VISAN.Object 以降のメンバについては、Access VBA とは関係のない
世界なので、もしも調べるのであれば、Excel VBA の資料をあたってみてください。
> もっとも、グラフシート内ではなく、ワークシート上にグラフが置いてあるという
> 可能性もあるので、実際のところは実物を見ないとわかりませんけれどね。

そうなんです!!
Accessの“F_グラフVISAN”フォームからフォームデザインを開いてワークシートオブジェクトの編集を開くと、“F_グラフのワークシート”というEXCELが開き、そのシートのSheet1にグラフが書かれています!これが置いてあるという事でしょうか???

お願いします。教えてください!!!
2006/05/18(Thu) 21:32:32 編集(投稿者)

> そのシートのSheet1にグラフが書かれています!

Sheet1 は、ワークシートですか? グラフシートですか?
グラフシートなら、先述のように
 Call Forms![F_グラフVISAN]!VISAN.Object.Charts(1).Lines.Add(X11, Y11, X22, Y22)
になるでしょうし、ワークシートなら、
 Call Forms![F_グラフVISAN]!VISAN.Object.Worksheets(1).Lines.Add(X11, Y11, X22, Y22)
になるのでは。

あと、DrawingObjects.Delete の方も同様で、
 Forms![F_グラフVISAN]!VISAN.Object.Worksheets(1).DrawingObjects.Delete
とかかな。もし、特定のオブジェクトだけを削除したいなら、
 Forms![F_グラフVISAN]!VISAN.Object.Worksheets(1).DrawingObjects(1).Delete
とか。
ありがとうございました。
動き出しました。

お手数をお掛けして申し訳ありませんでした。

DOBON.NET | プログラミング道 | プログラミング掲示板