数値を増減
ナビゲーションに移動
検索に移動
カーソル付近 or 選択範囲に半角数字列があれば 1 増やし/減らします。
- カーソル位置は、数字の左端・中間・右端どこでもかまいません。
範囲選択時は、範囲内のみが対象となります。
※マクロの仕様上、矩形選択には対応していません。
左端 中間 右端 範囲選択時 元値 999 999 999 999 999,999 増やす 1000 1000 1000 1000 9100,1009
- 0 埋め (ゼロパディング/ゼロフィル) された数値は桁数を維持して増減します。
- 負数 (-1)/小数 (0.1)/指数 (1.2e3) などには対応していません。
ゼロなし/あり 負数の例 小数の例 指数の例 99 0099 -1 -0 0.9 9.8e1 100 0100 -1 -1 0.10 10.9e2 101 0101 -1 -2 0.11 11.10e3
更新履歴
- 2016/02/28
- (数値を増やす) 正規表現を ([0-8]?)(9*) → ([0-9])(9*) に一部変更。他微調整。
- 空文字マッチが発生し、処理にムダができていたのを改善。
- 文字数変化量を Document.Text.length の変化から算出するようにして単純化。
- 数値の増減処理を変更(二段階 replace していた処理を一段階に)。
- 2014/06/19
- 非選択時、探索終了位置(bx)の算出方法を変更。
- 数値の増減処理を変更(繰り上げ・繰り下げの場合分けを不要に)。
- 2014/06/17
- 初版公開。
数値を増やす(インクリメント)
//■数値を増やす(インクリメント)
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 増やす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。
var Sel = Document.Selection;
var gap = Document.Text.length;
var anp = Sel.GetAnchorPos();
var acp = Sel.GetActivePos();
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
var isSel = !Sel.IsEmpty;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
var px = Sel.GetActivePointX(mePosLogical);
var py = Sel.GetActivePointY(mePosLogical);
var ln = Document.GetLine(py,0);
var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
Sel.SetActivePoint(mePosLogical,bx,py);
Sel.SetAnchorPoint(mePosLogical,tx,py);
isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
Sel.Text = Sel.Text.replace(/([0-9])(9*)(?![0-9])/g,function($0,a,z){
return (parseInt(a)+1)+ new Array(z.length+1).join("0");
});
gap = Document.Text.length - gap; //文字数変化量
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);
数値を減らす(デクリメント)
//■数値を減らす(デクリメント)
// 2014/06/17-2016/02/28
//・カーソル付近or選択範囲の10進数値(半角)を 1 減らす。
//▲負数(-1)/小数(0.1)/指数(1.2e3)などは対応外。
var Sel = Document.Selection;
var gap = Document.Text.length;
var anp = Sel.GetAnchorPos();
var acp = Sel.GetActivePos();
var isAcp = (acp<anp); //範囲終点(カーソル)が前方にあるか?
var isSel = !Sel.IsEmpty;
if (Sel.IsEmpty) { //非選択時、文字を探索して範囲選択
var px = Sel.GetActivePointX(mePosLogical);
var py = Sel.GetActivePointY(mePosLogical);
var ln = Document.GetLine(py,0);
var tx = 1 + ln.slice(0,px-1).match(/[0-9]*$/).index;
var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
Sel.SetActivePoint(mePosLogical,bx,py);
Sel.SetAnchorPoint(mePosLogical,tx,py);
isAcp = (px===tx); //カーソルが数値の左端(前方)にあるか?
}
Sel.Text = Sel.Text.replace(/([0-9]?)([1-9])(0*)(?![0-9])/g,function($0,y,a,z){
//桁下がり y/a/z y/a/z
//◆ する>100 ⇒ /1/00⇒ / /99⇒99
//◆しない>1100⇒1/1/00⇒1/0/99⇒1099
return ((!y && a==1 && z)? "" : y+(a-1))+ new Array(z.length+1).join("9");
});
gap = Document.Text.length - gap; //文字数変化量
Sel.SetAnchorPos(anp+(isAcp? gap : 0));
Sel.SetActivePos(acp+(isAcp? 0 : gap), isSel);
位取り対応
var bx = tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
↓
var bx = (px!==tx)? px : tx + ln.slice(tx-1).match(/[0-9]*/)[0].length;
- マクロの中盤(17行目)を上記のように書き換えると、カーソル左側を基準に増減するようになります。
※カーソルが数字の左端にある場合/範囲選択時は、通常どおり増減します。
※左端 千の位 百の位 十の位 一の位 ※範囲選択時 999 0000 900 990 999 999,999 1000 1000 1000 1000 1000 9100,1009 1001 2000 1100 1010 1001 9101,1019
スポンサーリンク