2013-06-30 46 views
1

以下代码旨在在项目项目列表上执行sumif工作表函数,然后将每个项目的总现金流写入名为Pipeline的不同工作表中。for循环中的运行时错误1004

的工作表函数但是产生一个运行时错误1004“方法“对象范围“_Global失败。

的代码已经被修改(见下面的答案),其固定运行时错误,但仍然没有不会产生所需的结果我基于最后一个答案自己修改了代码,但我认为我错过了最后一步使其工作。为了更清楚起见,我附加了代码当前生成的屏幕截图:在联合:这是仍然没有工作

enter image description here

两件事我希望显示工作表中存在的项目的项目编号(在本例中,由于有三个项目,B8应该具有值1,B9值2和B10值3)。然后,在H列和的名单应该停止,而不是返回值为0

使其更清晰时,有没有更多的项目进行总结,这是该管道片看起来像一个截图:

enter image description here

请帮忙吗?新代码如下:

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 

回答

1

在你的循环中,你有一些古怪。

“ActiveCell”实际上是一个命名范围吗?如果这种情况对于一个命名范围来说是一个令人困惑的名字(相对于什么而言是活跃的)。如果不是这种情况,那么你应该用ActiveCell来代替它。您可以省略.Value部分。

您想使用ActiveCell.Offset(1, 0).Select将活动单元格向下移动一行。

+0

好的谢谢; 'ActiveCell'不是一个命名的范围,而只是当前的活动单元格,所以我将其替换了。然而,第二个建议与偏移现在产生一个错误(新代码见上文) - 无效使用属性。 – Matthias

+0

这里。我更正了我的代码。我忘了你正在使用'ActiveCell',它是一个Range对象的特例。您不能修改'ActiveCell',就像修改一个常规的'Range'对象一样。 – ApplePie

+0

好吧修好了,谢谢。现在1004已经回来了'Range(ActiveCell)...' - 我想知道sumif的结构是否是问题? – Matthias

1

我重写了所有声明变量的代码。此代码还消除了使用选择和激活命令,这是一个好主意:

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变量,但我把它留在代码中。