TL; DR - Ini adalah artefak tentang bagaimana Excel menyimpan dan menukar konten sel secara internal. Sel kosong adalah VARIAN tanpa nilai, yang dikonversi ke FALSE karena cara bahasa pemrograman memperlakukan kebenaran dari nilai nol dan bukan nol.
Perilaku AND()
(dan semua fungsi logis lainnya) adalah mengubah kedua argumen menjadi Boolean, kemudian melakukan and
operasi logis pada keduanya. Anda bisa mengupas sampul dan melihat bagaimana itu didefinisikan dalam model objek Excel menggunakan Browser Browser Visual Basic Editor:
Perhatikan bahwa ia mengembalikan a Boolean
, bukan a Variant
. Ini berarti bahwa pada titik tertentu selama proses mengevaluasi fungsi, semua argumen harus dikonversi ke Boolean
s . Perilaku yang diamati sebenarnya menunjukkan bahwa ini dilakukan pada awal dalam pemrosesan - Excel mencoba untuk menjadi ramah pengguna dengan mencoba untuk mengkonversi semua argumen dan menggunakan nilai-nilai yang dikonversi dalam perhitungan jika berhasil. Ini dapat didemonstrasikan dengan mengirimkan String
nilai "Benar" dan "Salah" ke fungsi:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Itu juga dapat didemonstrasikan dengan argumen numerik - itu memperlakukan nilai bukan nol sebagai benar dan nol sebagai salah:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Ini memiliki perilaku yang sama dalam kombinasi:
=AND("false",0) <---Results in FALSE
Etc.
Sekarang Anda harus mendapatkan gambarnya. Jadi bagaimana hubungannya dengan pengujian sel kosong? Jawabannya terletak pada bagaimana Excel menyimpan konten sel secara internal. Sekali lagi, Model Objek Excel mencerahkan:
Perhatikan bahwa ini adalah struktur COM VARIANT . Struktur ini pada dasarnya berisi 2 bagian - tipe, yang memberi tahu kode menggunakannya bagaimana menafsirkannya, dan area data. Sel tanpa konten di Excel akan memiliki "nilai" yang diwakili oleh Variant
dengan sub-tipe VT_EMPTY
. Sekali lagi, ini dapat dikonfirmasi dengan makro:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Jadi apa yang terjadi ketika AND
fungsi mengubahnya menjadi Boolean
? Pertanyaan bagus! Itu salah, mirip dengan bagaimana bahasa pemrograman biasanya memperlakukan nol:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Anda dapat melihat perilaku yang sama dengan menghilangkan argumen sepenuhnya:
=AND(,)
... sama seperti ...
=AND({vbEmpty},{vbEmpty})
... yang sama dengan ...
=AND(0,0)
...yang mana:
=AND(FALSE,FALSE)