将 VBA 翻译成 JavaScript 自定义函数,得到不同的答案
Posted
技术标签:
【中文标题】将 VBA 翻译成 JavaScript 自定义函数,得到不同的答案【英文标题】:Translated VBA to JavaScript Custom Function, Getting Different Answer 【发布时间】:2019-11-19 20:33:02 【问题描述】:我有以下 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 中更改厚度英寸,答案保持不变。另外,如果有人对如何缩短代码有任何建议,请告诉我!
【问题讨论】:
javascript 开关 (a|b) 在 vb 中不受支持,这意味着按位或这两个数字然后比较,+""+ 作为运算符会做得更好.. 更短我会选择一个哈希表的键 【参考方案1】:在 VBA 中,您使用的是 &
,Microsoft 文档告诉我这是字符串连接。在 JavaScript 中,您使用的是|
,它是按位或。要连接您的数值,您需要先将它们转换为字符串,然后将它们与+
组合。执行此操作的规范方法是将您的号码添加到字符串中,因此我建议使用 case "" + 1 + 0:
作为您对 Case 1 & 0
的翻译。
【讨论】:
以上是关于将 VBA 翻译成 JavaScript 自定义函数,得到不同的答案的主要内容,如果未能解决你的问题,请参考以下文章