PDA

View Full Version : Access2007のフォームを開く方法について



jpnorisan
2008-12-30, 08:58 PM
こんな質問をして良いのか?と思いつつ、神頼みで、、

AutoCAD2008の図面上にある文字 ABC をダブルクリックしたときに、MS-Access2007の
AAA.mdb を開き、その中にあるフォーム BBB を開き、フィールドCCC中でABCと一致する
レコードを表示するものを作成したいのです。

AutoCADのVBAをはじめてトライしているのですが、まったくのお手上げです。
AutoCAD LTとAccessを使って同様のことは、Access側よりコントロールする形で
作成したことがあります。

そこで、上記のうち、AutoCAD2008の図面上にある文字をダブルクリックしたときに、MS-Access2007のAAA.mdb を開き、その中にあるフォーム BBB を開く部分を
ご指導いただけないでしょうか?これがわかれば、それをヒントにできそうです。

また、このような問題を解決するに適した
 ・資料・本・掲示板などございましたら、紹介してください。
よろしくお願いいたします。

u2
2008-12-30, 10:49 PM
質問に質問で返してもうしわけありませんが、

● 文字 ABC をダブルクリック・・・
 文字を選択してダブルクリックだと思いますが、ダブルクリックでないといけませんか?
 AutoCAD 本来のダブルクリックの動作、文字ならテキスト編集などの機能を置き換えますか?

 → ふつうはあるコマンドを作成して、そのコマンドを実行して文字図形を選択するという動作になります。

● MS-Access2007のAAA.mdb を開き
 Access を開く必要がありますか? AutoCAD も Access も起動して表示している状態を実現する必要があるのですか?

 → レスポンスをよくするなら Access のDB を ADO などを利用して開きます。フォームもAutoCAD VBA 側で作成します。
   どうしても両方、起動している状態が必要なら、AutoCAD の VBA から Access をActiveX オートメーションで使います。おすすめはできません。

 可能ならプログラム全体の設計を見直したらいかがでしょう?

 参考書はAutoCAD VBA なら大浦誠さん著の

「AutoCAD 2000 VBA入門」ですが、入手はできないかも。

 またこれから先は「日本語 - プログラミング (Programming)」フォーラムに場所を移して、続けましょう。

jpnorisan
2008-12-31, 04:51 AM
Yuji Suzuki さん

スピーディーなレスをいただきありがとうございます。

・今回は、AtutoCADとAccessを両方開きたいのです。

ご指摘の通りに
フォーラムをプログラミングに移動して続行していきたいと思います。
ありがとうございました。

jpnorisan
2008-12-31, 05:15 AM
フォーラム「日本語-AutoCAD」よりこちらに質問を移動しました。

こんな質問をして良いのか?と思いつつ、神頼みで、、

AutoCAD2008の図面上にある文字 ABC をダブルクリックしたときに、MS-Access2007の
AAA.mdb を開き、その中にあるフォーム BBB を開き、フィールドCCC中でABCと一致する
レコードを表示するものを作成したいのです。

AutoCADのVBAをはじめてトライしているのですが、まったくのお手上げです。
AutoCAD LTとAccessを使って同様のことは、Access側よりコントロールする形で
作成したことがあります。

そこで、上記のうち、AutoCAD2008の図面上にある文字をダブルクリックしたときに、MS-Access2007のAAA.mdb を開き、その中にあるフォーム BBB を開く部分を
ご指導いただけないでしょうか?これがわかれば、それをヒントにできそうです。

また次項につきましてもアドバイスをいただけたらと思っています。
既にAccessによるデータベースが完成しているために、上記のようなシステムを構築しようと
しているのですが
 ①Accessで作成したテーブル、フォーム、クエリー、レポートやそれらに付随するVBAは
   簡単にAutoCADの方に移植できるのでしょうか?
 ②AutoCAD上の文字をクリックまたは、ダブルクリックしたときに、前記のような動作を
  させたいのですが、これは、難しいのでしょうか?
  当初、今もなのですが、ダブルクリックイベントなどで比較的簡単に実現できると
  思っているのですが。ひょっとしたら、そんなイベントプロシジャーがないのでしょうか?
 ③Accessを開かなくともAccessで既に作成したテーブルやフォームにAutoCADより
  アクセスできるのでしょうか?具体的なコードをご指導いただけないでしょうか?

おそらく、初歩的な質問だと恐縮しますが、初めての経験で四苦八苦している状態
なのです。
よろしくお願いいたします。

nakajihy
2009-01-04, 04:15 PM
スレッドを移動、および結合させて頂きました。
よろしくお願い致します。

u2
2009-01-06, 08:42 AM
それでは今年もよろしくお願いいたします。
まず

● 図面上のダブルクリックで何かする・・・
 しつこいようですが、本来の AutoCAD の動作と重なるのでお勧めではありませんが、図面編
集を伴わない、何か専用のシステムならありうるとして、

BeginDoubleClick イベントを使います。
使用例は VBA の Help で BeginDoubleClick イベントをご覧ください。

● 正しい作法はあるコマンドを実行して図形を選択すると何かする・・・というものです
ThisDrawing.Utility.GetEntity returnObj, basePnt, "文字列を選択: "
などのコードで実現します。

● AutoCAD の VBA からACCESSを実行するのは
AutoCAD 側の VBA で Acccess のオブジェクトライブラリを参照設定するだけです。
Access の VBA の記述そのままで、AutoCAD側から使えます。この仕組みを
ActiveX Automation といいます。

Set AccessAppObj = New Access.Application
で Access オブジェクトを取得します。

● ACCESS を開かずに Access で作られたデータベースにアクセスする・・・
これがたぶん正しい方法です。 AutoCAD とは話題が離れますので、ADO などをキーワードに検索してみてください。

● またAutoCAD自身に データベースと図形を結合する DBconnect 機能もあります。
これもひととおり HELP やチュートリアルで確認してみてください。

● まぁ正月ですから ADO のサンプルコードもどうぞ

Sub Att2MDB()
Dim strMDBpath As String
Dim strTableName As String
Dim objEnt As AcadEntity
Dim objBlkRef As AcadBlockReference
Dim vntAttributes As Variant

strMDBpath = "TEST.mdb"
strTableName = "select top 1 * from テーブルTEST"

' ADO を使ってデータベース接続
Dim objConnection As New ADODB.Connection
objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & strMDBpath
objConnection.Open
' レコードセットの取得
Dim objRecordset As New ADODB.Recordset
' テーブルを開く
objRecordset.Open strTableName, objConnection, adOpenForwardOnly, adLockOptimistic

' 図面上の目的のブロックから属性値をレコードに
For Each objEnt In ThisDrawing.ModelSpace
If TypeOf objEnt Is AcadBlockReference Then
Set objBlkRef = objEnt
If objBlkRef.Name = "TEST" Then
vntAttributes = objBlkRef.GetAttributes
' レコード追加
With objRecordset
.AddNew
.Fields("ハンドル") = objBlkRef.Handle
.Fields("品名") = vntAttributes(0).TextString
.Fields("価格") = vntAttributes(1).TextString
.Fields("サイズ") = vntAttributes(2).TextString
.Update
End With
End If
End If
Next objEnt

' データベース接続を閉じる
objRecordset.Close
objConnection.Close
Set objRecordset = Nothing
Set objConnection = Nothing
End Sub



 

jpnorisan
2009-01-06, 05:04 PM
u2さん ありがとうございました。

・ADOサンプルコードを参考に、進めてみます。
 以前は、AutoCAD LT 、MSAccessをAcadRemoconを利用していたのですが
 なんか、一気にハードルが高くなった感じがしています。
・CAD上の文字をダブルクリックの件は
 u2さんのご指摘の通り、コマンド実行後、文字を選択しその内容を取得し、
 という方法にしたほうが、良いですね。

ありがとうございました。
今後ともよろしくお願いいたします。