|
* 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 |