汎用機メモっとくか

しごと用の(学習メモ&お気に入り保存)。

Excel VBAでJScript関数(search,match,replace)を使って正規表現検索・置換したい時もある

2018年08月04日 06時34分51秒 | EXCEL VBA

Excel VBAでJavaScript関数(search,match,replace)を使って正規表現検索・置換

//<sample01.js>
function RegRepl(a){
    var c1 = a.search(/AB+C/);
    var c2 = a.match(/AB+C/);
    var c3 = a.replace(/(AB+C)/,"($1)");
  return c3 + "\t" + c1 + "\t" + c2;
}
var myStr = "置換前\n";
myStr = myStr + "CFEFCGDFAEFDAFADFABG" + "\n";
myStr = myStr + "CFEFCGDFABFDAFADFABG" + "\n";
myStr = myStr + "CFEFCGDFABCDAFADFABG" + "\n";
myStr = myStr + "CFEFCGDABBCDAFADFABG" + "\n";
myStr = myStr + "CFEFCGABBBCDAFADFABG" + "\n";
myStr = myStr + "CFEFCABBBBCDAFADFABG" + "\n";

myStr = myStr + "置換後\n";

myStr = myStr + RegRepl("CFEFCGDFAEFDAFADFABG") + "\n";
myStr = myStr + RegRepl("CFEFCGDFABFDAFADFABG") + "\n";
myStr = myStr + RegRepl("CFEFCGDFABCDAFADFABG") + "\n";
myStr = myStr + RegRepl("CFEFCGDABBCDAFADFABG") + "\n";
myStr = myStr + RegRepl("CFEFCGABBBCDAFADFABG") + "\n";
myStr = myStr + RegRepl("CFEFCABBBBCDAFADFABG") + "\n";

WScript.Echo(myStr);

こんな感じ。これをExcel上で行う。

EXCEL VBAにて。

<20190110追記STA>

MS-Office 64bitでは、

CreateObject("ScriptControl")ができないようです。

MS-Office 32bitなら、動くようです。

<20190110追記END>

Sub Make_data()
    '置換前データ作成用
    Dim moji1 As Variant
    moji = Array("A", "B", "C", "D", "E", "F", "G")
    Dim data01(19) As String
   
    Dim WSFunc  As WorksheetFunction
    Set WSFunc = Application.WorksheetFunction
   
    Dim i As Integer
    Dim j As Byte
   
    For i = 2 To 10001
        For j = 0 To 19
            data01(j) = moji(WSFunc.RandBetween(0, 6))
        Next
        Worksheets("Sheet2").Range("A" & i).Value = Join(data01, "")
    Next
    MsgBox "処理終了"
End Sub

Sub JScript_Regx2()
   Dim nJS
   Dim oJS
   Dim myRange
  
   Set nJS = CreateObject("ScriptControl")
   nJS.Language = "JScript"
   nJS.AddCode "function RegRepl(a){                        " & _
               "    var c1 = a.search(/AB+C/);              " & _
               "    var c2 = a.match(/AB+C/);               " & _
               "    var c3 = a.replace(/(AB+C)/,""($1)""); " & _
               "  return c1 + ""\t"" + c2 + ""\t"" + c3;    " & _
               "}                                           "
  
   Set oJS = nJS.CodeObject
   Dim return_data
   For i = 2 To 10001
       return_data = Split(oJS.RegRepl(Worksheets("Sheet2").Range("A" & i).Value), vbTab)
       Worksheets("Sheet2").Range("D" & i).Value = return_data(0)
       Worksheets("Sheet2").Range("E" & i).Value = return_data(1)
       Worksheets("Sheet2").Range("F" & i).Value = return_data(2)
   Next
   MsgBox "処理終了"
End Sub

SEのためのExcelツール 様 のところに
http://srcedit.pekori.jp/

「正規表現検索
Excel用正規表現検索ダイアログアドイン」
http://srcedit.pekori.jp/tool/excelre.html
というスグレものツールがあるのですが、今の現場では、持ち込めないため作成してみた。

RegExpオブジェクト
"Office TANAKA"様 正規表現によるマッチング
http://officetanaka.net/excel/vba/tips/tips38.htm
Set oRE = CreateObject("VBScript.RegExp")

でもいいのですが。できるかもと思い、やってみただけ。

 

<2018111追記STA>VBScript.RegExpの場合
Sub VBScript_Regx2()
    Dim oRE
    Dim myRep
    Dim myRepStr
    Dim newStr
    Set oRE = CreateObject("VBScript.RegExp")
    oRE.Pattern = "(AB+C)"
    myRepStr = "($1)"
    oRE.IgnoreCase = True
    oRE.Global = True
   
    Dim WS3
    Set WS3 = Sheets("Sheet3")
   
    Dim myRange
    Dim resMatch
    Application.ScreenUpdating = False
    For i = 2 To 10001
        myRange = WS3.Range("A" & i).Value
        Set resMatch = oRE.Execute(myRange)
        If resMatch.Count > 0 Then
          WS3.Range("D" & i).Value = resMatch.Item(0).FirstIndex
          WS3.Range("E" & i).Value = resMatch.Item(0).Value
        Else
          WS3.Range("D" & i).Value = ""
          WS3.Range("E" & i).Value = ""
        End If
        WS3.Range("G" & i).Value = oRE.Replace(myRange, myRepStr)
    Next
    Application.ScreenUpdating = True
    MsgBox "処理終了"

End Sub
<2018111追記END>

 

<20181228追記STA>
Sub JScript_sort()
   Dim nJS
   Dim oJS
   Dim myRange
  
   Set nJS = CreateObject("ScriptControl")
   nJS.Language = "JScript"
   nJS.AddCode "function JSsort(data){                " & _
               "    var mykey01 = data.split(""\t"") ;" & _
               "    mykey01.sort(func_sort)          ;" & _
               "    return mykey01.join(""\t"")      ;" & _
               "}                                     " & _
               "function func_sort(a,b){              " & _
              "    if(a * 1.0 > b * 1.0)  return    1;" & _
               "    else                   return  -1;" & _
               "}                                       "

   Set oJS = nJS.CodeObject
   Dim mydata
   Dim return_data
   mydata = Array(555, 444, 666, 222, 111, 333, 888, 777, 999, 5, 4, 6, 2, 1, 3, 8, 7, 9, 55, 44, 66, 22, 11, 33, 88, 77, 99)
   return_data = oJS.JSsort(Join(mydata, vbTab))
   MsgBox Replace(return_data, vbTab, vbLf)
End Sub

Sub JScript_sort2()
   Dim nJS
   Dim oJS
   Dim myRange
  
   Set nJS = CreateObject("ScriptControl")
   nJS.Language = "JScript"
   nJS.AddCode "function JSsort(data){                " & _
               "    var mykey01 = data.split(""\t"") ;" & _
               "    mykey01.sort(func_sort)          ;" & _
               "    return mykey01.join(""\t"")      ;" & _
               "}                                     " & _
               "function func_sort(a,b){              " & _
              "    if(a + """" > b + """") return   1;" & _
               "    else                   return  -1;" & _
               "}                                       "

   Set oJS = nJS.CodeObject
   Dim mydata
   Dim return_data
   mydata = Array(555, 444, 666, 222, 111, 333, 888, 777, 999, 5, 4, 6, 2, 1, 3, 8, 7, 9, 55, 44, 66, 22, 11, 33, 88, 77, 99)
   return_data = oJS.JSsort(Join(mydata, vbTab))
   MsgBox Replace(return_data, vbTab, vbLf)
End Sub
<20181228追記END>

 

<20190131追記STA>

 64bit環境で VBA、VBScriptからJScript(javascript)の関数を使用する。

”書いて忘れる”様
vba/vbscript:64bit環境でJSONをパース
http://bougyuusonnin.seesaa.net/article/446183415.html

 

”@nukie_53”様
Qiita VBAからJScriptのfunctionオブジェクトを使用する(64bit対応)
https://qiita.com/nukie_53/items/297e524bcc8e43f9b5d1

 

”Beginner'sMemo初心者備忘録”様
64ビット環境でのScriptControlの代わり
http://www.ka-net.org/office/of32.html

 

ありがとうございました。使わせていただきます。

 上記3つの記事の使用方法を、学習後、

吉岡さんのソースに当たってみた

 googleで”吉岡照雄”で検索するとでてきます。

作者: 吉岡 照雄 - Vector
https://www.vector.co.jp/vpack/browse/person/an010222.html

history.VBS

 「履歴」をHTMLファイルにする、「履歴」のサブフォルダを開くVBScript
<中身>
 History.TXT
 History.VBS
 History98.VBS
 TechNote.TXT
 最近使ったファイルメニュー.VBS
 履歴/今日/マイ コンピュータ.VBS

”History98.VBS” の中に CreateObject("htmlfile")の恐ろしいサンプルがあった。

2006-07-02に既に検討済みとは、本当に驚愕した。
<見所>
 (1) VBScript中でJavaScriptの new Array()を実現
 (2) VBScript中で(1)のArray の push 、shiftを行う
 (3) VBScriptから JScript(Javascript)のユーザ定義関数を呼び出し、
   さらにそこからVBScriptのユーザ定義関数を使用させる
<20190131追記END>

 

<20190210追記STA>
<自己記事>
64bit環境で VBA、VBScriptからJScript(javascript)の関数を使用する。
https://blog.goo.ne.jp/tkhs1732/e/a565bd5b289b1de72208e30449fb0268
<20190210追記END>