Code:
Option Explicit
Sub TestPubicIP()
Dim strIP As String
Call PubicIP(strIP)
MsgBox prompt:=strIP
'Call WtchaGot(strIP)
End Sub
' Because we have ByRef PublicIP , the is effectively taking the variable strIP into the function, and similarly in the recursion Call line that variable is taken. Hopefull in one of the 5 attepts at running the Function it will be filled.. We don't actually fill the pseudo variable PubicIP so no value is returned directly by the Function. (So we could have used a Sub()routine instead) To get a returned value we look at the value in strIP after runing the routine , because , as said, hopefully that particular variable will have been added to
Function PubicIP(ByRef PublicIP As String, Optional ByVal Tries As Long) As String
If Tries = 5 Then Exit Function
On Error GoTo Bed
With CreateObject("msxml2.xmlhttp")
.Open "GET", "http://myip.dnsomatic.com", True ' 'just preparing the request type, how and what type... "The True/False argument of the HTTP Request is the Asynchronous mode flag. If set False then control is immediately returns to VBA after Send is executed. If set True then control is returned to VBA after the server has sent back a response.
'No extra info here for type GET
'.setRequestHeader bstrheader:="Ploppy", bstrvalue:="Poo"
.setRequestHeader bstrheader:="If-Modified-Since", bstrvalue:="Sat, 1 Jan 2000 00:00:00 GMT" ' https://www.autohotkey.com/boards/viewtopic.php?t=9554 --- It will caching the contents of the URL page. Which means if you request the same URL more than once, you always get the same responseText even the website changes text every time. This line is a workaround : Set cache related headers.
.send ' varBody:= ' No extra info for type GET. .send actually makes the request
While .readyState <> 4: DoEvents: Wend ' Allow other processes to run while the web page loads. Think this is part of the True option
Dim PageSrc As String: Let PageSrc = .responseText ' Save the HTML code in the (Global) variable. ': Range("P1").Value = PageSrc 'For me for a print out copy to text file etc. The responseText property returns the information requested by the Open method as a text string
End With
Let PublicIP = PageSrc: ' Debug.Print PubicIP
'Call WtchaGot(PubicIP)
If PublicIP = "" Then Call PubicIP(PublicIP, Tries + 1) ' Recursion Call line. I do this because sometines it seems to need more than one try before it works
Exit Function
Bed:
Let PubicIP = Err.Number & ": " & Err.Description: Debug.Print PubicIP
End Function
Code:
'
Sub TestPubicIPwhatismyipaddress_com()
Dim strIP As String
Let strIP = PubicIPwhatismyipaddress_com
MsgBox prompt:=strIP
End Sub
Function PubicIPwhatismyipaddress_com() As String
On Error GoTo Bed
With CreateObject("msxml2.xmlhttp")
.Open "GET", "https://whatismyipaddress.com/de/meine-ip", False ' 'just preparing the request type, how and what type... "The True/False argument of the HTTP Request is the Asynchronous mode flag. If set False then control is immediately returns to VBA after Send is executed. If set True then control is returned to VBA after the server has sent back a response.
'No extra info here for type GET
'.setRequestHeader bstrheader:="Ploppy", bstrvalue:="Poo"
.setRequestHeader bstrheader:="If-Modified-Since", bstrvalue:="Sat, 1 Jan 2000 00:00:00 GMT" ' https://www.autohotkey.com/boards/viewtopic.php?t=9554 --- It will caching the contents of the URL page. Which means if you request the same URL more than once, you always get the same responseText even the website changes text every time. This line is a workaround : Set cache related headers.
.send ' varBody:= ' No extra info for type GET. .send actually makes the request
While .READYSTATE <> 4: DoEvents: Wend ' Allow other processes to run while the web page loads. Think this is part of the True option
Dim PageSrc As String: Let PageSrc = .responsetext ' Save the HTML code in the (Global) variable. ': Range("P1").Value = PageSrc 'For me for a print out copy to text file etc. The responseText property returns the information requested by the Open method as a text string
End With
Let PubicIPwhatismyipaddress_com = PageSrc: ' Debug.Print PubicIPwhatismyipaddress_com
Dim IPadres As String, posIPadres1 As Long, posIPadres2 As Long
Let posIPadres1 = InStr(1, PageSrc, "", vbBinaryCompare) ' Screenshot ---> Page Source whatismyipaddress_com .JPG : https://imgur.com/LSvORAe
Let posIPadres2 = InStr(posIPadres1 + 1, PageSrc, "", vbBinaryCompare)
Let PubicIPwhatismyipaddress_com = Mid(PageSrc, posIPadres1 + 23, ((posIPadres2 - 1) - (posIPadres1 + 23)))
Call WtchaGot(PubicIPwhatismyipaddress_com)
Exit Function
Bed:
Let PubicIPwhatismyipaddress_com = Err.Number & ": " & Err.Description: Debug.Print PubicIPwhatismyipaddress_com
End Function
Bookmarks