1

这是一个 JavaScript 问题,但是……我的目标是使用 Excel VBA 中的 Microsoft Script Control 来执行数组操作。脚本控件使用 MS JScript,大致相当于 ES3,但没有窗口对象。

当我说数组操作时,我的意思是......如果 [a] 是一个由 100 个数字组成的数组,而 [b] 是一个由另外 100 个数字组成的数组,我正在寻找的是让 JScript 返回一个新数组 [c] 100 个数字,每个元素等于对 [a] 和 [b] 的指定操作,逐个元素。

我在下面编写的代码工作得很好。但...

我想添加更多的操作,但我很沮丧的是,每个操作的每个 JScript 函数都与所有其他操作完全相同,只有微小但至关重要的差异。例如 sum()、sub()、mul() 和 div() 函数之间的唯一区别是相应的运算符:+=-=*=/=。这四个函数中的其余代码是 100% 重复的。

问题 #1:如何更通用地编写 JScript 以减少重复代码?

问题 #2:我怎样才能使这项工作不仅仅适用于两个输入数组,目前是 [a] 和 [b]?我最好让 JScript 操作函数接受动态数量的数组,例如对输入数组的 AVERAGE 操作。

我的VB技能很高。我的 JavaScript 技能不是。请记住,JavaScript 代码本质上必须是 ES3。

Function ArrayOp(op, a, b)
    Static sc As Object

    If sc Is Nothing Then
        Set sc = CreateObject("ScriptControl")
        With sc
            .Language = "JScript"
            .AddCode "function jsArray(v){return new VBArray(v).toArray()}"
            .AddCode "function vbArray(t){for(var r=new ActiveXObject('Scripting.Dictionary'),e=0;e<t.length;e++)r.add(e,t[e]);return r.items()}"

            .AddCode "function sum(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]+=b[t];return vbArray(a);}"
            .AddCode "function sub(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]-=b[t];return vbArray(a);}"
            .AddCode "function mul(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]*=b[t];return vbArray(a);}"
            .AddCode "function div(v,w){for(var a=jsArray(v),b=jsArray(w),t=0;t<a.length;t++)a[t]/=b[t];return vbArray(a);}"
        End With
    End If

    ArrayOp = sc.Run(op, a, b)        
End Function
Sub Test()
    Dim a, b, c
    a = [a1:a999].Value2
    b = [b1:b999].Value2

    c = ArrayOp("div", a, b) '<~- c is now a VBA array of 999 elements with values = a / b
End Sub
4

0 回答 0