使用excel操作变量

时间:2016-04-10 09:13:31

标签: excel vba loops

语言: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 =百分比

这种作品,但它不允许我找到最佳解决方案

非常感谢你在困境中的帮助。

1 个答案:

答案 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


它并不完美,我认为可能有更好的解决方案,但我认为这对于事业来说已经足够好了。我希望你同意:)
干杯