2015-10-15 130 views
2

值求和行我要总结大小可变的一行值:从5列到最后填充的单元行6自定义功能与特定文字

有问题的行必须包含“My text”在栏B

因此,举例来说,我想从E8 to J8总结以下值: enter image description here

这是我使用的代码:这是返回#VALUE!

Function cenas() 
Application.Volatile 

Dim celula 
Dim ultAno As Integer 
Dim intervalo As Range 
Dim separador As Worksheet 

    Set separador = Sheets("Sheet1") 
    ultAno = separador.Cells(6, 5).End(xlToRight).Column 
    For i = 1 To 50 
     celula = separador.Cells(i, 2).Value 
     If celula = "My text" Then 
     Set intervalo = Sheets(separador).Range(Sheets(separador).Cells(i, 5), Sheets(separador).Cells(i, ultAno)) 
     cenas = Application.Sum(intervalo) 
     End If 
    Next i 

End Function 

尝试了与变量声明相关的不同方法,但找不到解决方案。

+0

为什么你不包括D8的总和? – MatthewD

+0

总和应该写在哪里? – MatthewD

+0

结果应该写入任何单元格(超出该表格) –

回答

3

的一个问题是此行

Set intervalo = Sheets(separador).Range(Sheets(separador).Cells(i, 5), Sheets(separador).Cells(i, ultAno)) 

没有必要使用Sheets()separador设置为表单。

Function cenas() 
Application.Volatile 

Dim celula 
Dim ultAno As Integer 
Dim intervalo As Range 
Dim separador As Worksheet 

    Set separador = Sheets("Sheet1") 
    ultAno = separador.Cells(6, 5).End(xlToRight).Column 
    For i = 1 To 50 
     celula = separador.Cells(i, 2).value 
     If celula = "My text" Then 
     Set intervalo = separador.Range(separador.Cells(i, 4), separador.Cells(i, ultAno)) 
     cenas = Application.sum(intervalo) 
     End If 
    Next i 

End Function 

如果你要使用的功能,为什么不让它多一点多才多艺:

Function cenas(lkpStr As String) 
Application.Volatile 

Dim celula 
Dim ultAno As Integer 
Dim intervalo As Range 
Dim separador As Worksheet 

    Set separador = Sheets("Sheet3") 
    ultAno = separador.Cells(6, 5).End(xlToRight).Column 
    For i = 7 To separador.Cell(7,2).End(xlDown).Row 

     If separador.Cells(i, 2).value = lkpStr Then 
     Set intervalo = separador.Range(separador.Cells(i, 5), separador.Cells(i, ultAno)) 
     cenas = Application.sum(intervalo) 

     End If 
    Next i 

End Function 

Sub getsum() 
Dim t 
t = cenas("My Text") 
Debug.Print t 

End Sub 

这将允许您指定要搜索的文本。并返回组中最后一个的总和。您可以在工作表或vba代码中将其称为UDF。

注意:如果B列中有多个“我的文本”,它将只返回其中包含“我的文本”的最后一行。

+0

是的,这当然是有道理的。 –

+0

我正在想这个。向函数传递参数会帮助我在其他情况下重用它。 –

2

看看这样的事情。

Private Sub CommandButton34_Click() 
    Dim ws1 As Excel.Worksheet 
    Dim lRow As Long 
    Dim lLastCol As Long 

    Set ws1 = ActiveWorkbook.Sheets("Sheet1") 
    lRow = 1 

    ws1.Activate 
    'Loop through the rows 
    Do While lRow <= ws1.UsedRange.Rows.count 

     If ws1.Range("B" & lRow).Value = "My text" Then 

      'Get the last col used in that row 
      lLastCol = ws1.Cells(lRow, ws1.Columns.count).End(xlToLeft).Column 

      'Write the sum to the column after the last used column 
      ws1.Cells(lRow, lLastCol + 1).Value = "=sum(D" & lRow & ":" & Col_Letter(lLastCol) & lRow & ")" 

     End If 
     lRow = lRow + 1 
    Loop 

End Sub 

Function Col_Letter(lngCol As Long) As String 
    Dim vArr 
    vArr = Split(Cells(1, lngCol).Address(True, False), "$") 
    Col_Letter = vArr(0) 
End Function