ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-10-24 17:15 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学了如下帖子:
细品RibbonX(55):在Visual Studio中开发Excel商务应用程序-第8页
尝试着用VSTO2010的vb语言,制作附件如下:

在Visual Studio中开发Excel商务应用程序2.rar

146.76 KB, 下载次数: 315

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-24 17:18 | 显示全部楼层
功能区EditBox下拉选项的设置方法如下:

1.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-24 17:19 | 显示全部楼层
VBA万岁 发表于 2015-10-24 17:18
功能区EditBox下拉选项的设置方法如下:

设计对话框(LoanRangeSelection/选择货款范围, AnnuityRangeSelection/选择年金范围, EffectiveRateRangeSelection/选择有效利率范围)的方法如下:

2.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-24 17:21 | 显示全部楼层
VBA万岁 发表于 2015-10-24 17:19
设计对话框(LoanRangeSelection/选择货款范围, AnnuityRangeSelection/选择年金范围, EffectiveRateRa ...

效果截图:

4.jpg
3.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-24 17:22 | 显示全部楼层

代码:
ThisAddIn:
  1. Public Class ThisAddIn

  2.     Private Sub ThisAddIn_Startup() Handles Me.Startup

  3.     End Sub

  4.     Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown

  5.     End Sub

  6.     ' 计算贷款数量
  7.     Public Sub CalculatePMT(ByVal Rate As Double, ByVal NPer As Int32, ByVal PV As Int32)
  8.         ' 计算利率
  9.         Dim PeriodicRate As Double = (Rate / 100) / 12
  10.         ' 计算期数
  11.         Dim Periods As Int32 = NPer * 12
  12.         ' 执行计算
  13.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = "=PMT(" + PeriodicRate.ToString() + "," + Periods.ToString() + "," + PV.ToString() + ",0,0)"
  14.         Application.ActiveWindow.ActiveCell.Calculate()
  15.     End Sub

  16.     ' 计算年金数量
  17.     Public Sub CalculateFV(ByVal Rate As Double, ByVal NPer As Int32, ByVal PMT As Int32, ByVal PV As Int32)
  18.         ' 计算利率
  19.         Dim PeriodicRate As Double = (Rate / 100) / 12
  20.         ' 计算期数
  21.         Dim Periods As Int32 = NPer * 12
  22.         ' 执行计算
  23.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = "=FV(" + PeriodicRate.ToString() + "," + Periods.ToString() + "," + PMT.ToString() + "," + PV.ToString() + ",0)"
  24.         Application.ActiveWindow.ActiveCell.Calculate()
  25.     End Sub

  26.     ' 计算有效利率
  27.     Public Sub CalculateEFFECT(ByVal Rate As Double)
  28.         ' 计算利率
  29.         Dim PeriodicRate As Double = Rate / 100
  30.         ' 执行计算
  31.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = "=EFFECT(" + PeriodicRate.ToString() + ",12)"
  32.         Application.ActiveWindow.ActiveCell.Calculate()
  33.     End Sub

  34.     ' 计算贷款金额并包括位置数据
  35.     Public Sub CalculatePMTT(ByVal Rate As Double, ByVal NPer As Int32, ByVal PV As Int32, ByVal X As Int32, ByVal Y As Int32)
  36.         ' 计算利率.
  37.         Dim PeriodicRate As Double = (Rate / 100) / 12
  38.         ' 计算期数.
  39.         Dim Periods As Int32 = NPer * 12
  40.         ' 执行计算.
  41.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = "=PMT(" + PeriodicRate.ToString() + "," + Periods.ToString() + "," + PV.ToString() + ",0,0)"
  42.         Application.ActiveWindow.ActiveCell.Calculate()
  43.     End Sub

  44.     ' 计算年金金额并包括位置数据.
  45.     Public Sub CalculateFVV(ByVal Rate As Double, ByVal NPer As Int32, ByVal PMT As Int32, ByVal PV As Int32, ByVal X As Int32, ByVal Y As Int32)
  46.         ' 计算利率.
  47.         Dim PeriodicRate As Double = (Rate / 100) / 12
  48.         ' 计算期数.
  49.         Dim Periods As Int32 = NPer * 12
  50.         ' 执行计算.
  51.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = "=FV(" + PeriodicRate.ToString() + "," + Periods.ToString() + "," + PMT.ToString() + "," + PV.ToString() + ",0)"
  52.         Application.ActiveWindow.ActiveCell.Calculate()
  53.     End Sub

  54.     ' 计算有效利率并包括数据位置.
  55.     Public Sub CalculateEFFECTT(ByVal Rate As Double, ByVal X As Int32, ByVal Y As Int32)
  56.         ' 计算利率.
  57.         Dim PeriodicRate As Double = (Rate / 100) / 12
  58.         ' 执行计算.
  59.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = "=EFFECT(" + PeriodicRate.ToString() + ",12)"
  60.         Application.ActiveWindow.ActiveCell.Calculate()
  61.         ' 格式单元格.
  62.         Dim ThisRange As Excel.Range
  63.         ThisRange = Application.Cells(X, Y)
  64.         ThisRange.NumberFormat = "0.0000%"
  65.     End Sub

  66.     Public Sub SetHeading(ByVal Heading As String, ByVal X As Int32, ByVal Y As Int32)
  67.         ' 添加所需要的标题.
  68.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = Heading
  69.     End Sub
  70. End Class
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-24 17:23 | 显示全部楼层

Module1:
  1. Module Module1
  2.     Public CalcType
  3.     Public R
  4.     Public T
  5.     Public A
  6.     Public P
  7. End Module
复制代码

TA的精华主题

TA的得分主题

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

Ribbon1.vb:
  1. Imports Microsoft.Office.Tools.Ribbon

  2. Public Class Ribbon2

  3.     Private Sub Ribbon2_Load(ByVal sender As System.Object, ByVal e As RibbonUIEventArgs) Handles MyBase.Load

  4.     End Sub

  5.     Private Sub Loan_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Loan.Click
  6.         Loan.Checked = True
  7.         Annuity.Checked = False
  8.         EffectiveRate.Checked = False
  9.         DataEntry.Label = "输入贷款信息"
  10.         Term.Visible = True
  11.         Payment.Visible = False
  12.         Amount.Visible = True
  13.         Amount.Label = "贷款金额"
  14.         CalcType = "Loan"
  15.     End Sub

  16.     Private Sub Annuity_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Annuity.Click
  17.         Loan.Checked = False
  18.         Annuity.Checked = True
  19.         EffectiveRate.Checked = False
  20.         DataEntry.Label = "输入年金信息"
  21.         Term.Visible = True
  22.         Payment.Visible = True
  23.         Amount.Visible = True
  24.         Amount.Label = "每月年金付款"
  25.         CalcType = "Annuity"
  26.     End Sub

  27.     Private Sub EffectiveRate_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles EffectiveRate.Click
  28.         Loan.Checked = False
  29.         Annuity.Checked = False
  30.         EffectiveRate.Checked = True
  31.         DataEntry.Label = "输入有效利率信息"
  32.         Term.Visible = False
  33.         Payment.Visible = False
  34.         Amount.Visible = False
  35.         CalcType = "EffectiveRate"
  36.     End Sub

  37.     Private Sub Button1_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click
  38.         ' 选择计算并调用
  39.         Select Case CalcType
  40.             Case "Loan"
  41.                 Globals.ThisAddIn.CalculatePMT(Rate.Text, Replace(Term.SelectedItem.Label, "年", ""), Amount.Text)
  42.             Case "Annuity"
  43.                 Globals.ThisAddIn.CalculateFV(Rate.Text, Replace(Term.SelectedItem.Label, "年", ""), Payment.Text, Amount.Text)
  44.             Case "Effective Rate"
  45.                 Globals.ThisAddIn.CalculateEFFECT(Rate.Text)
  46.         End Select
  47.     End Sub

  48.     Private Sub RedundantCalcsLaunch_Click(sender As System.Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles RedundantCalcsLaunch.Click
  49.         ' 选择正确的过程.
  50.         Select Case CalcType
  51.             Case "Loan"
  52.                 PerformLoanRangeCalc()
  53.             Case "Annuity"
  54.                 PerformAnnuityRangeCalc()
  55.             Case "EffectiveRate"
  56.                 PerformEffectiveRateRangeCalc()
  57.         End Select
  58.     End Sub

  59.     Private Sub PerformLoanRangeCalc()
  60.         ' 创建对话框.
  61.         Dim ThisSelection As LoanRangeSelection = New LoanRangeSelection()

  62.         ' 在对话框中添加已存在的变量.
  63.         ThisSelection.txtIntBeg.Text = Rate.Text
  64.         ThisSelection.txtIntEnd.Text = Rate.Text
  65.         ThisSelection.txtIntInc.Text = "1"
  66.         ThisSelection.cbTermBeg.Text = Replace(Term.SelectedItem.Label, "年", "")
  67.         ThisSelection.cbTermEnd.Text = Replace(Term.SelectedItem.Label, "年", "")
  68.         ThisSelection.txtLoanAmt.Text = Amount.Text

  69.         ' 显示对话框并且如果用户单击确定则处理数据.
  70.         If ThisSelection.ShowDialog() = Windows.Forms.DialogResult.OK Then
  71.             ' 转换数据值为Int32egers.
  72.             R = Int32.Parse(ThisSelection.txtIntBeg.Text)
  73.             T = Int32.Parse(ThisSelection.cbTermBeg.Text)
  74.             A = Int32.Parse(ThisSelection.txtLoanAmt.Text)

  75.             ' 创建本地变量,包括计算数据.
  76.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  77.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)
  78.             Dim EndTerm As Int32 = Int32.Parse(ThisSelection.cbTermEnd.Text)

  79.             ' 更新功能区中的值.
  80.             'ribbon.InvalidateControl("Rate")
  81.             'ribbon.InvalidateControl("Term")
  82.             'ribbon.InvalidateControl("Amount")

  83.             ' 添加初始标题.
  84.             Globals.ThisAddIn.SetHeading("利息", 1, 1)

  85.             ' 执行计算.
  86.             Dim i As Int32
  87.             For i = R To EndRate

  88.                 ' 计算X和Y的位置值.
  89.                 Dim X As Int32 = i + 2 - R
  90.                 Dim Y As Int32 = 2

  91.                 ' 打印Int32erest利率.
  92.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  93.                 ' 使用一系列if语句确定年设置.
  94.                 If T = 10 And EndTerm >= 10 Then
  95.                     ' 执行计算.
  96.                     Globals.ThisAddIn.CalculatePMTT(i, 10, A, X, Y)

  97.                     ' 打印标题.
  98.                     Globals.ThisAddIn.SetHeading("10年", 1, Y)

  99.                     ' 如果已经使用则增加Y.
  100.                     Y = Y + 1
  101.                 End If

  102.                 If T <= 15 And EndTerm >= 15 Then
  103.                     ' 执行计算.
  104.                     Globals.ThisAddIn.CalculatePMTT(i, 15, A, X, Y)

  105.                     ' 打印标题.
  106.                     Globals.ThisAddIn.SetHeading("15年", 1, Y)

  107.                     ' 如果已经使用则增加Y.
  108.                     Y = Y + 1
  109.                 End If

  110.                 If T <= 20 And EndTerm >= 20 Then
  111.                     ' 执行计算.
  112.                     Globals.ThisAddIn.CalculatePMTT(i, 20, A, X, Y)

  113.                     ' 打印标题.
  114.                     Globals.ThisAddIn.SetHeading("20年", 1, Y)

  115.                     ' 如果已经使用则增加Y.
  116.                     Y = Y + 1
  117.                 End If

  118.                 If T <= 30 And EndTerm >= 30 Then
  119.                     ' 执行计算.
  120.                     Globals.ThisAddIn.CalculatePMTT(i, 30, A, X, Y)

  121.                     ' 打印标题.
  122.                     Globals.ThisAddIn.SetHeading("30年", 1, Y)

  123.                     ' 如果已经使用则增加Y.
  124.                     Y = Y + 1
  125.                 End If
  126.             Next
  127.         End If
  128.     End Sub

  129.     Private Sub PerformAnnuityRangeCalc()
  130.         ' 创建对话框.
  131.         Dim ThisSelection As AnnuityRangeSelection = New AnnuityRangeSelection()

  132.         ' 在对话框中添加已存在的变量.
  133.         ThisSelection.txtIntBeg.Text = Rate.Text
  134.         ThisSelection.txtIntEnd.Text = Rate.Text
  135.         ThisSelection.txtIntInc.Text = "1"
  136.         ThisSelection.cbTermBeg.Text = Replace(Term.SelectedItem.Label, "年", "")
  137.         ThisSelection.cbTermEnd.Text = Replace(Term.SelectedItem.Label, "年", "")
  138.         ThisSelection.txtLoanAmt.Text = Amount.Text
  139.         ThisSelection.txtPayment.Text = Payment.Text

  140.         ' 显示对话框并且如果用户单击确定则处理数据.
  141.         If ThisSelection.ShowDialog() = Windows.Forms.DialogResult.OK Then

  142.             ' 转换数据值为Int32egers.
  143.             R = Int32.Parse(ThisSelection.txtIntBeg.Text)
  144.             T = Int32.Parse(ThisSelection.cbTermBeg.Text)
  145.             A = Int32.Parse(ThisSelection.txtLoanAmt.Text)
  146.             P = Int32.Parse(ThisSelection.txtPayment.Text)

  147.             ' 创建本地变量以包含计算数据.
  148.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  149.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)
  150.             Dim EndTerm As Int32 = Int32.Parse(ThisSelection.cbTermEnd.Text)

  151.             ' 更新功能区中的值.
  152.             'ribbon.InvalidateControl("Rate")
  153.             'ribbon.InvalidateControl("Term")
  154.             'ribbon.InvalidateControl("Amount")
  155.             'ribbon.InvalidateControl("Payment")

  156.             ' 添加初始标题.
  157.             Globals.ThisAddIn.SetHeading("利息", 1, 1)

  158.             ' 执行计算.
  159.             Dim i As Int32
  160.             For i = R To EndRate

  161.                 ' 计算X和Y的位置值.
  162.                 Dim X As Int32 = i + 2 - R
  163.                 Dim Y As Int32 = 2

  164.                 ' 打印Int32erest利率.
  165.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  166.                 ' 使用一系列if语句决定年设置.
  167.                 If T = 5 And EndTerm >= 5 Then
  168.                     ' 执行计算.
  169.                     Globals.ThisAddIn.CalculateFVV(i, 5, A, P, X, Y)

  170.                     ' 打印标题.
  171.                     Globals.ThisAddIn.SetHeading("5年", 1, Y)

  172.                     ' 如果已经使用则增加Y.
  173.                     Y = Y + 1
  174.                 End If

  175.                 If T <= 7 And EndTerm >= 7 Then
  176.                     ' 执行计算.
  177.                     Globals.ThisAddIn.CalculateFVV(i, 7, A, P, X, Y)

  178.                     ' 打印标题.
  179.                     Globals.ThisAddIn.SetHeading("7年", 1, Y)

  180.                     ' 如果已经使用则增加Y.
  181.                     Y = Y + 1
  182.                 End If

  183.                 If T <= 10 And EndTerm >= 10 Then
  184.                     ' 执行计算.
  185.                     Globals.ThisAddIn.CalculateFVV(i, 10, A, P, X, Y)

  186.                     ' 打印标题.
  187.                     Globals.ThisAddIn.SetHeading("10年", 1, Y)

  188.                     ' 如果已经使用则增加Y.
  189.                     Y = Y + 1
  190.                 End If

  191.                 If T <= 15 And EndTerm >= 15 Then
  192.                     ' 执行计算.
  193.                     Globals.ThisAddIn.CalculateFVV(i, 15, A, P, X, Y)

  194.                     ' 打印标题.
  195.                     Globals.ThisAddIn.SetHeading("15年", 1, Y)

  196.                     ' 如果已经使用则增加Y.
  197.                     Y = Y + 1
  198.                 End If

  199.                 If T <= 20 And EndTerm >= 20 Then
  200.                     ' 执行计算.
  201.                     Globals.ThisAddIn.CalculateFVV(i, 20, A, P, X, Y)

  202.                     ' 打印标题.
  203.                     Globals.ThisAddIn.SetHeading("20年", 1, Y)

  204.                     ' 如果已经使用则增加Y.
  205.                     Y = Y + 1
  206.                 End If
  207.             Next
  208.         End If
  209.     End Sub

  210.    
复制代码

TA的精华主题

TA的得分主题

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

续上(7楼的代码因起过1000字而被限制发送):
  1. Private Sub PerformEffectiveRateRangeCalc()
  2.         ' 创建对话框.
  3.         Dim ThisSelection As EffectiveRateRangeSelection = New EffectiveRateRangeSelection()

  4.         ' 在对话框中添加已存在的变量.
  5.         ThisSelection.txtIntBeg.Text = Rate.Text
  6.         ThisSelection.txtIntEnd.Text = Rate.Text
  7.         ThisSelection.txtIntInc.Text = "1"

  8.         ' 显示对话框并且如果用户单击确定则处理数据.
  9.         If ThisSelection.ShowDialog() = Windows.Forms.DialogResult.OK Then

  10.             ' 转换数据值为Int32egers.
  11.             R = Int32.Parse(ThisSelection.txtIntBeg.Text)

  12.             ' 创建本地变量以包含计算数据.
  13.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  14.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)

  15.             ' 更新功能区中的值.
  16.             'ribbon.InvalidateControl("Rate")

  17.             ' 添加初始标题.
  18.             Globals.ThisAddIn.SetHeading("利息", 1, 1)
  19.             Globals.ThisAddIn.SetHeading("有效利率", 1, 2)

  20.             ' 执行计算.
  21.             Dim i As Int32
  22.             For i = R To EndRate
  23.                 ' 计算X和Y位置值.
  24.                 Dim X As Int32 = i + 2 - R

  25.                 ' 打印Int32erest利率.
  26.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  27.                 ' 执行计算.
  28.                 Globals.ThisAddIn.CalculateEFFECTT(i, X, 2)
  29.             Next
  30.         End If
  31.     End Sub
  32. End Class
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-26 09:03 | 显示全部楼层
VBA万岁 发表于 2015-10-26 08:52
续上(7楼的代码因起过1000字而被限制发送):

我曾经试着用VBA+XML制作,却以失败告终。但愿我的热情能消融本版的坚冰,引来众高人的关注和帮助。代码如下:
XML代码:
  1. <customUI 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"
  7.                         label="选择一个"/>
  8.                   <labelControl id="StartLabel2"
  9.                         label="开始点"/>
  10.                   <labelControl id="StartLabel3"
  11.                         label="用于计算."/>
  12.                 </group>


  13.                 <group id="Equations" label="等式">
  14.                   <toggleButton id="Loan"
  15.                         label="贷款"
  16.                         onAction="SetupLoan"
  17.                         getPressed="SelectedEquation"/>
  18.                   <toggleButton id="Annuity"
  19.                         label="年金"
  20.                         onAction="SetupAnnuity"
  21.                         getPressed="SelectedEquation"/>
  22.                   <toggleButton id="EffectiveRate"
  23.                         label="有效利率"
  24.                         onAction="SetupEF"
  25.                         getPressed="SelectedEquation"/>
  26.                 </group>


  27.                 <group id="DataEntry" getLabel="GetDataEntryLabel">
  28.                   <editBox id="Rate"
  29.                         label="利率"
  30.                         onChange="GetRateText"/>
  31.                   <dropDown id="Term"
  32.                          label="期数"
  33.                          getVisible="TermVisible"
  34.                          getItemCount="TermCount"
  35.                          getItemID="TermItemID"
  36.                          getItemLabel="TermItemLabel"
  37.                          onAction="GetSelectedTerm"/>
  38.                   <editBox id="Payment"
  39.                         label="期初付款"
  40.                         getVisible="PaymentVisible"
  41.                         onChange="GetPaymentText"/>
  42.                   <editBox id="Amount"
  43.                         getLabel="AmountLabel"
  44.                         getVisible="AmountVisible"
  45.                         onChange="GetAmountText"/>
  46.                 </group>


  47.                 <group id="Finishcalculate" label="完成">
  48.                   <toggleButton id="Startcac"
  49.                         label="开始计算"
  50.                         onAction="Calculate"/>

  51.                 </group>

  52.             </tab>
  53.         </tabs>
  54.     </ribbon>
  55. </customUI>
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-26 09:05 | 显示全部楼层
VBA万岁 发表于 2015-10-26 09:03
我曾经试着用VBA+XML制作,却以失败告终。但愿我的热情能消融本版的坚冰,引来众高人的关注和帮助。代码 ...

Module代码:
  1.     Public CalcType
  2.     Public Rate
  3.     Public Term
  4.     Public Payment
  5.     Public Amount
  6.    
  7.     Sub SetupLoan(control As IRibbonControl, ByVal pressed As Boolean)
  8.         ' 设置计算类型
  9.         CalcType = "Loan"

  10.         ' 设置按下状态
  11.         pressed = True

  12.         ' 使整个功能区无效
  13.         ribbon.Invalidate
  14.     End Sub

  15.     Sub SetupAnnuity(control As IRibbonControl, ByVal pressed As Boolean)
  16.         ' 设置计算类型
  17.         CalcType = "Annuity"

  18.         ' 设置按下状态
  19.         pressed = True

  20.         ' 使整个功能区无效
  21.         ribbon.Invalidate
  22.     End Sub

  23.     Sub SetupEF(control As IRibbonControl, ByVal pressed As Boolean)
  24.         ' 设置计算类型
  25.         CalcType = "Effective Rate"

  26.         ' 设置按下状态
  27.         pressed = True

  28.         ' 使整个功能区无效
  29.         ribbon.Invalidate
  30.     End Sub

  31.     Function SelectedEquation(control As IRibbonControl) As Boolean
  32.         ' 基于当前的等式确定按下状态
  33.         Select Case CalcType
  34.             Case "Loan"
  35.                 If control.ID = "Loan" Then
  36.                     SelectedEquation = True
  37.                 Else
  38.                     SelectedEquation = False
  39.                 End If
  40.             Case "Annuity"
  41.                 If control.ID = "Annuity" Then
  42.                     SelectedEquation = True
  43.                 Else
  44.                     SelectedEquation = False
  45.                 End If
  46.             Case "Effective Rate"
  47.                 If control.ID = "EffectiveRate" Then
  48.                     SelectedEquation = True
  49.                 Else
  50.                     SelectedEquation = False
  51.                 End If
  52.             Case Else
  53.                 SelectedEquation = False
  54.         End Select
  55.     End Function

  56.     Function TermVisible(control As IRibbonControl) As Boolean
  57.         ' 应用程序不会使用该字段进行有效利率计算
  58.         If CalcType = "Effective Rate" Then
  59.             TermVisible = False
  60.         Else
  61.             TermVisible = True
  62.         End If
  63.     End Function

  64.     Function PaymentVisible(control As IRibbonControl) As Boolean
  65.         ' 当处理年金计算时应用程序仅使用该字段
  66.         If CalcType = "Annuity" Then
  67.             PaymentVisible = True
  68.         Else
  69.             PaymentVisible = False
  70.         End If
  71.     End Function

  72.     Function AmountVisible(control As IRibbonControl) As Boolean
  73.         ' 应用程序不会使用该字段进行有效利率计算
  74.         If CalcType = "Effective Rate" Then
  75.             AmountVisible = False
  76.         Else
  77.             AmountVisible = True
  78.         End If
  79.     End Function


  80.     Function GetDataEntryLabel(control As IRibbonControl) As String
  81.         ' 通过计算类型的选择决定组标签
  82.         Select Case CalcType
  83.             Case "Loan"
  84.                 GetDataEntryLabel = "输入贷款信息"
  85.             Case "Annuity"
  86.                 GetDataEntryLabel = "输入年金信息"
  87.             Case "Effective Rate"
  88.                 GetDataEntryLabel = "输入有效利率信息"
  89.             Case Else
  90.                 GetDataEntryLabel = "没有实现!"
  91.         End Select
  92.     End Function

  93.     Function AmountLabel(control As IRibbonControl) As String
  94.         ' 通过计算类型的选择决定数量标签
  95.         ' 由于有效利率计算不使用该控件,因此应用程序不给它提供标签
  96.         Select Case CalcType
  97.             Case "Loan"
  98.                 AmountLabel = "贷款金额"
  99.             Case "Annuity"
  100.                 AmountLabel = "每月年金付款"
  101.             Case Else
  102.                 AmountLabel = "没有实现!"
  103.         End Select
  104.     End Function

  105.     Sub GetRateText(control As IRibbonControl, ByVal text As String)
  106.         ' 保存文本的输入值
  107.         Rate = Val(text)
  108.     End Sub

  109.     Sub GetSelectedTerm(control As IRibbonControl, ByVal selectedId As String, ByVal selectedIndex As Int32)
  110.         ' 存储默认值
  111.         Term = 0

  112.         ' 保存贷款项
  113.         If CalcType = "Loan" Then
  114.             Select Case selectedIndex
  115.                 Case 0
  116.                     Term = 10
  117.                 Case 1
  118.                     Term = 15
  119.                 Case 2
  120.                     Term = 20
  121.                 Case 3
  122.                     Term = 30
  123.             End Select
  124.         End If

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

  141.     Sub GetPaymentText(control As IRibbonControl, ByVal text As String)
  142.         ' 保存文本的输入值
  143.         Payment = Int32.Parse(text)
  144.     End Sub

  145.     Sub GetAmountText(control As IRibbonControl, ByVal text As String)
  146.         ' 保存文本的输入值
  147.         Amount = Int32.Parse(text)
  148.     End Sub

  149.     Sub Calculate(control As IRibbonControl)
  150.         ' 选择计算并调用
  151.         Select Case CalcType
  152.             Case "Loan"
  153.                 CalculatePMT(Rate,Term,Amount)
  154.             Case "Annuity"
  155.                 CalculateFV(Rate, Term, Payment, Amount)
  156.             Case "Effective Rate"
  157.                 CalculateEFFECT (Rate)
  158.         End Select
  159.     End Sub


  160.     ' 计算贷款数量
  161.     Sub CalculatePMT(ByVal Rate As Double, ByVal NPer As Integer, ByVal PV As Integer)
  162.         ' 计算利率
  163.         PeriodicRate = (Rate / 100) / 12

  164.         ' 计算期数
  165.         Periods = NPer * 12

  166.         ' 执行计算
  167.         ActiveCell = "=PMT(" & PeriodicRate & "," + Periods & "," + PV & ",0,0)"
  168.     Application.Calculation = xlCalculationAutomatic
  169.     'Application.Calculation = xlCalculationManual
  170.         'Application.ActiveWindow.ActiveCell.Calculate()
  171.     End Sub

  172.     ' 计算年金数量
  173.     Sub CalculateFV(ByVal Rate As Double, ByVal NPer As Integer, ByVal PMT As Integer, ByVal PV As Integer)
  174.         ' 计算利率
  175.         PeriodicRate = (Rate / 100) / 12

  176.         ' 计算期数
  177.         Periods = NPer * 12

  178.         ' 执行计算
  179.         ActiveCell = "=FV(" + PeriodicRate & "," + Periods & "," + PMT & "," + PV & ",0)"
  180.     Application.Calculation = xlCalculationAutomatic
  181.     'Application.Calculation = xlCalculationManual
  182.         'Application.ActiveWindow.ActiveCell.Calculate()
  183.     End Sub

  184.     ' 计算有效利率
  185.     Sub CalculateEFFECT(ByVal Rate As Double)
  186.         ' 计算利率
  187.         PeriodicRate = Rate / 100

  188.         ' 执行计算
  189.         ActiveCell = "=EFFECT(" + PeriodicRate & ",12)"
  190.     Application.Calculation = xlCalculationAutomatic
  191.     'Application.Calculation = xlCalculationManual
  192.         'Application.ActiveWindow.ActiveCell.Calculate()
  193.     End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 22:43 , Processed in 0.039540 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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