@@ -12,7 +12,7 @@ Option Explicit
12
12
Option Base 0
13
13
'#
14
14
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
15
- ' Copyright © 2022-2024 W. García
15
+ ' Copyright © 2022-2025 W. García
16
16
' GPL-3.0 license | https://www.gnu.org/licenses/gpl-3.0.html/
17
17
' https://ingwilfredogarcia.wordpress.com
18
18
'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -312,7 +312,7 @@ Private Sub Class_Initialize()
312
312
P_SEPARATORCHAR = d_Semicolon
313
313
P_DEC_SYMBOL = dsDot
314
314
AscDecSymbol = 46
315
- P_GALLOPING_MODE = True
315
+ P_GALLOPING_MODE = False
316
316
P_FORMATRESULT = False
317
317
BuildinFunctIDList = "abs;floor;achisq;asin;acos;aerf;afishf;agauss;asc;anorm;atn;astudt;array;avg;beta.dist" & _
318
318
";betainv;ceil;chisq;cholesky;cholinverse;cholsolve;chr;cos;choose;date;dateadd;datediff" & _
@@ -2888,10 +2888,10 @@ err_Handler:
2888
2888
End Function
2889
2889
2890
2890
''' <summary>
2891
- ''' Returns the distance between two given points. The points
2892
- ''' must be given each one in array format, ex.:
2893
- ''' {{x1;y1}};{{x2;y2}}
2891
+ ''' Returns the distance between two given points.
2894
2892
''' </summary>
2893
+ ''' <param name="Point1">Array of coordinates in format {{x1;y1}}.</param>
2894
+ ''' <param name="Point2">Array of coordinates in format {{x2;y2}}.</param>
2895
2895
Private Function Distance (ByRef expression As String , ByRef fName As String ) As String
2896
2896
Dim argsCount As Long
2897
2897
Dim tmpData() As String
@@ -3105,7 +3105,9 @@ Private Function EvalFunction(ByRef Argument As String, ByRef FunctionName As St
3105
3105
Case "aNow" : EvalFunction = Now_(Argument, FunctionName)
3106
3106
Case "aNPER" : EvalFunction = NPER_(Argument, FunctionName)
3107
3107
Case "aNPV" : EvalFunction = NPV_(Argument, FunctionName)
3108
+ Case "ParallelLine" : EvalFunction = ParallelLine(Argument, FunctionName)
3108
3109
Case "Percent" : EvalFunction = Percent(Argument, FunctionName)
3110
+ Case "PerpendicularLine" : EvalFunction = PerpendicularLine(Argument, FunctionName)
3109
3111
Case "aPMT" : EvalFunction = PMT_(Argument, FunctionName)
3110
3112
Case "aPPMT" : EvalFunction = PPMT_(Argument, FunctionName)
3111
3113
Case "Power" : EvalFunction = Power(Argument, FunctionName)
@@ -3670,7 +3672,6 @@ Private Function fZeroMBM(ByRef aFunction As String, ByVal A As Double, _
3670
3672
aZero = 10 * epsilon
3671
3673
With fEvalHelper
3672
3674
.Create aFunction
3673
- .GallopingMode = False
3674
3675
tmpVar() = Split(.CurrentVariables, "; " )
3675
3676
varLB = LBound(tmpVar)
3676
3677
If UBound(tmpVar) - varLB > 0 Then 'Reject multivariate functions
@@ -3787,7 +3788,6 @@ Private Function fZeroMRF(ByRef aFunction As String, ByVal A As Double, _
3787
3788
Set fEvalHelper = New VBAexpressions
3788
3789
aZero = 10 * epsilon
3789
3790
With fEvalHelper
3790
- .GallopingMode = False
3791
3791
.Create aFunction
3792
3792
tmpVar() = Split(.CurrentVariables, "; " )
3793
3793
varLB = LBound(tmpVar)
@@ -5883,10 +5883,9 @@ End Function
5883
5883
5884
5884
''' <summary>
5885
5885
''' Returns the intersection point for two lines.
5886
- ''' The lines must be given by two crossing points each
5887
- ''' in array format, ex.:
5888
- ''' {{x1;y1};{x2;y2}}; {{x3;y3};{x4;y4}}
5889
5886
''' </summary>
5887
+ ''' <param name="Line1">Array of coordinates in format {{x1;y1};{x2;y2}}.</param>
5888
+ ''' <param name="Line2">Array of coordinates in format {{x3;y3};{x4;y4}}.</param>
5890
5889
Private Function LinesIntersect (ByRef expression As String , ByRef fName As String ) As String
5891
5890
Dim argsCount As Long
5892
5891
Dim tmpData() As String
@@ -5906,14 +5905,16 @@ Private Function LinesIntersect(ByRef expression As String, ByRef fName As Strin
5906
5905
aArray(0 ) = ToDblArray(ArrayFromString(tmpData(LB)))
5907
5906
aArray(1 ) = ToDblArray(ArrayFromString(tmpData(UB)))
5908
5907
tmpEval = LinesIntersection(aArray(0 ), aArray(1 ))
5909
- If IsArray(tmpEval) Then
5910
- tmpEval = ArrayToString(tmpEval)
5911
- End If
5912
5908
Case Else
5913
5909
tmpEval = e_ValueError
5914
5910
BuildErrMessage errMissingArgsOrTooManyArgs, d_lCurly & fName & d_rCurly
5915
5911
End Select
5916
- LinesIntersect = tmpEval: Erase tmpData
5912
+ If IsArray(tmpEval) Then
5913
+ LinesIntersect = ArrayToString(tmpEval)
5914
+ Else
5915
+ LinesIntersect = tmpEval
5916
+ End If
5917
+ Erase tmpData
5917
5918
Exit Function
5918
5919
err_Handler:
5919
5920
LinesIntersect = e_ValueError
@@ -7547,6 +7548,66 @@ Private Function PatternToCheckOn(ByRef ArgDefStr As String) As String
7547
7548
End If
7548
7549
End Function
7549
7550
7551
+ ''' <summary>
7552
+ ''' Returns two points representing a line parallel to the given one and
7553
+ ''' containing the given point.
7554
+ ''' </summary>
7555
+ ''' <param name="Line">Array of coordinates in format {{x1;y1};{x2;y2}}.</param>
7556
+ ''' <param name="Point">Array of coordinates in format {{x;y}}.</param>
7557
+ Private Function ParallelLine (ByRef expression As String , ByRef fName As String ) As String
7558
+ Dim argsCount As Long
7559
+ Dim tmpData() As String
7560
+ Dim tmpEval As String
7561
+ Dim LB As Long , UB As Long
7562
+
7563
+ On Error GoTo err_Handler
7564
+ tmpData() = SplitArgs(expression)
7565
+ LB = LBound(tmpData)
7566
+ UB = UBound(tmpData)
7567
+ argsCount = UB - LB + 1
7568
+ Select Case argsCount
7569
+ Case 2
7570
+ Dim aArray() As Variant
7571
+ Dim aTerm As Double
7572
+ Dim bTerm As Double
7573
+ Dim cTerm As Double
7574
+ Dim pointArr(0 To 1 ) As Variant
7575
+ Dim tmpArr(0 To 1 ) As Double
7576
+ ReDim aArray(0 To 1 )
7577
+
7578
+ aArray(0 ) = ToDblArray(ArrayFromString(tmpData(LB)))
7579
+ aArray(1 ) = ToDblArray(ArrayFromString(tmpData(UB)))
7580
+ aTerm = aArray(0 )(0 , 1 ) - aArray(0 )(1 , 1 ) 'y1-y2
7581
+ bTerm = aArray(0 )(1 , 0 ) - aArray(0 )(0 , 0 ) 'x2-x1
7582
+ cTerm = aArray(0 )(0 , 0 ) * aArray(0 )(1 , 1 ) _
7583
+ - aArray(0 )(1 , 0 ) * aArray(0 )(0 , 1 ) 'x1*y2-x2*y1
7584
+ pointArr(0 ) = aArray(1 )
7585
+ If aTerm <> 0 And bTerm <> 0 Then
7586
+ tmpArr(0 ) = 0
7587
+ tmpArr(1 ) = (aTerm * aArray(1 )(0 ) + bTerm * aArray(1 )(1 )) / bTerm
7588
+ Else
7589
+ If aTerm = 0 Then 'Horizontal line
7590
+ tmpArr(0 ) = aArray(1 )(0 ) - aArray(1 )(1 ) + 1
7591
+ tmpArr(1 ) = aArray(1 )(1 )
7592
+ Else 'Vertical line
7593
+ tmpArr(0 ) = aArray(1 )(0 )
7594
+ tmpArr(1 ) = aArray(1 )(0 ) - aArray(1 )(1 ) + 1
7595
+ End If
7596
+ End If
7597
+ pointArr(1 ) = tmpArr
7598
+ tmpEval = ArrayToString(pointArr)
7599
+ Case Else
7600
+ tmpEval = e_ValueError
7601
+ BuildErrMessage errMissingArgsOrTooManyArgs, d_lCurly & fName & d_rCurly
7602
+ End Select
7603
+ ParallelLine = tmpEval: Erase tmpData
7604
+ Exit Function
7605
+ err_Handler:
7606
+ ParallelLine = e_ValueError
7607
+ BuildErrMessage errEvalError, d_lCurly & fName & d_rCurly & " | Error#: " & err.Number & d_Space & _
7608
+ d_lParenthesis & err.Description & d_rParenthesis
7609
+ End Function
7610
+
7550
7611
Private Function Percent (ByRef expression As String , ByRef fName As String ) As String
7551
7612
On Error GoTo err_Handler
7552
7613
Percent = CDbl(expression) / 100
@@ -7557,6 +7618,77 @@ err_Handler:
7557
7618
d_lParenthesis & err.Description & d_rParenthesis
7558
7619
End Function
7559
7620
7621
+ ''' <summary>
7622
+ ''' Returns two points representing a line perpendicular to the
7623
+ ''' given one and containing the given point.
7624
+ ''' </summary>
7625
+ ''' <param name="Line">Array of coordinates in format {{x1;y1};{x2;y2}}.</param>
7626
+ ''' <param name="Point">Array of coordinates in format {{x;y}}.</param>
7627
+ Private Function PerpendicularLine (ByRef expression As String , ByRef fName As String ) As String
7628
+ Dim argsCount As Long
7629
+ Dim tmpData() As String
7630
+ Dim tmpEval As String
7631
+ Dim LB As Long , UB As Long
7632
+
7633
+ On Error GoTo err_Handler
7634
+ tmpData() = SplitArgs(expression)
7635
+ LB = LBound(tmpData)
7636
+ UB = UBound(tmpData)
7637
+ argsCount = UB - LB + 1
7638
+ Select Case argsCount
7639
+ Case 2
7640
+ Dim aArray() As Variant
7641
+ Dim aTerm As Double
7642
+ Dim bTerm As Double
7643
+ Dim cTerm As Double
7644
+ Dim pointArr(0 To 1 ) As Variant
7645
+ Dim tmpArr(0 To 1 ) As Double
7646
+ ReDim aArray(0 To 1 )
7647
+
7648
+ aArray(0 ) = ToDblArray(ArrayFromString(tmpData(LB)))
7649
+ aArray(1 ) = ToDblArray(ArrayFromString(tmpData(UB)))
7650
+ aTerm = aArray(0 )(0 , 1 ) - aArray(0 )(1 , 1 ) 'y1-y2
7651
+ bTerm = aArray(0 )(1 , 0 ) - aArray(0 )(0 , 0 ) 'x2-x1
7652
+ cTerm = aArray(0 )(0 , 0 ) * aArray(0 )(1 , 1 ) _
7653
+ - aArray(0 )(1 , 0 ) * aArray(0 )(0 , 1 ) 'x1*y2-x2*y1
7654
+ pointArr(0 ) = aArray(1 )
7655
+ If aTerm <> 0 And bTerm <> 0 Then
7656
+ ' (-c*a+b(b*x3-a*y3))/(a^2 + b^2)
7657
+ tmpArr(0 ) = (-cTerm * aTerm + bTerm * (bTerm * aArray(1 )(0 ) - aTerm * aArray(1 )(1 ))) _
7658
+ / _
7659
+ (aTerm ^ 2 + bTerm ^ 2 )
7660
+ ' (-a(b*x3-a*y3)-b*c)/(a^2 + b^2)
7661
+ tmpArr(1 ) = (-aTerm * (bTerm * aArray(1 )(0 ) - aTerm * aArray(1 )(1 )) - bTerm * cTerm) _
7662
+ / _
7663
+ (aTerm ^ 2 + bTerm ^ 2 )
7664
+ If pointArr(0 )(0 ) = tmpArr(0 ) And _
7665
+ pointArr(0 )(1 ) = tmpArr(1 ) Then 'Known point is the intersection
7666
+ tmpArr(0 ) = pointArr(0 )(0 ) + 1
7667
+ tmpArr(1 ) = pointArr(0 )(1 ) + bTerm / aTerm
7668
+ End If
7669
+ Else
7670
+ If aTerm = 0 Then 'Horizontal line
7671
+ tmpArr(0 ) = aArray(1 )(0 )
7672
+ tmpArr(1 ) = aArray(1 )(0 ) - aArray(1 )(1 ) + 1
7673
+ Else 'Vertical line
7674
+ tmpArr(0 ) = aArray(1 )(0 ) - aArray(1 )(1 ) + 1
7675
+ tmpArr(1 ) = aArray(1 )(1 )
7676
+ End If
7677
+ End If
7678
+ pointArr(1 ) = tmpArr
7679
+ tmpEval = ArrayToString(pointArr)
7680
+ Case Else
7681
+ tmpEval = e_ValueError
7682
+ BuildErrMessage errMissingArgsOrTooManyArgs, d_lCurly & fName & d_rCurly
7683
+ End Select
7684
+ PerpendicularLine = tmpEval: Erase tmpData
7685
+ Exit Function
7686
+ err_Handler:
7687
+ PerpendicularLine = e_ValueError
7688
+ BuildErrMessage errEvalError, d_lCurly & fName & d_rCurly & " | Error#: " & err.Number & d_Space & _
7689
+ d_lParenthesis & err.Description & d_rParenthesis
7690
+ End Function
7691
+
7560
7692
Private Function PMT_ (ByRef expression As String , ByRef fName As String ) As String
7561
7693
Dim argsCount As Long
7562
7694
Dim tmpData() As String
0 commit comments