Buongiorno a tutti,
sono un nuovo e maldestro utilizzatore di VBA. Sono incappato in un errore che non riesco proprio a risolvere. Vi descrivo in breve il mio problema.
Ho la necessità di estrarre dal web dei dati in modo automatico. In particolare devo trovare la latitudine e la longitudine di svariate società quotate sui mercati borsistici di tutto il mondo.
I nomi di queste società sono forniti su di un foglio excel sotto forma di elenco, posizionato nella prima colonna. Nella seconda colonna si trova il nome del mercato sul quale essa è quotata e nella terza colonna il codice ISIN della società.
Per fare ciò mi sono servito di un programmino che serve per fare delle web macro: iMacro. Questo non è altro che un browser che da la possibilità di registrare le operazioni effettuate dal mouse. Una volta registrate le diverse macro di cui ho bisogno, un tasto di comando di excel, programmato con VBA, non fa altro che azionare le web macro precedentemente registrate, fornendo loro i dati di input dal foglio excel. In particolare prelevare il nome della società dal foglio excel, lo gira ad iMacro che va sul web ed effettua le operazioni precedentemente registrate. Infine copia i dati di cui ho bisogno e li restituisce al foglio excel in un apposito campo. L'operazione prevede l'uso di diverse web macro: una prima famiglia di macro cerca l'indirizzo della società, una seconda usa il primo output per cercare la posizione geografica tramite un sito di geocoding. Il codice ha quindi il compito di far dialogare excel con le web macro in modo che l’output della prima macro sia l’input della seconda.
Ho parlato di una prima “famiglia” di web macro perché in realtà ho sviluppato una macro per ogni mercato borsistico. Infatti per trovare l’indirizzo di una società quotata è più univoco cercare il nome della società all’interno del sito della borsa dove questa è quotata che non inserendo il nome della società in google. L’operazione effettuata da questa “famiglia” è tuttavia la stessa: fornire l’indirizzo della società.
Il problema si verifica quando la prima macro fornisce un output nullo. Infatti in quel caso, invece di saltare il modulo relativo alla seconda macro e passare alla successiva società, il procedimento si arresta.
Per questo ho inserito nel codice, prima del modulo relativo alla seconda macro, un’istruzione condizionale che verifichi se il campo è effettivamente nullo o meno. In caso affermativo questa istruzione dovrebbe far saltare il pezzo relativo alla seconda macro e portare il tutto alla fine del ciclo (e quindi alla società successiva nell’elenco). Ma non funziona!! Quando la macro arriva ad una società che non restituisce l’indirizzo, tutto si blocca e si apre una finestra dove mi si invita a debuggare il codice. Quando entro nel debug la prima riga dopo l’istruzione condizionale sopraccitata è evidenziata come errata.
Di seguito vi fornisco il codice VBA del tasto excel che ho scritto finora:
Private Sub CommandButton1_Click()
Dim iim1, iret, row, totalrows
Set iim1 = CreateObject("imacros")
iret = iim1.iimInit
iret = iim1.iimDisplay("submitting Data from Excel")
totalrows = ActiveSheet.UsedRange.Rows.Count
For row = 2 To totalrows
Select Case Cells(row, 2).Value
Case "GBR"
iret = iim1.iimSet("-var_companyname", Cells(row, 1).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LSEstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
Case "DEU"
iret = iim1.iimSet("-var_companyisin", Cells(row, 3).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-DEUstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
Case "BEL"
iret = iim1.iimSet("-var_companyisin", Cells(row, 3).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-BELstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
Case "FRA"
iret = iim1.iimSet("-var_companyisin", Cells(row, 3).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-FRAstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
Case "ITA"
iret = iim1.iimSet("-var_companyisin", Cells(row, 3).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-ITAstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
Case "CHE"
iret = iim1.iimSet("-var_companyisin", Cells(row, 3).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-CHEstockSearch1")
Cells(row, 4).Value = iim1.iimGetLastExtract(0)
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
End Select
If Cells(row, 5).Value = nil Then GoTo fineciclo
iret = iim1.iimSet("-var_companyaddress", Cells(row, 5).Value)
iret = iim1.iimDisplay("Row# " + CStr(row))
iret = iim1.iimPlay("VBA-LatLon")
Cells(row, 6).Value = iim1.iimGetLastExtract(1)
Cells(row, 7).Value = iim1.iimGetLastExtract(2)
If iret < 0 Then
MsgBox iim1.iimGetLastError()
End If
fineciclo: Next
iret = iim1.iimDisplay("share address extraction complete")
iret = iim2.iimExit
End Sub
Qualcuno sa dirmi se l’errore è effettivamente nel codice o meno?
Grazie mille!

Rispondi quotando