2015-10-15 120 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