【发布时间】:2020-05-01 11:35:17
【问题描述】:
我正在处理一张纸,而我正在做的事情似乎非常缓慢且冗长。我希望有一种更巧妙的方式来做到这一点。
我想做在 Excel 中看起来像这样但在 VBA 中的操作:-if(Search("5,",A10,1)>0,A5,0)+if(Search("4,",A10,1)>0,A4,0)+if(Search("3,",A10,1)>0,A3,0) 等等。
我可以看到在 vba 中执行此操作的唯一方法是搜索将数据添加到其他位置,然后稍后对其进行求和。我有这个:-
Sub AmorTotal_1()
Dim Coll As String
Dim ClTo As String, RuTo As String, ElTo As String, Jig As String, Teth As String, Admin As String, Crane As String
Dim ClToS As Integer, RuToS As Integer, ElToS As Integer, JigS As Integer, TethS As Integer, AdminS As Integer, CraneS As Integer
Coll = "B"
ClTo = 5
RuTo = 6
ElTo = 7
Jig = 8
Teth = 9
Admin = 10
Crane = 11
ThisWorkbook.Sheets(2).Range(Coll & 2).Value = ThisWorkbook.Sheets(1).Range(Coll & 2).Value
If InStr(1, Range(Coll & 12), "5,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 3).Value = ThisWorkbook.Sheets(1).Range(Coll & ClTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 3).Value = 0
End If
If InStr(1, Range(Coll & 12), "6,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 4).Value = ThisWorkbook.Sheets(1).Range(Coll & RuTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 4).Value = 0
End If
If InStr(1, Range(Coll & 12), "7,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 5).Value = ThisWorkbook.Sheets(1).Range(Coll & ElTo).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 5).Value = 0
End If
If InStr(1, Range(Coll & 12), "8,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 6).Value = ThisWorkbook.Sheets(1).Range(Coll & Jig).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 6).Value = 0
End If
If InStr(1, Range(Coll & 12), "9,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 7).Value = ThisWorkbook.Sheets(1).Range(Coll & Teth).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 7).Value = 0
End If
If InStr(1, Range(Coll & 12), "10,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 8).Value = ThisWorkbook.Sheets(1).Range(Coll & Admin).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 8).Value = 0
End If
If InStr(1, Range(Coll & 12), "11,") > 0 Then
ThisWorkbook.Sheets(2).Range(Coll & 11).Value = ThisWorkbook.Sheets(1).Range(Coll & Crane).Value
Else
ThisWorkbook.Sheets(2).Range(Coll & 11).Value = 0
End If
ThisWorkbook.Sheets(1).Range(Coll & 13).Value = ThisWorkbook.Sheets(2).Range(Coll & 3).Value + ThisWorkbook.Sheets(2).Range(Coll & 4).Value + ThisWorkbook.Sheets(2).Range(Coll & 5).Value + ThisWorkbook.Sheets(2).Range(Coll & 6).Value + ThisWorkbook.Sheets(2).Range(Coll & 7).Value + ThisWorkbook.Sheets(2).Range(Coll & 8).Value + ThisWorkbook.Sheets(2).Range(Coll & 9).Value
End Sub
我需要跨 20 列和多行执行此操作,因此希望有另一种方法。
我在网上搜索过,但找不到任何我能理解的东西(我还是 VBA 新手)。
以下是一些数据的示例。总之,
用户在第 5-11 行输入了一些工具的一些值。用户可以决定某些工具可以用于其他项目(由列表示的项目),因此他们可能希望在整个这些项目中分摊这些工具的成本。在第 1 项上,用户决定第 8 行和第 9 行(第 12 行)可用于第 1、2、3、5 项(第 15 行)。第 13 行取项目 1 中单元格 B8 和 B9 中的价格值,第 16 行是摊销值,即第 2 行每个参考项目 1、2、3 + 5 的成本。这是由该项目总计完成的成本除以(1、2、3+5 的总项目成本)* 摊销值第 13 行。
【问题讨论】:
-
VBA
IIf()函数等效于 Excel 的IF(),但可能有比这更优雅的方法。你能分享一些示例数据和预期的输出吗? -
A10全部内容的范围是多少?
-
嗨@jsheeran 我将能够在星期一分享示例数据。我已经在我的个人笔记本电脑上手动输入了这个,因为我的工作电脑已经失去了连接到 wifi 的能力并且拒绝手机的热点,这就是我在我的个人笔记本电脑上所做的。道歉:(
-
@RonRosenfeld 好问题,所以在上面的示例中,第 1 到第 9 行包含工具成本。用户可以选择将这些工具与另一个项目摊销(项目 1 是 A 列,依此类推,直到项目 20)。在 A10 中,他们可以选择他们希望摊销的行。所以说A4,A5范围内的工具也用于项目20,用户将4,5放在A10范围内。我希望这是有道理的。
-
那么,在您提到的情况下,您想要 A4 和 A5 的总和?您更喜欢公式还是 VBA?哪个版本或 Excel。