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

标签 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 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 中的 ThicknessInches,答案保持不变。另外,如果有人对如何缩短代码有任何建议,请告诉我!

最佳答案

在 VBA 中,您使用的是 &,Microsoft 文档告诉我这是字符串连接。在 JavaScript 中,您使用的是 |,它是按位或。要连接数值,您需要首先将它们转换为字符串,然后使用 + 将它们组合起来。执行此操作的规范方法是将您的号码添加到字符串中,因此我建议使用 case ""+ 1 + 0: 作为 Case 1 & 0 的翻译.

关于javascript - 将 VBA 转换为 JavaScript 自定义函数,得到不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942376/

相关文章:

javascript - Perl 将值转换为表

javascript - javascript中switch case跳转到错误的case(如何正确使用break命令)

javascript - 通过 javascript 组合和评估用户输入的最佳方式是什么?

excel - Excel 是否可以识别单元格中以逗号分隔的数字模式并删除该模式的重复项?

javascript - 在 Firefox 中单击鼠标中键在新选项卡中打开自定义 URL

javascript - Jquery 中带有特殊字符的 ID

javascript - AngularJS ngTable延迟显示ajax数据

java - 嵌套 if/else、开关或更有效的 RPG 战斗?

ios - 将 Interface Builder 用于 Switch

tsql - Linq To NHibernate Plus sql 用户定义函数