展示室
*** 行列変換マクロ ***

KANABUN
遊緑地設計
VectorWorksのワークシートの行と列を入れ替えるScript(VectorWorks8.6)


Procedure WS_Util;

var

Sheet_h, NewSheet_h : handle ;

Max_row, Max_col , i , K_col : INTEGER ;

CellStr_Array : ARRAY[ 1..100 ] OF string ;

 

{-----行を列に変換するだけの簡単なプログラムです。一回に1行のみ処理出来ます。応用すれば列ー>行や複数行の処理も可能です。ただし、VectorScriptには選択セル位置を取得する関数が無いので、セル位置の指定は何らかの形で必要になります。

今回は配列を使って、シートからシートへデータを渡す処理を考えましたが、例えばシート二つを同時に開いておいて、リアルタイムでデータを渡していけば配列を使わないで処理可能です。又、今回のように配列を使ったならば、書出しシートを作らずとも既存のシートに上書き処理が可能です。

今回のコードは解答例の一つです。コードを書く人の数だけ処理方法があると思います。-------}

 

{===================メインルーチン====================}

begin

{-----開いているワークシートのハンドルを取得-------}

Sheet_h := ActSSheet ;

 

{-----ハンドルがある場合の処理-------}

if Sheet_h <> nil then

begin

{-----ループカウンタ初期化-------}

i := 0 ;

 

{-----ワークシートのサイズを取得-------}

SprdSize( Sheet_h, Max_row , Max_col );

 

{-----ワークシートの何行目を処理するか質問-------}

K_col := IntDialog( '何列目を行ー>列変換しますか?' , '1' );

 

{-----キャンセルで無く、行指定が0より大きく最大行以下で、さらに100以下の場合は処理実行(100の部分は配列宣言により変更可能)-------}

if ( not didcancel ) and ( K_col > 0 ) and ( K_col <= Max_col ) and ( K_col <= 100 ) then

begin

 

{-----既存セル数値取得用ループ処理-------}

repeat

 

{-----ループカウンタ増加-------}

i := i + 1 ;

 

{-----セルの値を配列に代入する。配列の番号にはカウンタを代入-------}

CellStr_Array[ i ] := GetCellStr( Sheet_h, i, K_col );

 

{-----カウンタが100か、最大行になったならループ終了-------}

until ( i = 100 ) or ( i = Max_row ) ;

 

{----行列変換後の値を入力するワークシートを新しく製作-------}

NewSprdSheet( '行ー>列変換', 0, 0, Max_row , Max_row , false, true );

 

{-----新しいワークシートのハンドルを取得-------}

NewSheet_h := ActSSheet ;

 

{-----ループカウンタ初期化-------}

i := 0 ;

 

{-----行列変換代入用ループ処理-------}

repeat

 

{-----ループカウンタ増加-------}

i := i + 1 ;

 

{-----行と列を入れ替えて新しいワークシートに入力。配列の番号と列指定にはカウンタを代入-------}

LoadCell( 1 , i , CellStr_Array[ i ] );

 

{-----カウンタが100か、最大行になったならループ終了-------}

until ( i = 100 ) or ( i = Max_row ) ;

 

end ;

 

{-----指定行が100を超える場合の警告-------}

if K_col > 100 then AlrtDialog('100列目以下しか処理できません。');

 

{-----ハンドルが無い場合の処理-------}

end else

begin

sysbeep;

AlrtDialog('ワークシートを開いて下さい!');

end ;

 

end;

run( WS_Util );