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

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

VBA: 選択状態で終了としたいけど
選択状態で終了とし、ENTERで再度コマンドを実行させたいです。
(必要最小部分について、AIに作らせました)

1. LISPからVBAの"SelectOnlyLines"を呼び出します。
2. 線分が選択された状態で終了します
3. ENTERで再度"SelectOnlyLines"で実行しようとする。 →→→「SELECT」コマンドが実行されてしまう。

という状況です。
SELECTコマンドを送信してるのだから当然なのですが。

AIに、「SendCommandを使用せずに選択状態としてくれ」と指示しても、
ハイライトしているだけで選択状態とならないコードを提示されたり…
巡り巡って元のSendCommand使用を案内されてしまい解決に至りません。


ENTERで、VBAコードを再度実行するための方法があれば教えて下さい。

問題としているのは「全線分を取得するコマンドを繰り返し実行したい」(LISPのみ完結等の別手法を求めている)ではなく、
「現状SendCommandを用いているVBAコードを繰り返し実行したい」
ということであることをご承知おき下さい。


# LISPコード(VBA呼び出し用)
(defun c:SelectOnlyLines ()
(vl-vbarun "SelectOnlyLines")
(princ)
)

# VBAコード
Sub SelectOnlyLines()
Dim sset As AcadSelectionSet

On Error Resume Next
ThisDrawing.SelectionSets("LineSelectionSet").Delete
On Error GoTo 0
Set sset = ThisDrawing.SelectionSets.Add("LineSelectionSet")

sset.Select acSelectionSetAll, , , Array(0), Array("LINE")

If sset.Count > 0 Then
ThisDrawing.SendCommand ("_SELECT P" & vbCr & vbCr)
End If

sset.Delete
End Sub
  • Lispかじり
  • 2025/09/27 (Sat) 20:11:46
Re: VBA: 選択状態で終了としたいけど
これじゃダメですか。

(defun C:SelLineAll () (and (setq ss (ssget "_X" '((0 . "LINE")))) (sssetfirst nil ss)))

を図面にロードしておいて、SendCommand部分を

ThisDrawing.SendCommand ("SelLineAll" & vbCr)
  • さかな
  • 2025/09/29 (Mon) 11:45:08
Re: VBA: 選択状態で終了としたいけど
「選択状態にしたい」というよりは、選択が分かるようにハイライト表示したいということでは?

ThisDrawing.SendCommand ("_SELECT P" & vbCr & vbCr)
の代わりに、
sset.Highlight (True)
でハイライト状態にする、というのではだめなのでしょうか。
  • LUNE
  • 2025/09/29 (Mon) 17:27:56
Re: VBA: 選択状態で終了としたいけど(補足説明)
「なぜ線分を選ぶだけのコマンドを再実行する必要があるのか?」
という疑問もあるようでしたので、説明補足します。

想定しているコマンドの挙動イメージをざっくり書くと
--------
実行→何を選ぶ?→ユーザー指定「線分」→範囲指定→範囲内の線分選択【終了】
[ESC]
[ENTER]
(再実行)→何を選ぶ?→ユーザー指定「ポリライン」→範囲指定→範囲内のポリライン選択【終了】

この後、コピーなり削除なり操作ができるようにする。
--------

今回伺いたかったのは、

『 [ENTER]で SELECTを実行させず 再度VBAのコマンドを実行したい 』

という部分に限定してましたので、関係のない処理を省いたコードで質問させていただきました。
言葉足らずですみません。
  • Lispかじり
  • 2025/09/29 (Mon) 22:19:44
Re: VBA: 選択状態で終了としたいけど
SendCommandを使用すると、その中で実行したコマンドを繰り返すので、
SelectOnlyLinesを繰り返すには、SendCommandを使用できない。

しかしVBAには、lispの(sssetfirst nil ss)と同じ動作をする機能は無い。(←色々と調べたが、無いという結論しか見つからない)

なので、SendCommandを使用してコマンドを1つだけ実行する。
その1つのコマンド内で、やりたい事を全て行わなければならないので、lispコマンドを作成するしかない。
(arxでも良いのですけど私は作れない)

という理由で、先の投稿をしました。

先の投稿は、「図面内の全ての線分を選択」で作っていますので、
「何を選ぶ?→ユーザー指定「線分」→範囲指定→範囲内の線分選択【終了】」
に変更すれば、ご希望の状態になりませんか?

ここまでやったらVBAを使う意味が無くなってしまいますので、それがダメという事ですか?
(VBA縛りで楽しんでいる?)
  • さかな
  • 2025/09/30 (Tue) 11:12:22
Re: VBA: 選択状態で終了としたいけど
>しかしVBAには、lispの(sssetfirst nil ss)と同じ動作をする機能は無い。(←色々と調べたが、無いという結論しか見つからない)
私も探してみましたが、さかなさんが書かれている通り、見つけられませんでした。

どこも選択セットを作った後は、selectしてその後の操作、って感じでしたね。

VBAやLispで最後まで処理するなら、明示的に選択する必要はない、ということなんだろう思います。
そう思うと、Lispにあるsssetfirstは、イレギュラーなのかも。
  • LUNE
  • 2025/09/30 (Tue) 11:17:47
Re: VBA: 選択状態で終了としたいけど
返信頂きありがとうございます。
頂いた情報が手がかりになりまして、[ENTER]でVBAのコマンドを再実行できる方法が見つかりました。

ThisDrawing.SendCommand ("_SELECT P" & vbCr & vbCr)
  ↓
ThisDrawing.SendCommand "(sssetfirst nil (ssget ""_P""))" & vbCr

SELECTコマンドでは無く、LISPコードを送り込むようにしました。
ENTERでLISPコードは実行されないので、それより前のVBAのコマンド(を呼び出すLISP)の実行となります。

VBAだけで完結できず、コマンドラインにLISPコード吐いちゃうのは悔しいところですが(SELECTも吐いてましたが)、
現状ではこれが最善のような気がしています。

添付画像のような選択ツールを作ってました。(動作は容易に想像できると思います)
LISPとDCLで実現できず、VBAベースでの作成となった次第です。
  • Lispかじり
  • 2025/10/01 (Wed) 20:31:20

返信フォーム






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