Как я могу использовать JavaScript в рамках макроса Excel?

Достигнуть результата очень просто, просто используйте:

$sum = 0; // you need to intillize variable sum here
for($i = 1; $i <= 5; $i++) {
    $sum = $sum + $i; //you can add all the value in sum and echo it.
    echo $sum . "<br>";
}
19
задан richardtallent 13 May 2009 в 02:37
поделиться

4 ответа

Самый простой подход может заключаться в встроить логику сравнения Javascript в компонент COM напрямую с помощью Javascript. Это возможно с помощью так называемого « Windows Script Components ».

Вот руководство по созданию WSC .

Компонент сценария Windows - это компонент COM, который определяется в сценарии. Интерфейс к компоненту осуществляется через COM, что означает, что он совместим с VBA. Логика реализована на любом языке, совместимом с Windows Scripting Hosting, например JavaScript или VBScript. WSC определяется в одном XML-файле, который включает логику, идентификатор класса компонента, методы, логику регистрации и т. Д.

Также доступен инструмент , помогающий в создании WSC . По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в сценарии (в файле .wsc), вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: который включает логику, идентификатор класса компонента, методы, логику регистрации и так далее.

Также доступен инструмент , помогающий в создании WSC . По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в скрипте (в файле .wsc), может быть вызван, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: который включает логику, идентификатор класса компонента, методы, логику регистрации и так далее.

Также доступен инструмент , помогающий в создании WSC . По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в сценарии (в файле .wsc), вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: и так далее.

Также доступен инструмент , помогающий в создании WSC . По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в сценарии (в файле .wsc), вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: и так далее.

Также доступен инструмент , помогающий в создании WSC . По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в сценарии (в файле .wsc), вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в сценарии (в файле .wsc), вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: По сути, это нечто вроде мастера, который задает вам вопросы и заполняет шаблон XML. Лично я просто начал с примера файла .wsc и отредактировал его вручную с помощью текстового редактора. Это довольно понятно.

Компонент COM, определенный таким образом в скрипте (в файле .wsc), может быть вызван, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: wsc) вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: wsc) вызывается, как и любой другой компонент COM, из любой среды, которая может танцевать с COM.

ОБНОВЛЕНИЕ : Я потратил несколько минут и создал WSC для GoogleDiff. Вот она.

<?xml version="1.0"?>

<package>

<component id="Cheeso.Google.DiffMatchPatch">

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

<?component error="true" debug="true"?>

<registration
  description="WSC Component for Google Diff/Match/Patch"
  progid="Cheeso.Google.DiffMatchPatch"
  version="1.00"
  classid="{36e400d0-32f7-4778-a521-2a5e1dd7d11c}"
  remotable="False">

  <script language="VBScript">
  <![CDATA[

    strComponent = "Cheeso's COM wrapper for Google Diff/Match/Patch"

    Function Register
      MsgBox strComponent & " - registered."
    End Function

    Function Unregister
      MsgBox strComponent & " - unregistered."
    End Function

  ]]>
  </script>
</registration>


<public>
  <method name="Diff">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
  <method name="DiffFast">
    <parameter name="text1"/>
    <parameter name="text2"/>
  </method>
</public>


<script language="Javascript">
<![CDATA[


    // insert original google diff code here...


// public methods on the component
var dpm = new diff_match_patch();


function Diff(text1, text2)
{
   return dpm.diff_main(text1, text2, false);
}


function DiffFast(text1, text2)
{
   return dpm.diff_main(text1, text2, true);
}


]]>
</script>

</component>

</package>

Чтобы использовать эту штуку, вы должны ее зарегистрировать. В проводнике щелкните его правой кнопкой мыши и выберите «Зарегистрироваться». или из командной строки: regsvr32 файл: \ c: \ scripts \ GoogleDiff.wsc

Я не пробовал использовать его из VBA, но вот код VBScript, который использует этот компонент.

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
12
ответ дан 30 November 2019 в 04:54
поделиться

Механизм сценариев Windows позволяет запускать библиотеку JavaScript. По моему опыту, это хорошо работает.

4
ответ дан 30 November 2019 в 04:54
поделиться

Я бы посоветовал заключить все, что вы делаете, в оболочку COM. VBA лучше всего работает с COM-объектами, поэтому вы можете скомпилировать как компонент .NET, а затем предоставить его как COM-объект, используя функциональные возможности взаимодействия .NET.

В качестве альтернативы вы также можете изучить возможность использования объектов Windows Scripting Host для выполнения файла Javascript и возврата результата.

2
ответ дан 30 November 2019 в 04:54
поделиться

Вот еще один вариант, который следует рассмотреть, хотя я никоим образом не называю его лучшим.

  • Убедитесь, что версия Python компилируется в IronPython. (Здесь не должно быть никаких проблем или портирован только небольшой объем.)
  • Создайте библиотеку надстройки Excel с помощью C # и ссылайтесь на IronPython из нее.
  • Оберните необходимую функциональность в свой C # Excel надстройка.
1
ответ дан 30 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: