IP address to Hostname in Excel

N

nicktruman

Hi
I am hoping someone can help me please.
I have a spreadsheet that is linked to a survey being hosted on our website.
The survey is about internet safety and one of the questions it ask is what
is your ISP? However it seems that not everyone here in Bahrain knows this
and their entries are not valid. However we trap the IP addess in the survey
results and these are pulled into the spreadsheet along with all the survey
answers

column a col b col c col
IP Address Sex Age Nationality etc.
193.188.105.25 M 32 Bahraini etc.
84.235.101.66 M 33 Lebanese
83.136.59.145 F 28 Bahraini

I want to find a way of converting the IP Address into an ISP name or at
least the hostname. Can anyone help
Cheers in advanc
Nic
 
J

joel

You can get the PC Name by usding the environmental variable
COMPUTERNAME


computerName = environ("COMPUTERNAME")


You can get the IP address from the computername by doing a ipconfig
command to the host name. From a sheel prompt

1) Start - run - c:\windos\system32\cmd.exe
2) ipconfig


You can run these commands from a sheel command like this

ComputerName = Environ("ComputerName")

Shell "cmd /c C:\windows\system32\ipconfig >c:\temp\ipconfig.txt", 0


You can then open the text file to get the results.
 
N

nicktruman

Hi, Thanks for the reply.
However, I a not after my data, but the hostnames of IP addresses registered in a survey by people who have filled in a survey

Cheer
Nick
 
J

joel

what I did recently in C# was to ping the IP addrress which filled u
the ARP table. Then went into the ARP table to get the Host Names. I
is posible to do the same thing uisng VBA but will have to think abou
the process.

I aslo can open an Excel file from C#. so I could write a C# progra
which opens your excel file get the IP address, ping the addresses, an
then read the arp table.

Likewise, from VBA I could use the Shell command to ping each of the I
addresses then read the arp table. To read the ARP table I would use
DLL in the system32 folder to get the results. there also may be
reference library that would read the arp table but would need t
investigate some more.
 
N

nicktruman

Thnaks Joel. I tried calling wsock32 but this is a 64 bit machine and I got errors on teh library
I saw some code gethostnamefromIp but could not make it work in Excel.
I have 800+ IP addresses to check and output some sort of data.
I guess similar to an excel version of ping -
where the output would be (as in this case (dhcp.trcy.mi.charter.com

ping -a 24.236.213.22
Pinging 24-236-213-225.dhcp.trcy.mi.charter.com
 
J

joel

I found code on the web that works fine. I added a routing at the en
to test the code.


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2009 VBnet, Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Const WSADescription_Len As Long = 256
Private Const WSASYS_Status_Len As Long = 128
Private Const WS_VERSION_REQD As Long = &H101
Private Const IP_SUCCESS As Long = 0
Private Const SOCKET_ERROR As Long = -1
Private Const AF_INET As Long = 2

Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
imaxsockets As Integer
imaxudp As Integer
lpszvenderinfo As Long
End Type

Private Declare Function WSAStartup Lib "wsock32" _
(ByVal VersionReq As Long, _
WSADataReturn As WSADATA) As Long

Private Declare Function WSACleanup Lib "wsock32" () As Long

Private Declare Function inet_addr Lib "wsock32" _
(ByVal s As String) As Long

Private Declare Function gethostbyaddr Lib "wsock32" _
(haddr As Long, _
ByVal hnlen As Long, _
ByVal addrtype As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(xDest As Any, _
xSource As Any, _
ByVal nbytes As Long)

Private Declare Function lstrlen Lib "kernel32" _
Alias "lstrlenA" _
(lpString As Any) As Long



Private Sub Command1_Click()

Text2.Text = GetHostNameFromIP(Text1.Text)

End Sub


Private Function SocketsInitialize() As Boolean

Dim WSAD As WSADATA

SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS

End Function


Private Sub SocketsCleanup()

If WSACleanup() <> 0 Then
MsgBox "Windows Sockets error occurred in Cleanup."
vbExclamation
End If

End Sub


Private Function GetHostNameFromIP(ByVal sAddress As String) As String

Dim ptrHosent As Long
Dim hAddress As Long
Dim nbytes As Long

If SocketsInitialize() Then

'convert string address to long
hAddress = inet_addr(sAddress)

If hAddress <> SOCKET_ERROR Then

'obtain a pointer to the HOSTENT structure
'that contains the name and address
'corresponding to the given network address.
ptrHosent = gethostbyaddr(hAddress, 4, AF_INET)

If ptrHosent <> 0 Then

'convert address and
'get resolved hostname
CopyMemory ptrHosent, ByVal ptrHosent, 4
nbytes = lstrlen(ByVal ptrHosent)

If nbytes > 0 Then
sAddress = Space$(nbytes)
CopyMemory ByVal sAddress, ByVal ptrHosent, nbytes
GetHostNameFromIP = sAddress
End If

Else
MsgBox "Call to gethostbyaddr failed."
End If 'If ptrHosent

SocketsCleanup

Else
MsgBox "String passed is an invalid IP."
End If 'If hAddress

Else
MsgBox "Sockets failed to initialize."
End If 'If SocketsInitialize

End Function

Sub test()
MsgBox (GetHostNameFromIP("192.168.1.30"))

End Sub
 
J

JLatham

Joel,
Nice find. I looked for something like that and was not successful. Do you
have the URL for the site?

I've modified it to work off of an Excel sheet vs through a form and tested
with the 32-bit version of Office/Excel under both Vista Home Premium x64 and
Windows 7 Ultimate x64 and it works fine. However, in a virtual machine
running Windows 7 Pro x64 with the Office/Excel 2010 Beta, the code won't
compile and markes all API declarations as errors with this message:

Compiler error:
The code in this project must be updated for use on 64-bit systems.
Please review and update Declare statements and then mark them with
the PtrSafe attribute.

Guess I'll have to dig into the x64 API's and see if I can't figure out how
to change that section, plus I'll have to research the "PtrSafe" attribute,
which the Help in 2010 VBA gave no reference to and couldn't find it on
on-line help either.
 
J

JLatham

I found the cure in a 'pure' 64-bit world.
The VM I have set up (in VMWare's Player) uses 64-bit Windows 7 Ultimate and
the 64-bit Beta version of Office/Excel.
To get the code to run in that environment you have to change all of the
Private Declare
statements to
Private Declare PtrSafe
and then it compiles and runs just fine in the 64-bit world (but not in
32-bit Excel 2007, which doesn't seem to recognize "PtrSafe" at all).
 
J

joel

I did a google search so I wasn't suprized that you easily found th
same site. I would think the fix in excel is to change the declaration
of Long to Double. Long would be 32 bits and double would be 64 bits.
Excel 2007 is still in a 32 bit world and the DLL in windows 7 are 6
bit.
 
C

Chip Pearson

Nice code. Randy Birch's site is a treasure trove. One thing caught my
eye, though.
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte

Since these are 0-based arrays, shouldn't you subtract 1 from the _Len
variables? E.g.,

szDescription(0 To WSADescription_Len - 1) As Byte
szSystemStatus(0 To WSASYS_Status_Len - 1) As Byte

Cordially,
Chip Pearson
Microsoft Most Valuable Professional,
Excel, 1998 - 2010
Pearson Software Consulting, LLC
www.cpearson.com
 
J

joel

Chip : I think you may of found the error. the meory copy could giv
an error if you copy an array that is longer then the amound of memory
delecared for the array. Varptr I have seen used to force an array t
be on a word or double word boundry so the byte count is correct. Ther
is a potential problem is you use memorycopy to copy words or doubl
words and the memory you are copying doesn't lie on an even boundry.

John: Which function in code is failing. I would expect most of th
code is good and ther is just a couple of lirary declarations that ar
wrong.
 
N

nicktruman

Hi Guys
Can I see how you modified the code to work through an excel spreadsheet? I want the output on one sheet but the list is on another in the same workbook. I have the code running without errors now, but as the functions are private I can't call them from within Excel.

Any help would be appreciated

Kind regards, and VERY grateful..
Nic
Here is an interesting statistic from the survey a huge number of self declared internet experts, who have used the internet for more than 6 years, think their ISP is internet explorer or Firefox...
 
N

nicktruman

Hi Joe
Is there a way to speed the program up? I have used a pivot table and reduced the IP list to 400 entries. Where there is no hostname I gt a blank, but it takes 10 minutes to resolve all 400. Does this sound right
Cheer
Nick
 
J

joel

Which instruction are you hanging up at? I tried a few invalid I
addresses with my original posted program and didn't get any hangups.
suspect some of your modifications are causing the problem. Can yo
post your lasted code.

there arre a ffew tests wich you may of left out of the modified code

1) If ptrHosent <> 0 Then
2) If nbytes > 0 Then
 
N

nicktruman

Thanks i will give that a go, it actually took 45 mins for all 400, which can't be right.

Nick
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top