Macro/投稿/157 のバックアップソース(No.11)



* Excel範囲コピー、SQLPLUS風に貼り付け [#f7edf7ac]
-ページ: [[Macro/投稿]]
-作者: [[ガンジャム]]
-カテゴリー: js
-投稿日: 2006-12-15 (金) 23:39:58

** メッセージ [#mfa2644b]
行バイト長取得に(前略)さんのByteLen()をそのまま利用してます。
#code(javascript){{
//excelPaste.js
//Excel等で表範囲をコピーした際のタブ区切りクリップボードデータをSQLPLU風に整形して挿入
//1行目をヘッダ行として2行目にセパレート行を追
//セル結合は無視。セル内改行は半角ブランクに置換。

var arrMaxWidth = new Array(), arrHeadLine = new Array(), arrDataLines = new Array();

var objSC = new ActiveXObject("ScriptControl");	
	objSC.Language = "VBScript";
var vbsLen  = 'Function ByteLen(ByVal s)\n';
	vbsLen += '  ByteLen = 0\n';
	vbsLen += '  Dim i\n';
	vbsLen += '  For i = 1 To Len(s)\n'; 
	vbsLen += '    Dim c\n';
	vbsLen += '    c = Mid(s, i, 1)\n';
	vbsLen += '    If c = vbCr Or c = vbLf Then Exit For\n';
	vbsLen += '    ByteLen = ByteLen + ByteSize(c)\n';
	vbsLen += '  Next\n';
	vbsLen += 'End Function\n';
	vbsLen += 'Function ByteSize(ByVal c)\n';
	vbsLen += '  ByteSize = 0\n';
	vbsLen += '  If Len(c) = o Then Exit Function\n';
	vbsLen += '  Select Case AscB(MidB(c, 2, 1))\n';
	vbsLen += '  Case 0: ByteSize = 1\n';
	vbsLen += '  Case 255:\n';
	vbsLen += '    Dim kana\n';
	vbsLen += '    kana = AscB(MidB(c, 1, 1))\n';
	vbsLen += '    If &H61 <= kana And kana <= &H9F Then\n';
	vbsLen += '      ByteSize = 1\n';
	vbsLen += '    Else\n';
	vbsLen += '      ByteSize = 2\n';
	vbsLen += '    End If\n';
	vbsLen += '  Case Else: ByteSize = 2\n';
	vbsLen += '  End Select\n';
	vbsLen += 'End Function\n';
	objSC.AddCode(vbsLen);

var lineCount = 1;

main();
function main() {
	var arrSplitLine = getClipbrd();
	if (arrSplitLine) {
		seprateTab(arrSplitLine);
		var insTex = setEachLines();
		Editor.InsText(insTex);
	}
	objSC = null;
}

function getClipbrd() {
	var ie = new ActiveXObject("InternetExplorer.Application");
		ie.Navigate("about:blank");
	var clip = ie.Document.parentWindow.clipboardData.getData("Text");
		ie = null;

	if (clip) {
		return(clip.split("\r\n"));
	} else {
		return(false);
	}
}

function seprateTab(arr) {
	var re = /\n/g;
	for (i in arr) {
		var strLine = arr[i];
		if (strLine) {
			strLine = strLine.replace(re, " ");
			splitTab(strLine);
		}
		lineCount++;
	}
}

function splitTab(str) {
	if (lineCount == 1) {
		arrHeadLine = str.split("	");
		compareLength(arrHeadLine, 0);
	} else {
		var dataLine = str.split("	");
		compareLength(dataLine, 1);
		arrDataLines[lineCount] = dataLine;
	}
}

function compareLength(arr, f) {
	if (f == 0) {
		for (i in arr) {
			arrMaxWidth[i] = objSC.Run("ByteLen", arr[i]);
		}
	} else {
		var ln = new Array();
		for (i in arr) {
			ln[i] = objSC.Run("ByteLen", arr[i]);
			if (arrMaxWidth[i] < ln[i]) {
				arrMaxWidth[i] = ln[i];
			}
		}
	}
}

function setEachLines() {
	var hline = "", dlines = "", sline = "";

	hline = attachWidth(arrHeadLine).join("|") +"\r\n";
	for (i in arrDataLines) {
		dlines += attachWidth(arrDataLines[i]).join("|") +"\r\n";
	}
	sline += setSeprateLine(arrMaxWidth).join("|") +"\r\n";

	return(hline + sline + dlines);
}

function attachWidth(arrColumn) {
	for (i in arrMaxWidth) {
		var colWth = objSC.Run("ByteLen", arrColumn[i]);
		if (colWth < arrMaxWidth[i]) {
			var strBlank = "";
			for (j=0; j < (arrMaxWidth[i] - colWth); j++) {
				strBlank += " ";
			}
			arrColumn[i] += strBlank;
		}
	}
	return(arrColumn);
}

function setSeprateLine(arrColumn) {
	var arrDash = new Array();
	for (i in arrColumn) {
		var strDash = "";
		for (j=0; j < arrMaxWidth[i]; j++) {
			strDash += "-";
		}
		arrDash[i] = strDash;
	}
	return(arrDash);
}

}}

----
- VBScriptをこんな力業で読ませなくても,拡張子.wsfなら複数言語の混在が出来たような -- [[げんた]] &new{2006-12-26 (火) 00:57:19};
- wsfファイルで作ってみましたがサクラだとエラーになりました。wsf対応してるのかな? -- [[ガンジャム]] &new{2006-12-26 (火) 15:43:04};
- peakさんのマクロ[[../158]]にある2バイト文字判定関数を利用するとか. -- [[maru]] &new{2006-12-27 (水) 02:32:40};

#comment

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS