2014-02-17 213 views
1

在我的Excel電子表格中,我有兩列。#VALUE Excel VBA函數錯誤

  • A包含值爲'是','否'或'可能'的字符串。
  • B包含在每年的字符串。

我需要一個函數來確定B列,其中在A列中的等值是「是」一年出現的次數。

目前,我有以下代碼:

Function CountIfYearAndValue(Rng As Range, YNM As String, Year As String) As Integer 
    Dim count As Integer 
    count = 0 

    For Each c In Rng.Cells 
     If (StrComp(Abs(c.Value), Year, vbTextCompare) = 0) And (StrComp(Cells(c.Row, A), YMN, vbTextCompare) = 0) Then count = count + 1 
    Next 

    CountIfYearAndValue = count 
End Function 

這段代碼的想法是,我們通過在給定的(在B列的範圍)範圍內的每一個細胞循環,並檢查一年等於Year參數。如果A列上的等效單元格等於YNM參數,我們會增加count變量。

出於某種原因,當我使用下面的參數驗證碼不起作用:

=CountIfYearAndValue('Years'!B1:B7,"Yes","Year 7") 

它只是做了#VALUE錯誤並拒絕顯示任何結果。

任何幫助將不勝感激。

編輯:兩個單元格中的所有值都是未格式化的數據類型('常規'),沒有單元格爲空白。

+3

Kezz101,@mehow是絕對正確的,最好使用「COUNTIF」。但是,如果你想知道你的解決方案爲什麼不起作用 - 這是因爲1)'Cells(c.Row,A)'。你應該爲'A':'Cells(c.Row,「A」)'和2)在你正在使用'YNM As String'的函數參數中添加引號,但是在你使用'StrComp(Cells(c.Row ,A),YMN,vbTextCompare)'。請注意,有'YMN'和'YNM'。我建議你使用'Option Explicit'來避免這種錯誤 –

+0

@simoco感謝您的迴應!我現在使用了'COUNTIF'函數,但我很想知道它爲什麼仍然不起作用。我實施了您的更改,但仍然無法使用相同的「#VALUE」錯誤。 – Kezz101

+0

無法想出它,因爲我沒有看到你的更新代碼,但是這個改變你的功能適用於我 –

回答

5

這聽起來像你正在重新發明輪子......已經有一個內置的函數(優勢:比一個UDF快得多),做正是你是什麼之後。這就是所謂的COUNTIFS()

所有YES ES爲Year 7行1〜10

=COUNTIFS(B1:B10, "Year 7",A1:A10, "Yes")


我剛剛有了一個快速瀏覽一下你的代碼,我想是有原因的可能是幾您的原始代碼不能按預期工作。

  • YNM是有效的列名因此它不應該被用作變量名。你應該避免命名變量這樣的 - 給它一個更有意義的名稱

  • YNM = YMN,你在你的代碼(參見功能定義,然後在StrComp()功能拼錯的版本)

  • 了吧!
  • Year是一個有效的VBA內置函數,因此您應該避免將它用作變量名稱,因爲您將自己暴露給命名衝突。

  • 在模塊的頂部添加Option Explicit。這就要求你把所有的變量都放在這裏。總是有很多原因推薦。

  • rng變量是Range類型,因此您不需要明確地將.Cells屬性添加到它。儘管它在某些情況下可能會有所幫助,但在更高級別上可能會遇到一些運行時類型兼容性問題。 (運行時可能您rng範圍變量轉換爲二維數組等

  • 添加在c.Offset(0, -1)圍繞第二StrComp()功能的顯式轉換,你不希望運行時(罕見的,但仍然有可能)將您的Yes轉換爲Boolean數據類型。顯式轉換爲String只是給你額外的保護; P(笑)

因此,像這樣返回正確的值

Function CountIfYearAndValue(rng As Range, choice As String, myYear As String) As Long 
    Dim count As Long 
    count = 0 

    Dim c As Range 
    For Each c In rng 
     If (StrComp(c, myYear, vbTextCompare) = 0) And (StrComp(CStr(c.Offset(0, -1)), choice, vbTextCompare) = 0) Then 
      count = count + 1 
     End If 
    Next c 

    CountIfYearAndValue = count 
End Function 

好吧,我希望這可以幫助您瞭解位和件:)任何問題請發表評論

+0

這可以很好地工作,但遇到空單元格時仍會拋出「#VALUE」錯誤。無論如何要解決這個問題,而不是填補空單元? – Kezz101

+0

@ Kezz101,你是否使用具有相同行數的範圍(例如'B1:B10'和'A1:A10'具有相同的行數)? –

+0

@simoco嗯,它似乎現在工作,所以我想我沒有! – Kezz101