语言:Excel
Hello&谢谢你阅读我的帖子。
我正在尝试创建一个公式...基于变量乘以单元格(或在本例中为字母)。变量是否可以被(1000 + 250x)整除,并根据答案,将其乘以相应的字母百分比。
视觉表现:
A B C
1% 2% 3%
250 500 1000
1 1,000
2 1,250
3 1,500
4 1,750
5 2,000
例如,由于#1可以被1000整除,我会将其乘以3% 第二个例子,因为#2可以被250和1000整除,我会将250乘以1%和1000乘3%,然后将它们加在一起。
我目前的尝试:
=IF(MOD(A2,F14)<=1,A2*F15,"")
A2 =起始金额 F14 = A2除以什么 F15 =百分比
这种作品,但它不允许我找到最佳解决方案。
非常感谢你在困境中的帮助。
答案 0 :(得分:0)
我无法想到Excel公式中的任何好解决方案,因为你想要的结果太复杂了:就像你标记了你的问题,你需要一个循环,无论什么,哪些公式不能为你做我和#39我害怕。
但是,当您添加VBA
作为您的某个代码时,我认为VBA
解决方案对您有用,所以这里是我写的脚本:
Option Explicit 'variables MUST BE declared, otherwise error. very handy rule
Option Base 0 'won't be needed this time, but in general, this rule is also a great ally
'(it says: arrays' 1st item will always be the "0th" one)
Dim divLARGE, divMED, divSMALL 'you can use variable types in Excel
Dim percLARGE, percMED, percSMALL 'but sadly, not in VBScript which I have ATM
'test input values and their results, won't be needed in your Excel
Dim testA, testB, testC, testD, testE, testF 'so add types if you like
Dim resA, resB, resC, resD, resE, resF '(should make execution a little faster)
'Init our variables declared above. in VBScript you can't do this at declaration,
'i.e. can't say "Dim whatever As Boolean = true" which would be the right way to do this
Call Initialize()
'Call the "main routine" to execute code
Call Main()
'you can add access modifiers here. "private" would be the best
'i.e. "private Sub Main()"
Sub Main()
resA = CalcMaster(testA, divLARGE)
resB = CalcMaster(testB, divLARGE)
resC = CalcMaster(testC, divLARGE)
resD = CalcMaster(testD, divLARGE)
resE = CalcMaster(testE, divLARGE)
resF = CalcMaster(testF, divLARGE)
MsgBox (CStr(testA) + " --> " + CStr(resA) + vbCrLf + _
CStr(testB) + " --> " + CStr(resB) + vbCrLf + _
CStr(testC) + " --> " + CStr(resC) + vbCrLf + _
CStr(testD) + " --> " + CStr(resD) + vbCrLf + _
CStr(testE) + " --> " + CStr(resE) + vbCrLf + _
CStr(testF) + " --> " + CStr(resF) + vbCrLf)
End Sub
Sub Initialize()
divLARGE = 1000 'the large number for which we look after remnants
divMED = 500 'medium/middle sized number to divide by
divSMALL = 250 'the small value
percLARGE = 3 'percentage we want if no remnants on LARGE number
percMED = 2 'same but for medium/mid size numbers
percSMALL = 1 'and the percentage we want for the small remnants
testA=1000 'result should be exactly 30.0
testB=1250 'res == 32.5
testC=1500 'res == 40.0
testD=1750 'res == 42.5
testE=2000 'res == 60.0
testF=-198 'res == #ERROR/INVALID VALUE
End Sub
Function CalcMaster(inVar, byDiv) 'A silly function name popped in my mind, sorry :)
Dim remnant, percDiv
'sometimes happens, looks cheaper calc.wise to handle like this; if initial input
'can be 0 and that's a problem/error case, handle this scenario some other way
If (inVar = 0) Then Exit Function
remnant = inVar Mod byDiv
'if you'll implement more options, do a Select...Case instead (faster)
If (byDiv = divLARGE) Then
percDiv = percLARGE
ElseIf (byDiv = divMED) Then
percDiv = percMED
Else
percDiv = percSMALL
End If
If (remnant = 0) Then
CalcMaster = inVar * (percDiv / 100)
Exit Function
End If
'had remnant; for more than 3 options I would use an array of options
'and call back self with the next array ID
If (byDiv = divLARGE) Then
CalcMaster = CalcMaster(inVar - remnant, divLARGE) + CalcMaster(remnant, divMED)
ElseIf (byDiv = divMED) Then
CalcMaster = CalcMaster(inVar - remnant, divMED) + CalcMaster(remnant, divSMALL)
Else 'or return 0, or raise error and handle somewhere else, etc
'MsgBox ("wrong input number: " + CStr(inVar))
CalcMaster = -1
End If
End Function