The problem is that there is nothing in the function that is being changed. A workaround would be to add Application.Volatile to the function. This way it recalculates anytime there is any calculations done to the worksheet:
Code:
Function GetLocalBalancePru(TabName As String, AcctN As String, Curr As String) As Double
Dim lngLastRow As Long
Dim intCell As Integer
[B][COLOR=red]Application.Volatile[/COLOR][/B]
With ThisWorkbook.Worksheets(TabName)
lngLastRow = .Range("A1").End(xlDown).Row
intCell = 2
Do Until intCell > lngLastRow
If .Range("B" & intCell).Value = AcctN Then
If .Range("C" & intCell).Value = "USD" Then
Exit Do
ElseIf .Range("C" & intCell).Value = Curr Then
GetLocalBalancePru = .Range("D" & intCell).Value
Exit Do
End If
End If
intCell = intCell + 1
Loop
End With
End Function
However, I would not recommend this. It looks like you are using this function to effectively do a dual-condition lookup. Try, instead, using an array-entered INDEX/MATCH function:
=INDEX(TabName!D:D,MATCH(1,IF(TabName!B:B=AcctN,IF(TabName!C:C=Curr,1,"")),0))
Confirm entry with CTRL+SHIFT+ENTER (Not just enter) to get {brackets} around the formula. Note that TabName, AcctN, and Curr are variables you need to explicitly define in the formula.