この掲示板は AutoCADマクロ屋本舗 の掲示板です。

【 注意 】最初に必ず ↓↓ 下記内容 ↓↓ を参照ください。
① マクロが分からない方は、まず 【 マクロ講座 】 を参照ください。
② 質問の前に 【 マクロ使用前の注意事項 】 をお読みください。
③ 質問する時は、新規投稿フォーム下の【 新規投稿時のお願い 】を必ずお読みください。

Excelの値を使用したい。
お世話になっております。
こんな事が出来ればと思い書き込みさせて頂きます。Autocadは2016のレギュラー版です。
実際はもう少し複雑ですが、添付した画像をご参照ください。
Excelで作成したファイルがあります。今回は図中に貼り付けてありますが、
貼り付けてもいいですが、貼り付ける必要はありません。
単純に長方形を描いた図面があります。
この図面中の長方形の縦横の寸法値を、Excelの上から順番に、
図面に反映させて、印刷していきたいです。<例>縦が700の時横は1400です。
ただし、長方形は寸法値が変わっても大きさを変えてはいけません。
寸法値というより、テキストが張り付けてある感じです。
大変横着な発想ですが、これを勝手に読み込んで印刷まで出来れば申し分がないのですが、
縦、横のデータ量は毎回異なります。
素人考えで出来るかどうかもわかりませんが、ご対応をお願い申し上げます。
  • トモエ
  • 2017/02/05 (Sun) 07:55:27
Re: Excelの値を使用したい。
おはようございます。

内容的にマクロでは無理そうなので
エクセル側からVBAでやるか・・・
CAD側でLispでやるか・・・
どちらかになると思いますが・・・
  • とってぃ
  • 2017/02/06 (Mon) 08:25:48
Re: Excelの値を使用したい。
印刷のところをダイアログを使わずコマンドだけで表現してくれれば出来ると思います。
  • zukki-
  • 2017/02/06 (Mon) 13:06:08
Re: Excelの値を使用したい。
印刷のところがわからないのですがとりあえずこんな感じです。
set-get-env.lspと同じ操作をして下さい。
同じでなくてロードすればいいのですが。。。
そしてコマンドラインでtateyoko、エンターで


;;;----------ここから下をコピペ---------------
(vl-load-com)

(defun c:tateyoko nil
(setq xlapp (vlax-create-object "Excel.Application"))
;(vlax-dump-object xlapp t)
(vlax-put xlapp 'visible t)
(setq fn (vlax-invoke xlapp 'getopenfilename "Microsoft Excelブック,*.xls?"))
(vlax-invoke (vlax-get xlapp 'workbooks) 'open fn)
(setq rng (vlax-invoke xlapp 'inputbox
"貼り付けるテキストの縦横セルを選択"
nil nil
nil nil
nil nil
8))
;rngから縦横をを取り出す
(setq dimlis nil)
(vlax-for tmp rng
(setq dimlis (cons (vlax-get tmp 'text) dimlis)))
(setq dimlis (reverse dimlis))

(vlax-invoke xlapp 'quit)
(vlax-release-object rng)
(vlax-release-object xlapp)

;(縦 . 横)のリストにする
(setq tmp dimlis
dimlis nil)
(while tmp
(setq dimlis (cons (cons (car tmp) (cadr tmp))
dimlis))
(setq tmp (cddr tmp)))
(setq dimlis (reverse dimlis))

(alert "縦のTEXTを選択")
(setq tate (ssname (ssget ":S" '((0 . "TEXT"))) 0))
(alert "横のTEXTを選択")
(setq yoko (ssname (ssget ":S" '((0 . "TEXT"))) 0))

(mapcar '(lambda (arg)
(entmod (subst (cons 1 (cdr arg)) (assoc 1 (entget tate)) (entget tate)))
(entmod (subst (cons 1 (car arg)) (assoc 1 (entget yoko)) (entget yoko)))
(alert "")
;印刷の処理
)
dimlis)
(princ)
) ;defun

(princ "\nc:tateyokoがロードされました。")
  • zukki-
  • 2017/02/06 (Mon) 13:26:14
Re: Excelの値を使用したい。
zukki様お世話になります。
お返事ありがとうございます。
ごめんなさい。わかりません。
まず、コマンドラインに以下の部分を貼り付けました。
ロードされたと思います。

①コマンドラインにTATEYOKOを入力。
②Excelを開くようにもとめられるので、ファイルを選択。
③開いたExcelファイルで、”貼り付けるテキストの縦横ムセルを選択”で 
 縦横の必要な部分のセルのみを選択してOK
④”AutoCADメッセージ”縦のTEXTを選択で
 図面中のテキストを選択、OKしてEnter

なんですが、ここでまた②に戻ってしまいます、
私の操作手順がなんか間違っているだけと思います。
スイマセンもう少し操作手順を説明して頂けますでしょうか。
  • トモエ
  • 2017/02/07 (Tue) 05:35:01
Re: Excelの値を使用したい。
ちょっと変えたのでコピペお願いします。

③の選択の仕方は図を見てください。
④で最後エンターを押しているのでもう一度コマンドを実行しています。
④で縦のTEXTを選択した後、横のTEXTを選択するダイアログが出るはずです。
横のTEXTを選択した後、コマンドラインに印刷するかどうかのメッセージが選択した行数分出ます。
これは確認のためのものでTEXTが変わったかどうか確認するためのもので、
印刷のコマンドラインがわかればこの部分はコメントアウトしても良いです。

TEXTと書いたのはTEXTオブジェクトで寸法オブジェクトでは駄目です、単なる一行TEXTを選択してください。


;----------------ここからコピペ---------------------------------
;zukki-作
(vl-load-com)

(defun c:tateyoko nil
(setq xlapp (vlax-create-object "Excel.Application"))
;(vlax-dump-object xlapp t)
(vlax-put xlapp 'visible t)
(setq fn (vlax-invoke xlapp 'getopenfilename "Microsoft Excelブック,*.xls?"))
(if (= fn 0)
(exit))

(vlax-invoke (vlax-get xlapp 'workbooks) 'open fn)
(setq rng (vlax-invoke xlapp 'inputbox
"貼り付けるテキストの縦横セルを選択"
nil nil
nil nil
nil nil
8))
(if (= rng 0)
(exit))

;rngから縦横をを取り出す
(setq dimlis nil)
(vlax-for tmp rng
(setq dimlis (cons (vlax-get tmp 'text) dimlis)))
(setq dimlis (reverse dimlis))

;;; (setq i 0)
;;; (repeat (vlax-get rng 'count)
;;; (vla-item rng i)
;;; (setq i (1+ i)))

(vlax-invoke xlapp 'quit)
(vlax-release-object rng)
(vlax-release-object xlapp)
(setq rng nil
xlapp nil)

;(縦 . 横)のリストにする
(setq tmp dimlis
dimlis nil)
(while tmp
(setq dimlis (cons (cons (car tmp) (cadr tmp))
dimlis))
(setq tmp (cddr tmp)))
(setq dimlis (reverse dimlis))

(alert "縦のTEXTを選択")
(setq tate (ssname (ssget ":S" '((0 . "TEXT"))) 0))
(alert "横のTEXTを選択")
(setq yoko (ssname (ssget ":S" '((0 . "TEXT"))) 0))

(mapcar '(lambda (arg)
(entmod (subst (cons 1 (car arg)) (assoc 1 (entget tate)) (entget tate)))
(entupd (cdr (assoc -1 (entget tate))))
(entmod (subst (cons 1 (cdr arg)) (assoc 1 (entget yoko)) (entget yoko)))
(entupd (cdr (assoc -1 (entget yoko))))
;(command "regen")
(initget (+ 1) "Yes No")
(getstring "印刷します? [Yes/No]:")
;印刷の処理
)
dimlis)
(princ)
)
;defun

(princ "\nc:tateyokoがロードされました。")

  • zukki-
  • 2017/02/07 (Tue) 08:24:57

返信フォーム






プレビュー (投稿前に内容を確認)