|
最近因为需要用到一个表达式计算的功能,所以自己花了一些精力完成了,但目前遇到的问题想请教下各位大佬。
第一:回调函数目前是通过事件来完成的,但因为通过事件就限定了使用场景只能在窗体的对象模块中使用,不能在公共模块中使用。所以想知道有没有什么办法处理回调函数。
目前我是这样做的如下图。
在窗体初始的时候添加函数及常量
Private Sub UserForm_Initialize()
iRow = 2
Set F = New cFormulan
'添加常量
Call F.AddUserConstant("Pi", "3.1415926535897932385")
Call F.AddUserConstant("true", "1")
Call F.AddUserConstant("false", "0")
Call F.AddUserConstant("亿", "100000000")
'添加函数
Call F.AddUserFunction("abs", 1)
Call F.AddUserFunction("sqr", 1)
Call F.AddUserFunction("sqrt", 1)
Call F.AddUserFunction("round", 2)
Call F.AddUserFunction("left", 2)
Call F.AddUserFunction("right", 2)
Call F.AddUserFunction("sin", 1)
End Sub
通过事件处理变量及函数,虽然目前来看是没有什么问题,也比较容易扩展函数功能。目前唯一遗憾的想知道有没有回调函数可以避开使用事件。
Private Sub F_FunctionCallback(ByVal fName As String, ByVal Args As Variant, ByVal aIndex As Long, result As Variant)
Select Case fName
Case "ABS"
result = Abs(Args(aIndex))
Case "RIGHT"
result = Right(Args(aIndex), Args(aIndex + 1))
Case "LEFT"
result = Left(Args(aIndex), Args(aIndex + 1))
Case "SQR", "SQRT"
result = VBA.Sqr(Args(aIndex))
Case "ROUND"
If Args(aIndex + 1) > 0 Then
result = Round(Args(aIndex), Args(aIndex + 1))
Else
result = Round(Args(aIndex) * 10 ^ (Args(aIndex + 1)), 0) * 10 ^ Abs(Args(aIndex + 1))
End If
Case "SIN"
result = Sin(Args(aIndex))
End Select
End Sub
Private Sub F_SetVariableVal(ByVal vName As Variant, vVal As Variant)
Select Case vName
Case "i"
vVal = i
Sheet1.Cells(iRow, 4).value = i
Case "j"
vVal = J
Sheet1.Cells(iRow, 5).value = J
Case "X" '
vVal = Round(Rnd() * (100 - 1) + 1, 2)
Sheet1.Cells(iRow, 6).value = vVal
Case "Y"
vVal = Round(Rnd() * (100 - 1) + 1, 2)
Sheet1.Cells(iRow, 7).value = vVal
End Select
Debug.Print vName, vVal
End Sub
第二:效率问题,本来想提升效率,想用内存操作业操作数据,想着即可节约空间又可提高效率,结果发现CopyMemory 反而效率更慢,不知道那位大佬知道是什么原因,最后没办法只好改为了字符串组合,为了性能牺牲空间了。
Sub storedbl(ByVal s As String, value As Variant)
Dim v As Currency
Dim iOffset As Long
Dim T As Currency
Dim SS As String
s = s & value & ChrW(0)
'iOffset = LenB(s)
'SS = String$(LenB(v) / 2, 100)
'CopyMemory StrPtr(SS) + iOffset, StrPtr(SS), 8
End Sub
希望能得到帮助,谢谢!
|
|