前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用VBA跨单元格分配值

使用VBA跨单元格分配值

作者头像
fanjy
发布2023-08-29 21:11:10
2970
发布2023-08-29 21:11:10
举报
文章被收录于专栏:完美Excel

标签:VBA

这是在exceloffthegrid.com中看到的一个案例,一个非常有用的节省时间的宏:在单元格之间分配值。

假设有一份单个物品的清单,加起来总共210美元,你的老板想额外增加21美元作为应急费用。你打算如何使总额达到231美元?有几个选项:

1.添加一个含有21美元的调整行

2.确定可以增加的具体额度,以达到231美元的总额

3.将21美元的涨幅平均分摊到所有单元格

4.将21美元分摊到每一行项目中,使每个项目都能获得公平的比例

下面的VBA代码采用第四个选项。可以使用公式手动执行此操作,但这将非常耗时;相反,下面的VBA代码只需要2秒钟。

代码语言:javascript
复制
Sub ApportionValueAcrossCells()
 Dim apportionValue As Double
 Dim keepAsFormula As Long
 Dim total As Double
 Dim c As Range
 Dim formulaString As String
 '获取现有的总数
 total = Application.WorksheetFunction.Sum(Selection)
 '核查所选单元格总数不等于0
 If total = 0 Then
   MsgBox Prompt:="所有单元格的总和不应为0", _
     Title:="Apportion value"
   Exit Sub
 End If
 '获取去分配的值
 apportionValue = Application.InputBox(Prompt:="要分配的值:", _
   Title:="分配值", Type:=1)
 '用户单击取消
 If apportionValue = False Then Exit Sub
 '获取布尔值以保留公式或对结果进行硬编码
 keepAsFormula = MsgBox("保留公式?", vbYesNo)
 '遍历所选区域每一单元格
 For Each c In Selection
   If IsNumeric(c.Value) Then
     '计算单元格的结果
     formulaString = c.Formula & "+(" & apportionValue & _
     "/" & total & "*" & c.Value & ")"
     If Left(formulaString, 1) <> "=" Then _
       formulaString = "=" & formulaString
     '输入公式到单元格
     c.Formula = formulaString
     '重新计算当前单元格
     ActiveCell.Calculate
     If keepAsFormula = vbNo Then
       c.Value = c.Value
     End If
   End If
 Next c
End Sub

首先,选择包含值的数据区域,如下图1所示。

图1

然后,运行上面的宏代码。此时,出现一个输入框,输入要分配的值,如下图2所示。

图2

单击“确定”后,出现一个消息框,如下图3所示,可以选择粘贴新值还是包括公式,单击“确定”。

图3

结果如下图4所示。根据原始值,按比例分配21到所有单元格。

图4

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档