How can I use JavaScript within an Excel macro?

前端 未结 4 848
说谎
说谎 2020-12-02 08:52

There’s a really cool diff class hosted by Google here:

http://code.google.com/p/google-diff-match-patch/

I’ve used it before on a few web sites, but now I n

4条回答
  •  日久生厌
    2020-12-02 09:07

    The simplest approach may be to embed the Javascript diff logic into a COM component directly using Javascript. This is possible via something called "Windows Script Components".

    Here's a tutorial on creating WSCs.

    A Windows Script Component is a COM component that is defined in script. The interface to the component is via COM, which means it is VBA friendly. The logic is implemented in any Windows Scripting Hosting -compatible language, like JavaScript or VBScript. The WSC is defined in a single XML file, which embeds the logic, the component Class ID, the methods, the registration logic, and so on.

    There's also a tool available to help in creating a WSC. Basically it is a wizard-type thing that asks you questions and fills in the XML template. Myself, I just started with an example .wsc file and edited it by hand with a text editor. It's pretty self-explanatory.

    A COM component defined this way in script (in a .wsc file) is callable just like any other COM component, from any environment that can dance with COM.

    UPDATE: I took a few minutes and produced the WSC for GoogleDiff. Here it is.

    
    
    
    
    
    
      
        COM Wrapper on the Diff/Match/Patch logic published by Google at http://code.google.com/p/google-diff-match-patch/.
      
    
    
    
    
    
      
    
    
    
    
      
        
        
      
      
        
        
      
    
    
    
    
    
    
    
    
    

    To use that thing, you have to register it. In Explorer, right click on it, and select "Register". or, from the command line: regsvr32 file:\c:\scripts\GoogleDiff.wsc

    I didn't try using it from VBA, but here is some VBScript code that uses the component.

    Sub TestDiff()
        dim t1 
        t1 = "The quick brown fox jumped over the lazy dog."
    
        dim t2 
        t2 = "The large fat elephant jumped over the cowering flea."
    
        WScript.echo("")
    
        WScript.echo("Instantiating a Diff Component ...")
        dim d
        set d = WScript.CreateObject("Cheeso.Google.DiffMatchPatch")
    
        WScript.echo("Doing the Diff...")
        x = d.Diff(t1, t2)
    
        WScript.echo("")
        WScript.echo("Result was of type: " & TypeName(x))
        ' result is all the diffs, joined by commas.  
        ' Each diff is an integer (position), and a string.  These are separated by commas.
        WScript.echo("Result : " & x)
    
        WScript.echo("Transform result...")
        z= Split(x, ",")
        WScript.echo("")
        redim diffs(ubound(z)/2)
        i = 0
        j = 0
        For Each item in z
          If (j = 0) then
            diffs(i) = item
            j = j+ 1      
          Else 
              diffs(i) = diffs(i) & "," & item
            i = i + 1
            j = 0
          End If
        Next
    
        WScript.echo("Results:")
        For Each item in diffs
          WScript.echo("  " & item)
        Next
    
        WScript.echo("Done.")
    
    End Sub
    

提交回复
热议问题