| 
			|  | こちらで紹介いただき、20年近く便利に使っていた
 計算マクロ
 
 15+19
 と秀丸上で書き、実行すると
 15+19=34
 と答えが出てくる
 
 が最近使用できなくなりました。
 実行すると「他のエディタでマクロを使用中です」
 というメッセージが出て、マクロ全般が使えなくなり、
 再起動するまで直りません。
 
 マクロを作られた方にお聞きするのもはばかられますので、
 少しみて助言を頂けませんか。無理なようでしたら、
 同様のマクロを紹介して下さると助かります。
 よろしくお願いします。
 
 マクロからマクロを呼び出す2段式ですが、2段目だけを実行しても
 エラーが出ます。
 
 1段目は
 
 beginsel;
 golinetop;
 
 
 //--------------------------------------------------------------------------
 ----
 
 // 現在情報の所得
 #TopX = seltopx;   //選択開始位置
 #TopY = seltopy;   //選択開始位置
 #EndX = selendx;   //選択終了位置
 #EndY = selendy;   //選択終了位置
 
 moveto #EndX,#EndY;
 delete;
 delete;
 beginsel;
 
 moveto #TopX,#TopY;   //選択位置頭に移動
 
 tohankaku;
 
 execmacro "calc.mac";
 
 golineend;
 replaceup " = ","=";
 golineend;
 beginsel;
 golinetop;
 tozenkakuhira;
 golineend;
 
 endmacro;
 
 2段目は
 
 //--------------------------------------------------------------------------
 ----
 //    「計算式」 ver 1.00
 //     Calc.mac
 //
 //                                                         つくった人 xx xx
 //                                             E-mail: xxxx@muh.biglobe.ne.jp
 //                                            http://www2s.biglobe.ne.jp/xxxx/
 //                                                       ver 1.00完成 2000.0
 1.21
 //--------------------------------------------------------------------------
 ----
 
 // 範囲選択中か確認
 if( !selecting ){
 golinetop2;    //論理行頭に移動
 beginsel;    //範囲選択開始
 golineend2;    //論理行末に移動
 }
 
 //--------------------------------------------------------------------------
 ----
 
 // 現在情報の所得
 #TopX = seltopx;   //選択開始位置
 #TopY = seltopy;   //選択開始位置
 #EndX = selendx;   //選択終了位置
 #EndY = selendy;   //選択終了位置
 
 moveto #TopX,#TopY;   //選択位置頭に移動
 #NowLineno = lineno;   //現在論理行数
 
 #handleNow = hidemaruhandle(0);  //現在のウィンドウを捕捉
 disableinvert;    //囲選択のときの反転表示を禁止
 disabledraw;    //画面の書き換えを禁止
 
 //--------------------------------------------------------------------------
 ----
 
 // 選択範囲の情報を所得
 beginsel;    //範囲選択開始
 moveto #EndX,#EndY;   //選択位置後ろに移動
 copy;     //コピー
 escape;     //範囲選択を取り消す
 beginclipboardread;   //クリップボード読取初期化
 #FormulaNo = 0;    //計算式数初期化
 while(1){
 $Formula[#FormulaNo] = getclipboard;  //クリップボード所得
 if( $Formula[#FormulaNo] == "" )break;
 #FormulaNo = #FormulaNo+1;   //計算式数を増やす
 }
 
 //--------------------------------------------------------------------------
 ----
 
 // バッファウィンドウ作成
 openfile "/h";    //ファイルの新規作成
 #handleBuf = hidemaruhandle(0);  //バッファウィンドウを捕捉
 showwindow 0;    //ウィンドウ非表示
 
 //--------------------------------------------------------------------------
 ----
 
 // 計算式数のループ
 #a = 0;
 while( #a < #FormulaNo ){
 // バッファでの作業
 setactivehidemaru #handleBuf;   //バッファウィンドウに移動
 insertfix "\n"+$Formula[#a];   //計算式一行貼付け
 call AnalysisFormula;    //計算式の分析へ
 call RunFormula;    //計算の実行へ
 selectall;     //すべてを選択
 backspace;     //Backspace
 // 計算結果出力
 setactivehidemaru #handleNow;   //現在のウィンドウに移動
 if( #FormulaNo <= 1 ){
 // 計算式が一行のみの場合の処理
 moveto selendx,selendy;   //選択範囲の最後に移動
 insert $Anser;    //答えの出力
 }else{
 // 計算式が複数行の場合の処理
 movetolineno 0,#NowLineno+#a;  //出力位置の論理行頭へ移動
 golineend2;    //論理行末に移動
 insert $Anser;    //答えの出力
 }
 #a = #a+1;
 }
 
 //--------------------------------------------------------------------------
 ----
 
 // ウィンドウの書き換えを許可
 setactivehidemaru #handleNow;  //現在のウィンドウに移動
 enableinvert;    //囲選択のときの反転表示禁止を解除
 enabledraw;    //画面の書き換えを許可
 
 // バッファウインドウの終了
 closehidemaruforced #handleBuf;  //結果出力ウィンドウを強制終了
 
 // 終了処理
 endmacro;    //マクロの終了
 
 //--------------------------------------------------------------------------
 ----
 //●● 以下サブルーチン ●●●●●●●●●●●●●●●●●●●●●●●●●
 ●●
 //--------------------------------------------------------------------------
 ----
 
 //--------------------------------------------------------------------------
 ----
 //
 // ● 計算式の分析 ●
 AnalysisFormula:
 //
 //--------------------------------------------------------------------------
 ----
 
 // 計算用変数の初期化
 #SuutiNo = 0;    //数値配列数
 #Suuti[0] = 0;    //数値配列
 #EnzanNo = 0;    //演算子配列数
 #Enzan[0] = 0;    //演算子配列
 //1-^、2-/、3-\、4-*、5-+、6--
 #COpen[0] = 0;    //「(」配列
 #CClose[0] = 0;    //「)」配列
 
 // 状態変数の初期化
 #CNow = 1;    //「()」状態
 //0-チェック終了後、1-チェック中
 #COpRock = -1;    //「(」ロック位置
 #CClRock = -1;    //「)」ロック位置
 #EnzanNow = 1;    //計算演算子状態
 //1-^、2-/\*、3-+-
 #ResSuutiNo = 0;   //残り数値配列数
 
 // 戻り値初期化
 $Anser = "";    //戻り文字変数
 
 //--------------------------------------------------------------------------
 ----
 
 // 数値配列の所得
 ##a = 0;
 while(1){
 searchdown "[0-9]+",regular,fuzzy;  //数字を下向き検索
 if( !result )break;
 ##HeadX = x;
 ##HeadY = y;
 searchdown "[^0-9]",regular,fuzzy  //数字以外を下向き検索
 if( !result )gofileend;    //ファイルの最後に移動
 ##EndX = x;
 ##EndY = y;
 $$GetTxt = gettext( ##HeadX,##HeadY,##EndX,##EndY ); //文字列取り込み
 #SuutiNo = #SuutiNo+1;    //数値配列数
 #Suuti[##a] = val($$GetTxt);   //数値配列
 ##a = ##a+1;
 }
 
 //--------------------------------------------------------------------------
 ----
 
 gofiletop;    //ファイルの先頭に移動
 
 //--------------------------------------------------------------------------
 ----
 
 // 演算子配列の所得
 ##a = 0;
 while(1){
 searchdown "(%|[\\(-\\+]|\\-|/|\\\\|\\^)",regular,fuzzy;
 //演算子を下向き検索
 if( !result )break;
 ##HeadX = x;
 ##HeadY = y;
 $$GetTxt = gettext( ##HeadX,##HeadY,##HeadX+1,##HeadY );
 //演算子取り込み
 if( $$GetTxt == "(" ){
 #COpen[##a] = #COpen[##a]+1;  //「(」配列
 }else if( $$GetTxt == ")" ){
 #CClose[##a] = #CClose[##a]+1;  //「)」配列
 }else{
 #EnzanNo = #EnzanNo+1;   //演算子配列数
 // 演算子配列の所得
 if( $$GetTxt == "^" )#Enzan[##a] = 1;
 if( $$GetTxt == "/" )#Enzan[##a] = 2;
 if( $$GetTxt == "\\" )#Enzan[##a] = 3;
 if( $$GetTxt == "%" )#Enzan[##a] = 3;
 if( $$GetTxt == "*" )#Enzan[##a] = 4;
 if( $$GetTxt == "+" )#Enzan[##a] = 5;
 if( $$GetTxt == "-" )#Enzan[##a] = 6;
 #COpen[##a+1] = 0;   //「(」配列
 #CClose[##a+1] = 0;   //「)」配列
 ##a = ##a+1;
 }
 }
 
 //--------------------------------------------------------------------------
 ----
 
 return;     //返り値なし
 
 //--------------------------------------------------------------------------
 ----
 
 //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
 ●●
 
 //--------------------------------------------------------------------------
 ----
 //
 // ● 計算の実行 ●
 RunFormula:
 //
 //--------------------------------------------------------------------------
 ----
 
 // エラーチェック
 if( #SuutiNo <= 1 )return;  //数字が一つ以下
 if( #SuutiNo-1 != #EnzanNo ){  //計算式が合っていない
 $Anser = " = err! 不正な計算式です。";
 return;
 }
 
 //--------------------------------------------------------------------------
 ----
 
 #ResSuutiNo = #SuutiNo;   //残り数値配列数を初期化
 
 //--------------------------------------------------------------------------
 ----
 
 // 「()」状態の管理
 ##a = 0;
 while(1){
 if( #CNow == 1 ){
 // 「(」配列を「残り数値配列数」まで走査
 #COpRock = -1;    //「(」ロック位置の初期化
 #CClRock = -1;    //「)」ロック位置の初期化
 ##b = 0;
 while( ##b < #ResSuutiNo ){
 if( #COpen[##b] >= 1 )#COpRock = ##b;
 if( #COpRock >= 0 && #CClose[##b] >= 1 )#CClRock = ##b;
 if( #COpRock >= 0 && #CClRock >= 0 ){
 // 「()」の数の整理
 #COpen[#COpRock] = #COpen[#COpRock]-1;
 #CClose[#CClRock] = #CClose[#CClRock]-1;
 #PrHead = #COpRock; //先頭位置
 #PrEnd = #CClRock; //末端位置
 call PressFormula; //計算配列処理へ
 break;   //処理戻る
 }
 ##b = ##b+1;
 }
 if( #COpRock >= 0 && #CClRock == -1 ){
 $Anser = " = err! 「(」「)」を見直して下さい。";
 return;
 }
 if( #COpRock == -1 )#CNow = 0;  //「()」処理終了
 }else{
 //------------------------------------------------------
 // 「(」なし、数字のみの計算
 #PrHead = 0;    //先頭位置
 #PrEnd = #ResSuutiNo-1;   //末端位置
 call PressFormula;   //計算配列処理へ
 }
 // 終了確認
 if( #ResSuutiNo <= 1 ){
 $Anser = " = "+str(#Suuti[0]);  //解答
 return;
 }
 }
 
 //--------------------------------------------------------------------------
 ----
 
 $Anser = " = err! 予測外のエラーです。";
 return;     //返り値なし
 
 //--------------------------------------------------------------------------
 ----
 
 //●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
 ●●
 
 //--------------------------------------------------------------------------
 ----
 //
 // ● 計算配列処理 ●
 PressFormula:
 //
 //--------------------------------------------------------------------------
 ----
 
 #EnCalcNo = 0;    //演算子による計算回数の初期化
 PressFormula2:    //演算子状態でループ
 
 // 現在位置の初期化
 ##HeadNow = #PrHead;   //現在先頭位置初期化
 ##EndNow = #PrEnd-#EnCalcNo;  //現在末端位置初期化
 #EnCalcNo = 0;    //演算子による計算回数の初期化
 
 //--------------------------------------------------------------------------
 ----
 
 // 計算配列処理
 while( ##HeadNow != ##EndNow ){
 // 計算値算出
 #EnCalcTrue = 0;    //演算子無効
 // 階乗
 if( #Enzan[##HeadNow] == 1 && #EnzanNow == 1 ){
 ##c = 1;
 ##d = #Suuti[##HeadNow];
 while( ##c < #Suuti[##HeadNow+1] ){
 ##d = ##d*#Suuti[##HeadNow];
 ##c = ##c+1;
 }
 if( #Suuti[##HeadNow+1] == 0 )##d = 1;
 if( #Suuti[##HeadNow+1] == 1 )##d = #Suuti[##HeadNow];
 #Suuti[##HeadNow] = ##d;
 #EnCalcTrue = 1;   //演算子有効
 }
 // 除算
 if( #Enzan[##HeadNow] == 2 && #EnzanNow == 2 ){
 if( #Suuti[##HeadNow] == 0 ){
 message "除算エラーです。";
 endmacro;   //マクロ終了
 }
 #Suuti[##HeadNow] = #Suuti[##HeadNow]/#Suuti[##HeadNow+1];
 #EnCalcTrue = 1;   //演算子有効
 }
 // 余り
 if( #Enzan[##HeadNow] == 3 && #EnzanNow == 2 ){
 if( #Suuti[##HeadNow] == 0 ){
 message "除算エラーです。";
 endmacro;   //マクロ終了
 }
 #Suuti[##HeadNow] = #Suuti[##HeadNow]%#Suuti[##HeadNow+1];
 #EnCalcTrue = 1;   //演算子有効
 }
 // 乗算
 if( #Enzan[##HeadNow] == 4 && #EnzanNow == 2 ){
 #Suuti[##HeadNow] = #Suuti[##HeadNow]*#Suuti[##HeadNow+1];
 #EnCalcTrue = 1;   //演算子有効
 }
 // 加算
 if( #Enzan[##HeadNow] == 5 && #EnzanNow == 3 ){
 #Suuti[##HeadNow] = #Suuti[##HeadNow]+#Suuti[##HeadNow+1];
 #EnCalcTrue = 1;   //演算子有効
 }
 // 減算
 if( #Enzan[##HeadNow] == 6 && #EnzanNow == 3 ){
 #Suuti[##HeadNow] = #Suuti[##HeadNow]-#Suuti[##HeadNow+1];
 #EnCalcTrue = 1;   //演算子有効
 }
 //--------------------------------------------------------------
 // 配列圧縮処理
 if( #EnCalcTrue == 1 ){
 ##PressNo = 0;    //圧縮回数の初期化
 // 圧縮位置
 while( #ResSuutiNo-##HeadNow-2 >= ##PressNo ){
 #Suuti[##HeadNow+##PressNo+1] = #Suuti[##HeadNow+##PressNo+2];        //
 数値配列の圧縮
 #Enzan[##HeadNow+##PressNo] = #Enzan[##HeadNow+##PressNo+1];        //演
 算子配列の圧縮
 if( ##PressNo == 0 ){
 #COpen[##HeadNow+##PressNo] = #COpen[##HeadNow+##PressNo]+#COpen[##Head
 Now+##PressNo+1];        //「(」配列の圧縮
 #CClose[##HeadNow+##PressNo] = #CClose[##HeadNow+##PressNo]+#CClose[##H
 eadNow+##PressNo+1];        //「)」配列の圧縮
 }else{
 #COpen[##HeadNow+##PressNo] = #COpen[##HeadNow+##PressNo+1];        //
 「(」配列の圧縮
 #CClose[##HeadNow+##PressNo] = #CClose[##HeadNow+##PressNo+1];        /
 /「)」配列の圧縮
 }
 ##PressNo = ##PressNo+1; //圧縮回数を増やす
 }
 #ResSuutiNo = #ResSuutiNo-1;  //残り数値配列数を減らす
 #EnCalcNo = #EnCalcNo+1;  //計算回数増やす
 ##EndNow = ##EndNow-1;   //現在末端位置の移動
 }else{
 ##HeadNow = ##HeadNow+1;  //現在先頭位置の移動
 }
 }
 
 if( #EnzanNow != 3 ){
 #EnzanNow = #EnzanNow+1;   //計算演算子状態の更新
 goto PressFormula2;    //計算演算子状態でループ
 }
 
 #EnzanNow = 1;    //計算演算子状態の初期化
 
 //--------------------------------------------------------------------------
 ----
 
 return;     //返り値なし
 
 //--------------------------------------------------------------------------
 ----
 //●● 以上サブルーチン ●●●●●●●●●●●●●●●●●●●●●●●●●
 ●●
 //--------------------------------------------------------------------------
 ----
 
 //--------------------------------------------------------------------------
 ----
 //                                              copyright (c)2000 Masakazu Y
 anai
 
 
 | 
 |