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
>
>  
>
>

Kirim email ke