汎用機メモっとくか

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

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

2019年02月04日 06時42分15秒 | EXCEL VBA

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

Ctrl + Fで検索してください
●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の定義関数を呼び出し、
   さらにそこからVBScriptの定義関数を使用させる

吉岡さんの”History98.VBS”から、抽出、改変しました。

Sub from_history98_vbs()
    Dim oHTML
    Set oHTML = CreateObject("htmlfile")
   
    oHTML.parentWindow.execScript _
    "function sortNum(data){var jsArr = data.split(/\t/)               ;" & _
    "                           jsArr.sort(compareNum)                 ;" & _
    "                           return jsArr.join(""\t"")              ;" & _
    "                      }                                           ;" & _
    "function compareNum(a,b){if(a * 1.0 > b * 1.0)   return     1     ;" & _
    "                         else                    return    -1     ;" & _
    "                      }                                           ;" & _
    "function sortStr(data){var jsArr = data.split(/\t/)               ;" & _
    "                           jsArr.sort(compareStr)                 ;" & _
    "                           return jsArr.join(""\t"")              ;" & _
    "                      }                                           ;" & _
    "function compareStr(a,b){if(a + """" > b + """") return     1     ;" & _
    "                         else                    return    -1     ;" & _
    "                      }                                           ;"
  
    Dim myData
    myData = _
    "999,777,888,9,7,8,99,77,88,333,111,222,3,1,2,33,11,22,666,444,555,6,4,5,66,44,55"
   
    Dim myArr
   
    Dim JSFunc
    Set JSFunc = oHTML.parentWindow
   
    myArr = JSFunc.sortNum(Join(Split(myData, ","), vbTab))
    MsgBox Join(Split(myArr, vbTab), vbLf)
   
     myArr = JSFunc.sortStr(Join(Split(myData, ","), vbTab))
    MsgBox Join(Split(myArr, vbTab), vbLf)
   
End Sub

<20190205追記STA>Excelでの負荷テストサンプル
Sub sheed_test01()
    Dim ix As Integer
    Dim iy As Integer
    Dim WS1 As Worksheet
    Set WS1 = Sheets("Sheet1")
   
    Dim WSFUNC As WorksheetFunction
    Set WSFUNC = Application.WorksheetFunction
   
    Application.ScreenUpdating = False
   
    For ix = 1 To 1000
        For iy = 1 To 12
            WS1.Cells(ix, iy).Value = WSFUNC.RandBetween(0, 30)
        Next
    Next
    Application.ScreenUpdating = True
    MsgBox "Done"
End Sub

 


Sub from_history98_vbs_B()
    Dim oHTML
    Set oHTML = CreateObject("htmlfile")
   
    oHTML.parentWindow.execScript _
    "function sortNum(data){var jsArr = data.split(/\t/)               ;" & _
    "                           jsArr.sort(compareNum)                 ;" & _
    "                           return jsArr.join(""\t"")              ;" & _
    "                      }                                           ;" & _
    "function compareNum(a,b){if(a * 1.0 > b * 1.0)   return     1     ;" & _
    "                         else                    return    -1     ;" & _
    "                      }                                           ;" & _
    "function sortStr(data){var jsArr = data.split(/\t/)               ;" & _
    "                           jsArr.sort(compareStr)                 ;" & _
    "                           return jsArr.join(""\t"")              ;" & _
    "                      }                                           ;" & _
    "function compareStr(a,b){if(a + """" > b + """") return     1     ;" & _
    "                         else                    return    -1     ;" & _
    "                      }                                           ;"
  
    Dim WS1 As Worksheet
    Dim WS2 As Worksheet
    Dim WS3 As Worksheet
   
    Set WS1 = Sheets("Sheet1")
    Set WS2 = Sheets("Sheet2")
    Set WS3 = Sheets("Sheet3")
   
    Dim JSFunc
    Set JSFunc = oHTML.parentWindow
   
    Dim WSFUNC As WorksheetFunction
    Set WSFUNC = Application.WorksheetFunction
   
    Dim ix As Integer
   
    Dim myData As Variant
    Dim myArr  As String
   
    Application.ScreenUpdating = False
   
    For ix = 1 To 1000
        myData = WSFUNC.Transpose(WSFUNC.Transpose(WS1.Range("A" & ix & ":L" & ix).Value))
        myArr = JSFunc.sortNum(Join(myData, vbTab))
        WS2.Range("A" & ix & ":L" & ix).Value = Split(myArr, vbTab)
    Next
    For ix = 1 To 1000
        myData = WSFUNC.Transpose(WSFUNC.Transpose(WS1.Range("A" & ix & ":L" & ix).Value))
        myArr = JSFunc.sortStr(Join(myData, vbTab))
        WS3.Range("A" & ix & ":L" & ix).Value = Split(myArr, vbTab)
    Next
    Application.ScreenUpdating = True
   
    MsgBox "Done"
End Sub
<20190205追記END>

 

 

<20190220追記STA>
'Sub JScrip_in_VBA4()
  Dim nJS
  Dim oJS
 
  Dim strPathIn
  Dim myRec
  Dim oADOST_R


    strPathIn = "C:\Users\user\Desktop\underscore-min.js"

    Set oADOST_R = CreateObject("ADODB.Stream")
    Dim adReadLine: adReadLine = -2
    oADOST_R.Type = 2 '-1--adTypeBinary , 2--adTypeText
    oADOST_R.Charset = "Utf-8"
    oADOST_R.LineSeparator = -1  ' -1 CrLf , 10 Lf , 13 Cr
    oADOST_R.Open
    oADOST_R.LoadFromFile = strPathIn
       
    myRec = ""
    Do While Not oADOST_R.EOS
        myRec = myRec & oADOST_R.ReadText(adReadLine) & vbCrLf
    Loop
    oADOST_R.Close
    Set oADOST_R = Nothing
  Dim oHTML
  Set oHTML = CreateObject("htmlfile")
 
  oHTML.ParentWindow.execscript myRec & vbCrLf & _
  "function shuffle(data){var jsArr  = data.split(/\t/)          ;" & _
  "                       var jsArr2 = _.shuffle(jsArr)          ;" & _
  "                       return jsArr2.join(""\t"")             ;" & _
  "                      }                                       ;" & _
  "function num_map(data){var jsArr  = data.split(/\t/)          ;" & _
  "                       var jsArr2 = _.map(jsArr, function(v){ ;" & _
  "                                          return v * 5;})     ;" & _
  "                       return jsArr2.join(""\t"")             ;" & _
  "                      }                                        "
 
  Dim JSFunc
  Set JSFUNC = oHTML.ParentWindow
 
  Dim mydata
  mydata = " 1, 2, 3, 4, 5, 6, 7, 8, 9,10"

  Dim res_data
  res_data  =   JSFUNC.shuffle(Join(Split(mydata, ","), vbTab))
  MsgBox Join(Split(res_data, vbTab), vbLf)

  res_data  =   JSFUNC.num_map(Join(Split(mydata, ","), vbTab))
  MsgBox Join(Split(res_data, vbTab), vbLf)

 'End Sub


 <20190220追記END>
 

 


この記事についてブログを書く
« でっきるかな?PowerShell 00... | トップ | JScript でInputBoxを使う(E... »