将VBA转换为JavaScript自定义函数,得到不同的答案

将VBA转换为JavaScript自定义函数,得到不同的答案,javascript,switch-statement,user-defined-functions,Javascript,Switch Statement,User Defined Functions,我有以下VBA UDF qty = 1 numPierces = 5 material = 1 thicknessInches = 0.18 easy1OrHard2 = 1 Function pierceMins(qty As Double, numPierces As Double, material As Double, thicknessInches As Double, easy1OrHard2 As Double) 'Stainless = 1 Steel = 2 Aluminu

我有以下VBA UDF

qty = 1
numPierces = 5
material = 1
thicknessInches = 0.18
easy1OrHard2 = 1


Function pierceMins(qty As Double, numPierces As Double, material As Double, thicknessInches As Double, easy1OrHard2 As Double)
'Stainless = 1 Steel = 2 Aluminum = 3
Dim procEff As Double
Dim pierceSecs As Double
Dim holesInchPerMin As Double
Dim perimInchPerMin As Double
'***********************************************************************
' EFFICIENCY
'***********************************************************************
    Select Case qty
        Case 0 To 2
            procEff = 0.35 * 0.8
        Case 3 To 4
            procEff = 0.55 * 0.8
        Case 5 To 9
            procEff = 0.7 * 0.8
        Case 10 To 24
            procEff = 0.8 * 0.8
        Case 25 To 49
            procEff = 0.9 * 0.8
        Case Is >= 50
            procEff = 1 * 0.8
        Case Else
    End Select
'***********************************************************************
' STAINLESS
'***********************************************************************
    Select Case material & thicknessInches
        Case 1 & 0
            pierceSecs = 0.1
            holesInchPerMin = 280
            perimInchPerMin = 325
        Case 1 & 0.035, 1 & 0.048
            pierceSecs = 0.2
            holesInchPerMin = 175
            perimInchPerMin = 200
        Case 1 & 0.06
            pierceSecs = 0.3
            holesInchPerMin = 120
            perimInchPerMin = 140
        Case 1 & 0.075, 1 & 0.105
            pierceSecs = 0.75
            holesInchPerMin = 100
            perimInchPerMin = 100
        Case 1 & 0.135
            pierceSecs = 0.3
            holesInchPerMin = 70
            perimInchPerMin = 90
        Case 1 & 0.18, 1 & 0.25
            pierceSecs = 0.3
            holesInchPerMin = 57
            perimInchPerMin = 65
        Case 1 & 0.312
            pierceSecs = 1
            holesInchPerMin = 30
            perimInchPerMin = 35
        Case 1 & 0.375
            pierceSecs = 5
            holesInchPerMin = 25
            perimInchPerMin = 29
        Case 1 & 0.437
            pierceSecs = 4
            holesInchPerMin = 25
            perimInchPerMin = 29
        Case 1 & 0.5
            pierceSecs = 9
            holesInchPerMin = 15
            perimInchPerMin = 13
'***********************************************************************
' STEEL
'***********************************************************************
        Case 2 & 0, 2 & 0.02, 2 & 0.03
            pierceSecs = 0.5
            holesInchPerMin = 157
            perimInchPerMin = 170
        Case 2 & 0.035, 2 & 0.048
            pierceSecs = 1
            holesInchPerMin = 155
            perimInchPerMin = 165
        Case 2 & 0.06
            pierceSecs = 1
            holesInchPerMin = 125
            perimInchPerMin = 140
        Case 2 & 0.075
            pierceSecs = 1.5
            holesInchPerMin = 114
            perimInchPerMin = 125
        Case 2 & 0.086, 2 & 0.105
            pierceSecs = 2
            holesInchPerMin = 80
            perimInchPerMin = 110
        Case 2 & 0.135
            pierceSecs = 5
            holesInchPerMin = 70
            perimInchPerMin = 85
        Case 2 & 0.18
            pierceSecs = 11
            holesInchPerMin = 32
            perimInchPerMin = 65
        Case 2 & 0.25
            pierceSecs = 14
            holesInchPerMin = 35
            perimInchPerMin = 55
        Case 2 & 0.312
            pierceSecs = 14
            holesInchPerMin = 14
            perimInchPerMin = 35
        Case 2 & 0.375
            pierceSecs = 20
            holesInchPerMin = 20
            perimInchPerMin = 40
        Case 2 & 0.437
            pierceSecs = 20
            holesInchPerMin = 20
            perimInchPerMin = 47
        Case 2 & 0.5, 2 & 0.562
            pierceSecs = 18
            holesInchPerMin = 22
            perimInchPerMin = 35
        Case 2 & 0.625
            pierceSecs = 18
            holesInchPerMin = 27
            perimInchPerMin = 35
        Case 2 & 0.75
            pierceSecs = 35
            holesInchPerMin = 32
            perimInchPerMin = 22
'***********************************************************************
' ALUMINUM
'***********************************************************************
        Case 3 & 0
            pierceSecs = 0.1
            holesInchPerMin = 255
            perimInchPerMin = 300
        Case 3 & 0.035, 3 & 0.048
            pierceSecs = 0.2
            holesInchPerMin = 196
            perimInchPerMin = 236
        Case 3 & 0.06
            pierceSecs = 0.4
            holesInchPerMin = 137
            perimInchPerMin = 157
        Case 3 & 0.075, 3 & 0.105
            pierceSecs = 0.5
            holesInchPerMin = 80
            perimInchPerMin = 98
        Case 3 & 0.135
            pierceSecs = 1
            holesInchPerMin = 47
            perimInchPerMin = 60
        Case 3 & 0.18
            pierceSecs = 2.5
            holesInchPerMin = 31
            perimInchPerMin = 39
        Case 3 & 0.25, 3 & 0.312
            pierceSecs = 11
            holesInchPerMin = 20
            perimInchPerMin = 40
        Case 3 & 0.375
            pierceSecs = 12
            holesInchPerMin = 15
            perimInchPerMin = 25
        Case Else
    End Select
    If easy1OrHard2 = 1 Then
        pierceMins = ((pierceSecs) / procEff * numPierces) / 60
    Else
        pierceMins = ((pierceSecs) / procEff * numPierces) / 60 * (1.2) '20% is added for Intricate Cutting Cycle Time Added
    End If
End Function
我将这段代码翻译成JavaScript,但得到了不同的答案

/**
 * pierceMins
 * @customfunction pierceMins
 * @param {number} qty
 * @param {number} numPierces
 * @param {number} material 
 * @param {number} thicknessInches
 * @param {number} easy1OrHard2
 * @returns {number} pierceMins
 */
function pierceMins(qty, numPierces, material, thicknessInches, easy1OrHard2) {
  var pierceSecs;
  var holesInchPerMin;
  var perimInchPerMin;
  var procEff;
  switch(qty) {
      case 0: case 1: case 2:
          procEff = 0.35 * 0.8;
          break;
      case 3: case 4:
          procEff = 0.55 * 0.8;
          break;
      case 5: case 6: case 7: case 8: case 9:
          procEff = 0.7 * 0.8;
          break;
      case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24:
          procEff = 0.8 * 0.8;
          break;
      case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39:
      case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: case 48: case 49:
          procEff = 0.9 * 0.8;
          break;
      default:
          procEff = 1 * 0.8;
  }
  switch("" + material + thicknessInches) {
  //Stainless
      case "" + 1 + 0:
          pierceSecs = 0.1;
          holesInchPerMin = 280;
          perimInchPerMin = 325;
          break;
      case "" + 1 + 0.035: case "" + 1 + 0.048:
          pierceSecs = 0.2;
          holesInchPerMin = 175;
          perimInchPerMin = 200;
          break;
      case "" + 1 + 0.06:
          pierceSecs = 0.3;
          holesInchPerMin = 120;
          perimInchPerMin = 140;
          break;
      case "" + 1 + 0.075: case "" + 1 + 0.105:
          pierceSecs = 0.75;
          holesInchPerMin = 100;
          perimInchPerMin = 100;
          break;
      case "" + 1 + 0.135:
          pierceSecs = 0.3;
          holesInchPerMin = 70;
          perimInchPerMin = 90;
          break;
      case "" + 1 + 0.18: case "" + 1 + 0.25:
          pierceSecs = 0.3;
          holesInchPerMin = 57;
          perimInchPerMin = 65;
          break;
      case "" + 1 + 0.312:
          pierceSecs = 1;
          holesInchPerMin = 30;
          perimInchPerMin = 35;
          break;
      case "" + 1 + 0.375:
          pierceSecs = 5;
          holesInchPerMin = 25;
          perimInchPerMin = 29;
          break;
      case "" + 1 + 0.437:
          pierceSecs = 4;
          holesInchPerMin = 25;
          perimInchPerMin = 29;
          break;
      case "" + 1 + 0.5:
          pierceSecs = 9;
          holesInchPerMin = 15;
          perimInchPerMin = 13;
          break;
 // Steel
      case "" + 2 + 0: case "" + 2 + 0.02: case "" + 2 + 0.03:
          pierceSecs = 0.5;
          holesInchPerMin = 157;
          perimInchPerMin = 170;
          break;
      case "" + 2 + 0.035: case "" + 2 + 0.048:
          pierceSecs = 1;
          holesInchPerMin = 155;
          perimInchPerMin = 165;
          break;
      case "" + 2 + 0.06:
          pierceSecs = 1;
          holesInchPerMin = 125;
          perimInchPerMin = 140;
          break;
      case "" + 2 + 0.075:
          pierceSecs = 1.5;
          holesInchPerMin = 114;
          perimInchPerMin = 125;
          break;
      case "" + 2 + 0.086: case "" + 2 + 0.105:
          pierceSecs = 2;
          holesInchPerMin = 80;
          perimInchPerMin = 110;
          break;
      case "" + 2 + 0.135:
          pierceSecs = 5;
          holesInchPerMin = 70;
          perimInchPerMin = 85;
          break;
      case "" + 2 + 0.18:
          pierceSecs = 11;
          holesInchPerMin = 32;
          perimInchPerMin = 65;
          break;
      case "" + 2 + 0.25:
          pierceSecs = 14;
          holesInchPerMin = 35;
          perimInchPerMin = 55;
          break;
      case "" + 2 + 0.312:
          pierceSecs = 14;
          holesInchPerMin = 14;
          perimInchPerMin = 35;
          break;
      case "" + 2 + 0.375:
          pierceSecs = 20;
          holesInchPerMin = 20;
          perimInchPerMin = 40;
          break;
      case "" + 2 + 0.437:
          pierceSecs = 20;
          holesInchPerMin = 20;
          perimInchPerMin = 47;
          break;
      case "" + 2 + 0.5: case "" + 2 + 0.562:
          pierceSecs = 18;
          holesInchPerMin = 22;
          perimInchPerMin = 35;
          break;
      case "" + 2 + 0.625:
          pierceSecs = 18;
          holesInchPerMin = 27;
          perimInchPerMin = 35;
          break;
      case "" + 2 + 0.75:
          pierceSecs = 35;
          holesInchPerMin = 32;
          perimInchPerMin = 22;
          break;
 //Aluminum
      case "" + 3 + 0:
          pierceSecs = 0.1;
          holesInchPerMin = 255;
          perimInchPerMin = 300;
          break;
      case "" + 3 + 0.035: case "" + 3 + 0.048:
          pierceSecs = 0.2;
          holesInchPerMin = 196;
          perimInchPerMin = 236;
          break;
      case "" + 3 + 0.06:
          pierceSecs = 0.4;
          holesInchPerMin = 137;
          perimInchPerMin = 157;
          break;
      case "" + 3 + 0.075: case "" + 3 + 0.105:
          pierceSecs = 0.5;
          holesInchPerMin = 80;
          perimInchPerMin = 98;
          break;
      case "" + 3 + 0.135:
          pierceSecs = 1;
          holesInchPerMin = 47;
          perimInchPerMin = 60;
          break;
      case "" + 3 + 0.18:
          pierceSecs = 2.5;
          holesInchPerMin = 31;
          perimInchPerMin = 39;
          break;
      case "" + 3 + 0.25: case "" + 3 + 0.312:
          pierceSecs = 11;
          holesInchPerMin = 20;
          perimInchPerMin = 40;
          break;
      case "" + 3 + 0.375:
          pierceSecs = 12;
          holesInchPerMin = 15;
          perimInchPerMin = 25;
          break;
      default:
      //  alert("Does not work");
  }
  if (easy1OrHard2 == 1) {
      return ((pierceSecs) / procEff * numPierces) / 60; 
  } else {
      return ((pierceSecs) / procEff * numPierces) / 60 * (1.2);
  }
}

在VBA中,我得到的答案是0.09,这是正确的。我想我的开关箱工作不正常。如果我在JavaScript中更改thicknessinges,答案将保持不变。另外,如果有人对如何缩短代码有任何建议,请让我知道

在VBA中,您使用的是
&
,Microsoft文档告诉我这是字符串连接。在JavaScript中,您使用的是
|
,它是按位或。要连接数值,首先需要将它们转换为字符串,然后将它们与
+
组合。实现这一点的标准方法是将数字添加到字符串中,因此我建议使用
case”“+1+0:
作为VBA中
case 1&0
的翻译,您使用的是
&
,Microsoft文档告诉我这是字符串连接。在JavaScript中,您使用的是
|
,它是按位或。要连接数值,首先需要将它们转换为字符串,然后将它们与
+
组合。实现这一点的标准方法是将数字添加到字符串中,因此我建议使用
case”“+1+0:
,因为您对
case 1&0

javascript开关(a | b)的翻译不像vb那样受支持,它意味着按位或这两个数字,然后比较,++as运算符会更好。。越短,我会选择hashtablejavascript开关的一个键(a | b)在vb中不受支持,它意味着按位或这两个数字,然后比较,+“”+as运算符会更好。。我会选择一个哈希表的键