2017-04-15 72 views
-1
Dim codeStart As String 
codeStart = Evaluate("CELL(""address"",OFFSET(" & startRange & ",2,0,1,1))") 

Dim agentTotal As String 
agentTotal = Evaluate("CELL(""address"",INDEX(" & startRange & ":" & _ 
"$A$10000,MATCH(""    Total*""," & startRange & ":$A$10000,0)))") 

Dim numberOfCodes As String 
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")") 
MsgBox numberOfCodes 

前兩個變量當與Msgbox類型不匹配時傳遞的整數結果爲整數變量類型

我試圖設置numberOfCodes到幾個不同的變量類型,並把測試CInt正確傳遞作爲字符串在Evaluate面前,但沒有骰子..任何想法?

+0

'numberOfCodes'有什麼值'postate'? – shahkalpesh

+0

在這個例子中,1.減去$ A $ 56 - $ A $ 55 –

+0

做一個'trim'並看看它是否可以用'val'轉換成數字。即'msgbox(val(numberOfCodes))'。 – shahkalpesh

回答

3

當您執行以下語句

Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")") 

它返回一個Variant(這是什麼Evaluate總是返回),但是,因爲你使用ROW(可返回一個數組),它要麼返回Variant/Variant(1 To 1)(如果只返回一行)或Variant/Variant(1 To x, 1 To 1)(如果返回x行)。

通常一個Variant可以轉換爲一個StringInteger(如果該值允許),但是,因爲在這種情況下,它是一個Variant陣列,它不能被轉換爲單一值。

在你的情況,下面的代碼會工作:

Dim numberOfCodes As Variant 
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")") 
MsgBox numberOfCodes(1) 

Dim numberOfCodes As Integer 
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")(1) 
MsgBox numberOfCodes 

而是另闢蹊徑本來簡單的說:

Dim numberOfCodes As Long 
numberOfCodes = Range(agentTotal).Row - Range(codeStart).Row 

但是這種簡化可能已經迴歸更進一步。比如你正在使用的代碼Evaluate("CELL(""address"",OFFSET(" & startRange & ",2,0,1,1))")找到一個地址,但你是行號後真的,所以你可以離開了這一點,計算numberOfCodes

numberOfCodes = Range(agentTotal).Row - Range(startRange).Row - 2 

而且你還可以得到利用

擺脫 AgentTotal
numberOfCodes = Application.Match("    Total*", _ 
            Range(startRange, "$A$10000"),0) - 3 

它只計算從startRange到「Total」的行數(包含)並減去3(排除兩個標題(?)和總數)。

+0

哇。非常有見地。非常感謝。 –

0

我只是要採取這些評估,並緊跟.Row並將它們傳遞給整數,只需從codeStartRow中減去agentTotalRow。現在完美運作。

相關問題