はじめに
SelectionSet.Selectメソッドや .SelectOnScreenメソッドでは、選択フィルタを設定することが可能です。公式ヘルプのサンプルコードの作り方では毎回書くのが面倒なので、それならFunctionプロシージャ化してしまおうというのが今回の目的です。前回はFilterTypeについて解説しました。今回はFilterDataについて解説します。
FilterData(Variant型配列)を作るFunction
概要
- 配列の要素は、コンマ区切りテキストを入力し、Split関数を使って配列化します
- 配列の各要素が数値などと見做せるか判定後、型変換したりしなかったりして別の配列に格納します
- 戻り値となる配列は Selectメソッド等の引数なので、Variant型とします
戻り値となる配列の要素について
上記の「グループ コードの値のタイプ リファレンス(DXF)」にあるように、各要素には、String型、Integer型、Long型、LongLong型、Double型、Boolean型が格納されます。
今回のサンプルコードには、LongLong型とBoolean型への型変換は含んでいません。また、角度はDouble型のラジアンである必要がありますが、これも含んでいません。
コード
AutoCAD VBA - FilterDataを作成するFunction
Public Function uMakeFilterData(ByVal aTextByComma As String) As Variant
Dim uFilterTypeArrayStr As Variant ' Split関数の結果を格納する配列
Dim uFilterTypeArrayVar() As Variant ' 様々な型の要素を格納する動的配列
' Splitで配列化(要素はすべてString値) ※添え字の最小値は 0
uFilterTypeArrayStr = Split(Expression:=aTextByComma, Delimiter:=",")
' 動的配列の要素数確定
ReDim uFilterTypeArrayVar(UBound(uFilterTypeArrayStr))
' 配列の要素を文字列以外は型変換して動的配列に移す
For n = LBound(uFilterTypeArrayStr) To UBound(uFilterTypeArrayStr)
' 要素が数値か否か
If IsNumeric(uFilterTypeArrayStr(n)) = True Then
' 数値の場合:小数点を含むか否か
If InStr(uFilterTypeArrayStr(n)) > 0 Then
' 小数点を含む:→ Double型
uFilterTypeArrayVar(n) = CDbl(uFilterTypeArrayStr(n))
Else
' 小数点を含まない:→ Long型
uFilterTypeArrayVar(n) = CLng(uFilterTypeArrayStr(n))
End If
Else
' 要素が数値でない:→ Variant型
uFilterTypeArrayVar(n) = CVar(uFilterTypeArrayStr(n))
End If
Next
' 戻り値
uMakeFilterData = uFilterTypeArrayVar
End Function
おわりに
前回と今回でSelectionSet.Selectメソッド等の引数となるFilterTypeとFilterDataの配列を作るFunctionの解説をしました。角度の判定については、皆さん工夫してみてください。気が向いたら私のやり方を載せるかも……