我一直在整理这个小程序,以根据用户输入的公司代码从Google财经中提取实时股价。然而,我定义的第一个函数(在顶部)只适用于AAPL,而不适用于任何其他公司代码,第二个函数(查找价格)在第32行中有一个对象定义的错误。我很新VBA(只使用它4天)。任何想法我做错了什么?实时共享价格更新
Function ExtractCID(fcid As String) As Integer
Dim i As Integer, iCount As Integer
Dim sText As String
Dim lNum As String
sText = fcid
For iCount = Len(sText) To 1 Step -1
If IsNumeric(Mid(sText, iCount, 1)) Then
i = i + 1
lNum = Mid(sText, iCount, 1) & lNum
End If
If i = 1 Then lNum = CInt(Mid(lNum, 1, 1))
Next iCount
ExtractCID = CInt(lNum)
End Function
Public Function TakePrice(fpri As String) As Single
Dim s As String, i As Integer
Dim fprice As String
fprice = fpri
For i = 1 To Len(fprice)
If IsNumeric(Mid(fprice, i, 1)) Then
Exit For
End If
Next i
s = Mid(fprice, i, InStr(fprice, "</") - 1)
TakePrice = Convert.ToSingle(s)
End Function
Sub Shares()
Dim EPIC As String
Dim fprice As String
Dim sPrice As Single
Dim pPrice As Single
Dim Shares As Integer
Dim Change As Single
Dim Cost As Single
Dim MktVl As Single
Dim LG As Single
Dim L As Single
Dim url As String
Dim StartNumber As Integer
Dim EndNumber As Integer
Dim x As String
Dim cid As Integer
Dim fcid As String
EndNumber = Application.CountA(Range("A:A"))
For StartNumber = 2 To EndNumber
Sheet2.Cells(StartNumber, 1).Activate
EPIC = ActiveCell.Value
url = "http://www.google.com/finance?q=" & EPIC
With CreateObject("msxml2.xmlhttp")
.Open "GET", url, False
.send
x = .ResponseText
End With
fcid = (Mid(x, InStr(1, x, "cid="), 15))
cid = ExtractCID(fcid)
Range("B4").Value = cid
fprice = Mid(x, InStr(1, x, cid & "_l") + Len(cid) + 3, 15)
sPrice = TakePrice(fprice)
ActiveCell.Offset(0, 1).Value = sPrice
pPrice = ActiveCell.Offset(0, 2).Value
Shares = ActiveCell.Offset(0, 3).Value
Cost = pPrice * Shares
ActiveCell.Offset(0, 4).Value = Cost
ActiveCell.Offset(0, 5).Value = ((sPrice - pPrice)/pPrice) * 100
MktVl = sPrice * Shares
ActiveCell.Offset(0, 6).Value = MktVl
ActiveCell.Offset(0, 7).Value = MktVl - Cost
L = ((MktVl - Cost)/Cost) * 100
ActiveCell.Offset(0, 8).Value = L
If L < 0 Then
ActiveCell.Offset(0, 8).Interior.Color = RGB(255, 0, 0)
Else
ActiveCell.Offset(0, 8).Interior.ColorIndex = xlNone
End If
Next StartNumber
End Sub
对于第二个错误,将'Convert.ToSingle(s)'改为'csng(s)'。你的工作表中有哪些其他代码? AAPL是第一个吗? –
MSFT似乎有358464的CID - 当您尝试将它转换为第一个函数中的Integer时,您将收到溢出错误。将函数的类型设置为Long应该可以解决这个问题。这是你的问题 - 即。您选择的代码的CID值超过32768(整数的最大值)。 – DMM
是的,这是问题所在。使用Double和Long而不是Single和Integer将其整理出来。谢谢! – gylfih