Iya mas @Gunsir... konsepnya demikian. Sehingga bila baris dibawahnya terhapus, formula dalam definisi nama range tersebut masih aman. Namun perlu diperhatikan, pada formula tersebut:
[1] Baris data setelahnya harus diisi secara berurutan. Bila antar baris ada baris kosong, range yang dihasilkan tidak akan akurat. Coba saja isi sel A3 dengan sembarang nilai, sementara sel A2 dan mulai sel A4 seterusnya kosong, lihat hasilnya.... ;)
[2] Jika baris kedua (sel A2) kosong, formula tersebut akan menghasilkan Null Object, yang jika diakses melalui kode VBA akan menghasilkan error. Oleh karenanya, hati-hati saat merujuk ke nama range dinamis. Solusinya bisa beragam. Bisa menggunakan Error Trapping:
On Error Resume Next
Set rgDinamis = Sheet1.Range("DefinisiRangeDinamis")
If Err.Number Then
... isi dengan baris kode untuk menangani kesalahan ...
End if
Err.Clear
On Error Goto 0
Atau mengubah formula range dinamis menjadi:
=OFFSET(Sheet1!$A$1;1;0;COUNTA(Sheet1!$A:$A);COUNTA(Sheet1!$1:$1))
Syarat formula di atas, baris pertama (sel A1) harus ada nilainya (atau berupa Header Text). Hasilnya akan berupa satu baris kosong, yang di dalam kode VBA dapat diuji dengan:
If Application.WorksheetFunction.CountA([DefinisiRangeDinamis]) = 0 Then
atau:
JumlahBaris = Application.WorksheetFunction.CountA([DefinisiRangeDinamis])
Selain hal tersebut di atas, saya sangat menyarankan agar menghindari rujukan kepada Sheet Object menggunakan baris kode:
Sheets("Nama Tab Sheet")
atau
Worksheets("Nama Tab Sheet")
Jika nama "Nama Tab Sheet" tersebut diubah menjadi "Sheetku" misalnya, akan dapat menyebabkan kesalahan pada program yang kita susun saat baris kode tersebut dieksekusi. Atau repotnya, kita harus mengeksplore kembali satu persatu objek pada VBA Project untuk mengubah acuannya dari "Nama Tab Sheet" menjadi "Sheetku".
Pada VBA Project, setiap Worksheet merupakan Object dengan nama khusus untuk lingkungan VBA Project. Tidak sama dengan nama pada tab sheet (Sheet Title). Lihat gambar berikut:
Nama Sheet Object pada jendela Property ada pada properti (Name), sedangkan Sheet Title ada pada properti Name (tanpa tanda buka dan tutup kurung). Meski Sheet Title berubah-ubah, name Sheet Object tidak, karena hanya bisa diubah melalui jendela VBE pada saat Design Time. Bila ingin membuat nama Sheet Object yang lebih berarti, kita bisa mengubahnya melalui properti tersebut, misalkan dari Sheet4 menjadi shtRequiredItems. Dan pada baris kode, akan lebih singkat jika kita menulis:
Shee4.Range("A1:A5")
shtRequiredItems.Range("A1:A5")
daripada harus menulis:
Worksheets("Sheet1").Range("A1:A5")
Worksheets("Reuired Items").Range("A1:A5")
dan tentunya lebih aman dari kesalahan ... kecuali Sheet Object-nya dihapus... :D Demikian pengalaman yang bisa saya bagikan... ;)