以下代码用于在项目项列表上执行sumif工作表函数,然后在名为Pipeline的不同工作表上写下每个项目的总现金流。
然而,工作表函数生成了运行时错误1004“方法”对象'_Global'的范围失败。
现在修改了代码(见下面的答案),修复了运行时错误,但仍然没有产生预期的结果。我已经根据最后的答案自己修改了代码,但我认为我遗漏了最后一点让它工作。为了更清楚,我附上了代码当前产生的屏幕截图:
两件仍然不起作用的东西:在表格的B栏中我想要显示源表上存在的项目的项目编号(在这个例子中,B8应该具有值1,B9值2和B10值3,因为有三个项目)。然后,当没有更多的项目要总结时,H列中的总和列表应该停止,而不是返回值0.
为了更清楚,这是管道表的外观截图:
请帮忙吗?新代码如下:
Sub Write_Pipeline()
'Sums up revenue of each project in the Input section to display expected cash flow
Dim ip As Worksheet, pl As Worksheet, Start As Range, Length As Integer, Cnt As Integer, PH As Integer
Dim SelectRange As Excel.Range
Dim SumRange As Excel.Range
Dim cell As Excel.Range
Set ip = Worksheets("Input")
Set pl = Worksheets("Pipeline")
Set Start = pl.Range("B8")
Start = 1
Cnt = 1
Length = 151
Set SelectRange = ip.Range("B26:B151")
Set SumRange = ip.Range("Y26:Y151")
For Each cell In pl.Range("H8").Resize(Length)
cell.Value = Application.WorksheetFunction.SumIf(SelectRange, Start, SumRange)
PH = Start.Value
Start = Start.Offset(1, 0)
Start = PH + 1
Next cell
End Sub
答案 0 :(得分:1)
在你的循环中,你有一些奇怪的东西。
“ActiveCell”实际上是命名范围吗?如果是这样的情况,那么命名区域的名称是混乱的(相对于什么是活跃的?)。如果不是这样,那么您应该用ActiveCell
替换它。您可以省略.Value
部分。
您希望使用ActiveCell.Offset(1, 0).Select
将活动单元格向下移动一行。
答案 1 :(得分:1)
我用声明的所有变量重写了你的代码。此代码还消除了使用Select和Activate命令,这是一个好主意:
Sub Write_Pipeline()
Dim ip As Worksheet, pl As Worksheet, Start As Range, Length As Integer, Cnt As Integer
Dim SelectRange As Excel.Range
Dim SumRange As Excel.Range
Dim cell As Excel.Range
Set ip = Worksheets("Input")
Set pl = Worksheets("Pipeline")
Set Start = pl.Range("B8")
Start = 1
Cnt = 1
Length = 151
Set SelectRange = ip.Range("B26:B151")
Set SumRange = ip.Range("Y26:Y151")
For Each cell In pl.Range("H8").Resize(Length)
cell.Value = Application.WorksheetFunction.SumIf(SelectRange, Start, SumRange)
Next cell
End Sub
为了将来参考,请注意Range(ActiveCell)
尝试引用其名称或地址在ActiveCell中的范围。这是因为,至少在这种情况下,范围的默认值是其Value
,即Range(ActiveCell.Value)
。因此,除非活动单元格包含类似“A1”或“B22”(或范围名称)的内容,否则会引发运行时错误1004.即使它确实包含类似的值,我怀疑您是否喜欢结果:)
我没有看到您需要cnt
变量,但我将其保留在代码中。