Hai Kurei,
1.Bagaimana mengecek apakah IP yang digunakan masih di komputer yang sama ?
>> Simpan sebuah ipaddress yang mendapat ijin untuk menggunakan file
tersebut di sebuah cell pada sebuah sheet tersembunyi. Misal di sheet
mySetting cell A1
>> Kemudian, pada event workbook open, baca ipaddress komputer yang membuka
file dan bandingkan dengan nilai cell A1 sheet mySetting tadi
>> Jika tidak sama, tutup aplikasi Excel atau close workbook dengan opsi
save change adalah false
2.Bagaimana cara menampilkan IP di cell A1 dengan menggunakan macro ?
>> Karena nomor 1 membutuhkan data ipaddress komputer yang membuka file,
coba gunakan udf GetIP.
Sebelum membahas UDF GetIP, sebaiknya pakai sedikit dongeng dulu (kayanya
udah lama gak men-dongeng....)
*Dongeng *(jangan terlalu dipikirkan)
IPAddress sebuah komputer bisa jadi tidak hanya 1 bijik. Sebaiknya pelajari
lebih dulu tentang duduk perkara IPAddress ini, baik IPAddress yang harus
melalui router atau tidak. Coba jelajahi internet untuk hal ini.
IPAddress sebuah komputer (pada bahasan ini, sebuah komputer yang dimaskud
adalah komputer yang aktif dan bukan komputer client atau remote computer)
bisa didapat dengan banyak cara. Salah satunya adalah dengan membaca tabel
IPAddres melalui fungsi WinAPI bernama GetIpAddrTable.
Deklarasi fungsi tersebut pada dasarnya berbunyi : (scope bisa diatur untuk
private ataupun public)
Declare Function GetIpAddrTable Lib "IPHLPAPI.dll" _
(ByRef pIpAddrTable As* PMIB_IPADDRTABLE*, _
ByRef pdwSize As Long, ByVal border As
Long) As Long
Bagian yang di-merah, membutuhkan suatu deklarasi type data bernama *
PMIB_IPADDRTABLE*
Karena ndak tahu struktur typedata tersebut apa aja, maka diganti saja
dengan tipedata any. Jadi deklarasi bisa diubah menjadi :
Declare Function GetIpAddrTable Lib "IPHLPAPI.dll" _
(ByRef pIpAddrTable As* any*, _
ByRef pdwSize As Long, ByVal border As
Long) As Long
Karena prefix variabel dalam parameter input bernama pIpAddrTable adalah
p, maka variabel ini nanti berisi pointer ke lokasi memory tertentu.
Umumnya, variabel seperti ini berupa variabel bertype byte. Setidaknya,
dalam struktur tipedata buatan bernama *PMIB_IPADDRTABLE *akan ada yang
bertipe byte.
Jadi, variabel pIpAddrTable yang akan menyimpan byte-byte ipaddress.
Sebuah ipaddress table akan berisi byte-byte ip address dengan pola yang
tetap, yaitu :
byte pertama adalah jumlah ip address
byte ke 4 adalah byte pertama ip address pertama
untuk ipv4, berarti sebuah ip address terdiri dari 4 byte
maka byte kedua ip address pertama ada di byte 5 ip address table, dst
sampai byte ke-4 ip address pertama
sebuah ip address umumnya berisi 24 byte, maka ip address kedua (jika ada)
akan terletak di byte ke- (24 + 4 = 28) dalam ip address table.
jika asumsinya sebuah komputer bisa punya maksimal 16 ip address, maka
variabel yang dikirim ke parameter pIpAddrTable
akan diisi dengan 16*24+4 byte, jadi sekitar 388 byte dan harus disusun
dalam array base 0 (jadi array dari 0 sampai 388). dibulatkan seklaian jadi
512 byte saja deh.
Jadi, susunan sebuah IP Address nanti akan berupa :
byte1.byte2.byte3.byte4
Misal untuk IP Address pertama, rujukan ke IP Address Table akan berupa :
byte*4*ipaddrtable.byte*5*ipaddrtable.byte*6*ipaddrtable.byte*7*ipaddrtable.
Sampai disini, dongengnya sudah selesai, karena kalo dilanjutin bisa bikin
ogah belajar VBA.
*Si UDF GetIP()*
Masuk ke pokok masalah, yaitu UDF GetIP
Public Function GetIP(Optional lInput = 0) As Variant
Dim btIPTbl(0 To 511) As Byte
Dim lTblSize As Long, lTblState As Long
Dim lIPAddr As Long, lCount As Long
Dim vRes() As Variant
lTblSize = 512
lTblState = GetIpAddrTable(btIPTbl(0), lTblSize, 1)
If lTblState <> 0 Then
GetIP = CVErr(xlValue)
Exit Function
End If
ReDim vRes(0 To btIPTbl(0) - 1) As Variant 'init array hasil
:: base 0
lCount = btIPTbl(0) 'jumlah ipaddress
If lCount = 0 Then 'tidak ada ipaddress
GetIP = 0
ElseIf lInput = 0 Then 'hasil :: jumlah ip
address
GetIP = lCount
ElseIf lInput > lCount Then 'hasil :: nullstring
GetIP = vbNullString
Else
'set up ip address yang ada jadi sebuah array
'setiap 1 ipaddress, dalam 24 byte (byte_1.byte_2.byte_3.byte_4)
'ipaddress pertama byte_1 mulai di item array 4
For lIPAddr = 1 To lCount 'loop setiap ip
address
vRes(lIPAddr - 1) = btIPTbl((lIPAddr - 1) * 24 + *4*) & "." & _
btIPTbl((lIPAddr - 1) * 24 + *5*) & "." & _
btIPTbl((lIPAddr - 1) * 24 + *6*) & "." & _
btIPTbl((lIPAddr - 1) * 24 + *7*)
Next lIPAddr
'set up hasil fungsi
If lInput < 0 Then 'hasil :: semua ipaddress
sebagai array vertikal 1 dimensi
GetIP = WorksheetFunction.Transpose(vRes)
Else 'hasil ::
ipaddress item tersebut
GetIP = vRes(lInput - 1)
End If
End If
End Function
*Cara pakai di sebuah cell :*
>> Jumlah IPAddress komputer :
=GetIP( 0 )
atau
=GetIP()
(karena input parameter lInput adalah optional dengan default bernilai 0)
:: akan menghasilkan jumlah IPAddress komputer tersebut. Tipedata hasil :
numerik (dalam variabel variant milik fungsi GetIP)
>> Array IP Address - IP Address komputer : (array formula)
=GetIP( -1 )
(nilai -1 bisa diganti dengan sebarang nilai negatif dalam interval tipe
data long [-1 sampai -2 juta sekian] )
:: akan menghasilkan array seluruh IP Address komputer
>> IP Address ke-N :
=GetIP( N )
:: akan menghasilkan IP Address ke-N. Jika N lebih dari jumlah IP Address
yang ada di komputer tersebut, hasilnya akan nullstring.
contoh :
=GetIP( 2 )
"Ambil IP Address ke-2 dari komputer ini"
*Susunan dalam module umum VBA :*
>> ke VBE dan insert sebuah module.
>> Copas script berikut :
*Private *Declare Function GetIpAddrTable Lib "IPHLPAPI.dll" _
(ByRef pIpAddrTable As* any*, _
ByRef pdwSize As Long, ByVal border As
Long) As Long
Public Function GetIP(Optional lInput = 0) As Variant
Dim btIPTbl(0 To 511) As Byte
Dim lTblSize As Long, lTblState As Long
Dim lIPAddr As Long, lCount As Long
Dim vRes() As Variant
lTblSize = 512
lTblState = GetIpAddrTable(btIPTbl(0), lTblSize, 1)
If lTblState <> 0 Then
GetIP = CVErr(xlValue)
Exit Function
End If
ReDim vRes(0 To btIPTbl(0) - 1) As Variant 'init array hasil
:: base 0
lCount = btIPTbl(0) 'jumlah ipaddress
If lCount = 0 Then 'tidak ada ipaddress
GetIP = 0
ElseIf lInput = 0 Then 'hasil :: jumlah ip
address
GetIP = lCount
ElseIf lInput > lCount Then 'hasil :: nullstring
GetIP = vbNullString
Else
'set up ip address yang ada jadi sebuah array
'setiap 1 ipaddress, dalam 24 byte (byte_1.byte_2.byte_3.byte_4)
'ipaddress pertama byte_1 mulai di item array 4
For lIPAddr = 1 To lCount 'loop setiap ip
address
vRes(lIPAddr - 1) = btIPTbl((lIPAddr - 1) * 24 + 4) & "." & _
btIPTbl((lIPAddr - 1) * 24 + 5) & "." & _
btIPTbl((lIPAddr - 1) * 24 + 6) & "." & _
btIPTbl((lIPAddr - 1) * 24 + 7)
Next lIPAddr
'set up hasil fungsi
If lInput < 0 Then 'hasil :: semua ipaddress
sebagai array vertikal 1 dimensi
GetIP = WorksheetFunction.Transpose(vRes)
Else 'hasil ::
ipaddress item tersebut
GetIP = vRes(lInput - 1)
End If
End If
End Function
>> Save workbook dan pastikan ekstensinya : .xls atau .xlsm atau .xlsb atau
di save sebagai sebuah addin [.xla atau .xlam]
Wassalam,
Kid.
2012/8/14 Kurei recca <[email protected]>
> **
>
>
> Salam Para Master Excel,
>
> Saat ini saya sedang coba membuat coding macro password dengan menggunakan
> IP address per komputernya,
> Tujuannya sih agar Jika digunakan di komputer lain tidak bisa karena IP
> Addressnya berbeda.
>
> Pertanyaan saya adalah :
>
> 1.Bagaimana mengecek apakah IP yang digunakan masih di komputer yang sama ?
> 2.Bagaimana cara menampilkan IP di cell A1 dengan menggunakan macro ?
>
> Mohon pencerahannya,
> Terimakasih
>
>
>
>