2014-02-09 67 views
1

我有一个Excel工作表,其中包含一列中的一些字符串。有时所有条目的是相同的,有时不是:在VBA函数中传递Excel范围,按数组处理并返回结果

enter image description here

enter image description here

我写的函数传递的范围内作为一个参数:

= Dent_WG(A1:A6)

VBA函数应确定哪种情况为真(所有条目=“A1”或至少一个条目=“Ag”),然后分别返回0或12:

Function DentWG(WG_Mat As Range) As Single 

Dim dat As Variant, rw As Variant, temp As Single 
dat = WG_Mat 
temp = 0 

For rw = LBound(dat, 1) To UBound(dat, 1) 
    If dat(rw, 1) = "Ag" Then 
     temp = 12 
    End If 
Next 

If temp = 12 Then 
    DentWG = 12 
Else 
    DentWG = 0 
End If 

端功能

然而,函数总是返回0,即使对于其中“银”的范围内发生第二壳体。我确信我无法正确地将范围转换为数组或正确地将预期的逻辑应用于该数组。我的代码有什么问题?

回答

2

从你的问题......

的VBA函数应该确定哪些情况是真实的(所有条目=“铝”,或至少一个条目=“ Ag“),然后分别返回0或12:

这就是你需要的。

Function DentWG(WG_Mat As Range) As Long 
    Dim ClCount As Long 

    ClCount = WG_Mat.Cells.Count 

    If Application.WorksheetFunction.CountIf(WG_Mat, "Al") = ClCount Then 
     DentWG = 0 
    ElseIf Application.WorksheetFunction.CountIf(WG_Mat, "Ag") > 0 Then 
     DentWG = 12 
    End If 
End Function 

同样可以使用公式

=IF(COUNTIF(A1:A6,"Al")=(ROWS(A1:A6)*COLUMNS(A1:A6)),0,IF(COUNTIF(A1:A6,"Ag") > 0‌​,12,""))

如果它永远是1列,那么你不需要*COLUMNS(A1:A6)来实现。这会做。

=IF(COUNTIF(A1:A6,"Al")=ROWS(A1:A6),0,IF(COUNTIF(A1:A6,"Ag") > 0,12,""))

截图

enter image description here

+1

当然!那个我太快了!不能删除一个被接受的内容,虽然... – assylias

+0

@assylias:你仍然可以更新你的答案:) –

+0

@Siddharth路过:+1和检查。感谢这两个解决方案。他们都为我工作得很好。我自己的解决方案,我已经在上面纠正过了,也适用。我看到你的解决方案调用Application.WorksheetFunction。在我的简单应用程序中,资源不是问题,但一般来说:在VBA代码中调用Application.WorksheetFunction比在严格遵循VBA方法的情况下更耗费资源? – jmaz

2

这个工作对我来说:

Function DentWG(WG_Mat As Range) As Single 
    Dim result As Single, cl as Range 
    result = 0 

    For Each cl In WG_Mat 
     If cl = "Ag" Then 
      DentWG = 12 
      Exit Function 
     End If 
    Next cl 

    DentWG = result 
End Function 
+0

这还没有回答这个问题。 –

+0

@Alex P:不适合我,也许是因为没有声明? – jmaz

+0

@Max:很好的地方。我相应地更新了代码 –

2

你并不真的需要这样的UDF。你可以只说:

=IF(COUNTIF(A1:A6,"Ag")>=1,12,0)

+0

+ 1对于非VBA解决方案:)然而,你错过了一个部分'哪种情况是真的(所有条目=“Al”,或至少一个条目=“Ag”)' –

+0

你仍然忘了“Al”:) –

+0

@SiddharthRout是的,但从他的代码中,我假定OP认为输入可靠地为“Ag”或“Al”。无可否认,这是很多假设:-) – maybeWeCouldStealAVan