ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: VBA万岁

[分享] 在Visual Studio中开发Excel商务应用程序

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-26 09:19 | 显示全部楼层

错误所在,单击自定义选项卡“专用等式”时,依次弹出如下提示(单击其中的“贷款”、|“年金”、“有效利率”、“开始计算”按钮及文本框中输入数字时也会报同样的错误):

1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-26 09:59 | 显示全部楼层
VBA万岁 发表于 2015-10-26 09:19
错误所在,单击自定义选项卡“专用等式”时,依次弹出如下提示(单击其中的“贷款”、|“年金”、“有效 ...

附件如下:

在Visual Studio中开发Excel商务应用程序(1).zip

14.99 KB, 下载次数: 83

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 16:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-10-26 09:19
错误所在,单击自定义选项卡“专用等式”时,依次弹出如下提示(单击其中的“贷款”、|“年金”、“有效 ...

终于解决了,代码如下:
VBA(Module1)代码:
  1. Public objRib As IRibbonUI
  2. Public CalcType
  3. Public Rate
  4. Public Term
  5. Public Payment
  6. Public Amount
  7.    
  8. Sub RibLoad(ribbon As IRibbonUI)
  9.     Set objRib = ribbon
  10. End Sub

  11. Sub GetControlID(control As IRibbonControl, pressed As Boolean)
  12.     CalcType = control.id
  13.     objRib.Invalidate
  14. End Sub

  15. Sub SelectedEquation(control As IRibbonControl, ByRef returnedVal)
  16.     ' 基于当前的等式确定按下状态
  17.     Select Case CalcType
  18.         Case "Loan"
  19.             If control.id = "Loan" Then
  20.                 returnedVal = True
  21.             Else
  22.                 returnedVal = False
  23.             End If
  24.         Case "Annuity"
  25.             If control.id = "Annuity" Then
  26.                 returnedVal = True
  27.             Else
  28.                 returnedVal = False
  29.             End If
  30.         Case "EffectiveRate"
  31.             If control.id = "EffectiveRate" Then
  32.                 returnedVal = True
  33.             Else
  34.                 returnedVal = False
  35.             End If
  36.         Case Else
  37.             returnedVal = False
  38.     End Select
  39. End Sub

  40. Sub TermVisible(control As IRibbonControl, ByRef returnedVal)
  41.     ' 应用程序不会使用该字段进行有效利率计算
  42.     If CalcType = "EffectiveRate" Then
  43.         returnedVal = False
  44.     Else
  45.         returnedVal = True
  46.     End If
  47.     'returnedVal1 = v1
  48. End Sub

  49. Sub PaymentVisible(control As IRibbonControl, ByRef returnedVal)
  50.     ' 当处理年金计算时应用程序仅使用该字段
  51.     If CalcType = "Annuity" Then
  52.         returnedVal = True
  53.     Else
  54.         returnedVal = False
  55.     End If
  56.     'returnedVal2 = v2
  57. End Sub

  58. Sub AmountVisible(control As IRibbonControl, ByRef returnedVal)
  59.     ' 应用程序不会使用该字段进行有效利率计算
  60.     If CalcType = "EffectiveRate" Then
  61.         returnedVal = False
  62.     Else
  63.         returnedVal = True
  64.     End If
  65.     'MsgBox returnedVal3
  66.     'returnedVal3 = v3
  67. End Sub

  68. Sub GetDataEntryLabel(control As IRibbonControl, ByRef returnedVal)
  69.     ' 通过计算类型的选择决定组标签
  70.     Select Case CalcType
  71.         Case "Loan"
  72.             returnedVal = "输入贷款信息"
  73.         Case "Annuity"
  74.             returnedVal = "输入年金信息"
  75.         Case "EffectiveRate"
  76.             returnedVal = "输入有效利率信息"
  77.         Case Else
  78.             returnedVal = "没有实现!"
  79.     End Select
  80. End Sub

  81. Sub AmountLabel(control As IRibbonControl, ByRef returnedVal)
  82.     ' 通过计算类型的选择决定数量标签
  83.     ' 由于有效利率计算不使用该控件,因此应用程序不给它提供标签
  84.     Select Case CalcType
  85.         Case "Loan"
  86.             returnedVal = "贷款金额"
  87.         Case "Annuity"
  88.             returnedVal = "每月年金付款"
  89.         Case Else
  90.             returnedVal = "没有实现!"
  91.     End Select
  92. End Sub

  93. Sub TermCount(control As IRibbonControl, ByRef returnedVal)
  94.     If CalcType = "Loan" Then
  95.         returnedVal = 4
  96.     Else
  97.         returnedVal = 5
  98.     End If
  99. End Sub

  100. Sub TermItemLabel(control As IRibbonControl, index As Integer, ByRef returnedVal)
  101.     If CalcType = "Loan" Then
  102.         returnedVal = Array("10年", "15年", "20年", "30年")(index)
  103.     Else
  104.         returnedVal = Array("5年", "7年", "10年", "15年", "20年")(index)
  105.     End If
  106. End Sub

  107. Sub TermItemID(control As IRibbonControl, index As Integer, ByRef id)
  108.     id = "rxitem" & index
  109. End Sub

  110. Sub GetRateText(control As IRibbonControl, ByVal text As String)
  111.     ' 保存文本的输入值
  112.     Rate = Val(text)
  113. End Sub

  114. Sub GetSelectedTerm(control As IRibbonControl, ByVal selectedId As String, ByVal selectedIndex As Integer)
  115.     ' 存储默认值
  116.     Term = 0

  117.     ' 保存贷款项
  118.     If CalcType = "Loan" Then
  119.         Select Case selectedIndex
  120.             Case 0
  121.                 Term = 10
  122.             Case 1
  123.                 Term = 15
  124.             Case 2
  125.                 Term = 20
  126.             Case 3
  127.                 Term = 30
  128.         End Select
  129.     End If

  130.     ' 保存年金项
  131.     If CalcType = "Annuity" Then
  132.         Select Case selectedIndex
  133.             Case 0
  134.                 Term = 5
  135.             Case 1
  136.                 Term = 7
  137.             Case 2
  138.                 Term = 10
  139.             Case 3
  140.                 Term = 15
  141.             Case 4
  142.                 Term = 20
  143.         End Select
  144.     End If
  145. End Sub

  146. Sub GetPaymentText(control As IRibbonControl, ByVal text As String)
  147.     ' 保存文本的输入值
  148.     Payment = Val(text)
  149. End Sub

  150. Sub GetAmountText(control As IRibbonControl, ByVal text As String)
  151.     ' 保存文本的输入值
  152.     Amount = Val(text)
  153. End Sub

  154. Sub Calculate(control As IRibbonControl)
  155.     Select Case CalcType
  156.         Case "Loan"
  157.             ActiveCell = "=PMT(" & Rate / 100 / 12 & "," & Term * 12 & "," & Amount & ",0,0)"
  158.         Case "Annuity"
  159.             ActiveCell = "=FV(" & Rate / 100 / 12 & "," & Term * 12 & "," & Payment & "," & Amount & ",0)"
  160.         Case "EffectiveRate"
  161.             ActiveCell = "=EFFECT(" & Rate / 100 / 12 & ",12)"
  162.     End Select
  163.     Application.Calculation = xlCalculationAutomatic
  164. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 16:09 | 显示全部楼层
VBA万岁 发表于 2015-10-29 16:08
终于解决了,代码如下:
VBA(Module1)代码:

VBA(Module2)代码:
  1. Sub DisplayRedundantCalc(ByVal control As Office.IRibbonControl)
  2.     ' 选择正确的过程.
  3.     Select Case CalcType
  4.         Case "Loan"
  5.             PerformLoanRangeCalc
  6.         Case "Annuity"
  7.             PerformAnnuityRangeCalc
  8.         Case "EffectiveRate"
  9.             PerformEffectiveRateRangeCalc
  10.     End Select
  11. End Sub

  12. Sub PerformLoanRangeCalc()
  13.     msg = InputBox("利率开始值/利率最终值/利率增加量/期数开始值/期数率最终值/初始金额:", "请输入批量信息:", "1/12/1/" & IIf(CalcType = "Loan", 10, 5) & "/" & IIf(CalcType = "Loan", 30, 20) & "/105000")
  14.     Rate = Val(Split(msg, "/")(0))
  15.     Term = Val(Split(msg, "/")(3))
  16.     Amount = Val(Split(msg, "/")(5))

  17.     ' 创建本地变量,包括计算数据.
  18.     EndRate = Val(Split(msg, "/")(1))
  19.     IncRate = Val(Split(msg, "/")(2))
  20.     EndTerm = Val(Split(msg, "/")(4))

  21.     ' 添加初始标题.
  22.     Application.Selection.Cells(1, 1) = "利息"

  23.     ' 执行计算.
  24.     Dim i As Integer
  25.     For i = Rate To EndRate
  26.         ' 计算X和Y的位置值.
  27.         X = i + 2 - Rate
  28.         Y = 2
  29.         Application.Selection.Cells(X, 1) = Format(i / 100, "#%")
  30.         ' 使用一系列if语句确定年设置.
  31.         If Term = 10 And EndTerm >= 10 Then
  32.             ' 执行计算.
  33.             Application.Selection.Cells(X, Y) = "=PMT(" & i / 100 / 12 & "," & 10 * 12 & "," & Amount & ",0,0)"
  34.             ' 打印标题.
  35.             Application.Selection.Cells(1, Y) = "10年"
  36.              ' 如果已经使用则增加Y.
  37.             Y = Y + 1
  38.         End If

  39.         If Term <= 15 And EndTerm >= 15 Then
  40.             ' 执行计算.
  41.             Application.Selection.Cells(X, Y) = "=PMT(" & i / 100 / 12 & "," & 15 * 12 & "," & Amount & ",0,0)"
  42.             ' 打印标题.
  43.             Application.Selection.Cells(1, Y) = "15年"
  44.             ' 如果已经使用则增加Y.
  45.             Y = Y + 1
  46.         End If

  47.         If Term <= 20 And EndTerm >= 20 Then
  48.             ' 执行计算.
  49.             Application.Selection.Cells(X, Y) = "=PMT(" & i / 100 / 12 & "," & 20 * 12 & "," & Amount & ",0,0)"
  50.             ' 打印标题.
  51.             Application.Selection.Cells(1, Y) = "20年"
  52.             ' 如果已经使用则增加Y.
  53.             Y = Y + 1
  54.         End If

  55.         If Term <= 30 And EndTerm >= 30 Then
  56.             ' 执行计算.
  57.             Application.Selection.Cells(X, Y) = "=PMT(" & i / 100 / 12 & "," & 30 * 12 & "," & Amount & ",0,0)"
  58.             ' 打印标题.
  59.             Application.Selection.Cells(1, Y) = "30年"
  60.             ' 如果已经使用则增加Y.
  61.             Y = Y + 1
  62.         End If
  63.     Next
  64. End Sub

  65. Sub PerformAnnuityRangeCalc()
  66.     msg = InputBox("利率开始值/利率最终值/利率增加量/期数开始值/期数率最终值/初始金额/支付金额:", "请输入批量信息:", "1/12/1/" & IIf(CalcType = "Loan", 10, 5) & "/" & IIf(CalcType = "Loan", 30, 20) & "/500/500")
  67.     Rate = Val(Split(msg, "/")(0))
  68.     Term = Val(Split(msg, "/")(3))
  69.     Amount = Val(Split(msg, "/")(5))
  70.     Payment = Val(Split(msg, "/")(6))

  71.     ' 创建本地变量,包括计算数据.
  72.     EndRate = Val(Split(msg, "/")(1))
  73.     IncRate = Val(Split(msg, "/")(2))
  74.     EndTerm = Val(Split(msg, "/")(4))

  75.     ' 添加初始标题.
  76.     Application.Selection.Cells(1, 1) = "利息"
  77.    
  78.     ' 执行计算.
  79.     Dim i As Integer
  80.     For i = Rate To EndRate
  81.         ' 计算X和Y的位置值.
  82.         X = i + 2 - Rate
  83.         Y = 2
  84.         Application.Selection.Cells(X, 1) = Format(i / 100, "#%")

  85.         If Term = 5 And EndTerm >= 5 Then
  86.             ' 执行计算.
  87.             Application.Selection.Cells(X, Y) = "=FV(" & i / 100 / 12 & "," & 5 * 12 & "," & Payment & "," & Amount & ",0)"
  88.             ' 打印标题.
  89.             Application.Selection.Cells(1, Y) = "5年"
  90.              ' 如果已经使用则增加Y.
  91.             Y = Y + 1
  92.         End If

  93.         If Term <= 7 And EndTerm >= 7 Then
  94.             ' 执行计算.
  95.             Application.Selection.Cells(X, Y) = "=FV(" & i / 100 / 12 & "," & 7 * 12 & "," & Payment & "," & Amount & ",0)"
  96.             ' 打印标题.
  97.             Application.Selection.Cells(1, Y) = "7年"
  98.              ' 如果已经使用则增加Y.
  99.             Y = Y + 1
  100.         End If

  101.         If Term <= 10 And EndTerm >= 10 Then
  102.             ' 执行计算.
  103.             Application.Selection.Cells(X, Y) = "=FV(" & i / 100 / 12 & "," & 10 * 12 & "," & Payment & "," & Amount & ",0)"
  104.             ' 打印标题.
  105.             Application.Selection.Cells(1, Y) = "10年"
  106.              ' 如果已经使用则增加Y.
  107.             Y = Y + 1
  108.         End If

  109.         If Term <= 15 And EndTerm >= 15 Then
  110.             ' 执行计算.
  111.             Application.Selection.Cells(X, Y) = "=FV(" & i / 100 / 12 & "," & 15 * 12 & "," & Payment & "," & Amount & ",0)"
  112.             ' 打印标题.
  113.             Application.Selection.Cells(1, Y) = "15年"
  114.              ' 如果已经使用则增加Y.
  115.             Y = Y + 1
  116.         End If

  117.         If Term <= 20 And EndTerm >= 20 Then
  118.             ' 执行计算.
  119.             Application.Selection.Cells(X, Y) = "=FV(" & i / 100 / 12 & "," & 20 * 12 & "," & Payment & "," & Amount & ",0)"
  120.             ' 打印标题.
  121.             Application.Selection.Cells(1, Y) = "20年"
  122.              ' 如果已经使用则增加Y.
  123.             Y = Y + 1
  124.         End If
  125.     Next
  126. End Sub

  127. Sub PerformEffectiveRateRangeCalc()
  128.     msg = InputBox("利率开始值/利率最终值/利率增加量:", "请输入批量信息:", "1/12/1")
  129.     Rate = Val(Split(msg, "/")(0))

  130.     ' 创建本地变量,包括计算数据.
  131.     EndRate = Val(Split(msg, "/")(1))
  132.     IncRate = Val(Split(msg, "/")(2))

  133.     ' 添加初始标题.
  134.     Application.Selection.Cells(1, 1) = "利息"
  135.     Application.Selection.Cells(1, 2) = "有效利率"

  136.     ' 执行计算.
  137.     Dim i As Integer
  138.     For i = Rate To EndRate
  139.         ' 计算X和Y的位置值.
  140.         X = i + 2 - Rate
  141.         Application.Selection.Cells(X, 1) = Format(i / 100, "#%")
  142.         ' 执行计算.
  143.         Application.Selection.Cells(X, 2) = "=EFFECT(" & i / 100 / 12 & ",12)"
  144.         'Globals.ThisAddIn.CalculateEFFECT(i, X, 2)
  145.     Next
  146. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 16:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2015-10-29 16:09
VBA(Module2)代码:

XML代码:
  1. <customUI onLoad="RibLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.   <ribbon>
  3.     <tabs>
  4.       <tab id="myTab" label="专用等式" keytip="MT">
  5.         <group id="Default" label="开始">
  6.            <labelControl id="StartLabel1" label="选择一个"/>
  7.            <labelControl id="StartLabel2" label="开始点"/>
  8.            <labelControl id="StartLabel3" label="用于计算."/>
  9.         </group>
  10.             
  11.                
  12.         <group id="Equations" label="等式">
  13.            <toggleButton id="Loan"
  14.                label="贷款"
  15.                onAction="GetControlID"
  16.                getPressed="SelectedEquation"/>
  17.            <toggleButton id="Annuity"
  18.                label="年金"
  19.                onAction="GetControlID"
  20.                getPressed="SelectedEquation"/>
  21.            <toggleButton id="EffectiveRate"
  22.                label="有效利率"
  23.                onAction="GetControlID"
  24.                getPressed="SelectedEquation"/>
  25.          </group>

  26.          <group id="DataEntry" getLabel="GetDataEntryLabel">
  27.             <editBox id="Rate"
  28.                label="利率"
  29.                onChange="GetRateText"/>
  30.             <dropDown id="Term"
  31.                label="期数"
  32.                getVisible="TermVisible"
  33.                getItemCount="TermCount"
  34.                getItemID="TermItemID"
  35.                getItemLabel="TermItemLabel"
  36.                onAction="GetSelectedTerm"/>
  37.             <editBox id="Payment"
  38.                label="期初付款"
  39.                getVisible="PaymentVisible"
  40.                onChange="GetPaymentText"/>
  41.             <editBox id="Amount"
  42.                getLabel="AmountLabel"
  43.                getVisible="AmountVisible"
  44.                onChange="GetAmountText"/>
  45.             <dialogBoxLauncher>
  46.                <button id="RedundantCalcsLaunch"
  47.                screentip="多重计算"
  48.                supertip="多次执行同一公式的计算."
  49.                onAction="DisplayRedundantCalc"/>
  50.             </dialogBoxLauncher>
  51.          </group>


  52.          <group id="Finishcalculate" label="完成">
  53.             <button id="Startcac"
  54.                label="开始计算"
  55.                imageMso="CalculationOptionsMenu"
  56.                size="large"
  57.                onAction="Calculate"/>
  58.          </group>
  59.       </tab>
  60.     </tabs>
  61.   </ribbon>
  62. </customUI>
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-29 16:11 | 显示全部楼层

附件如下:

在Visual Studio中开发Excel商务应用程序(XML VBA).zip

48.02 KB, 下载次数: 98

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-2 12:32 | 显示全部楼层

窗体版附件如下:

在Visual Studio中开发Excel商务应用程序(XML VBA).zip

59.49 KB, 下载次数: 80

TA的精华主题

TA的得分主题

发表于 2019-4-12 13:59 | 显示全部楼层
加载不了,打不开,是不是版本的问题?我用的是VS2010
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 02:51 , Processed in 0.053557 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表