TLDR: Saya sedang menulis dan menguji skrip dari VBA tetapi akhirnya dieksekusi sebagai satu file .bas dari aplikasi desktop utama.

Referensi DLL hilang dari VBA ke bas yang memaksa saya untuk mendefinisikan tipe anggota aplikasi sebagai "objek" alih-alih tipe asli mereka di file .bas.

Bisakah saya menghindari mengonversi kode terikat awal ke terikat akhir dengan mendefinisikan referensi dalam file bas?


Info lebih lanjut: Saya perlu mengonversi skrip vba ke skrip dasar yang dapat dijalankan oleh perangkat lunak. Apakah ada di dalam skrip dasar untuk mereferensikan file tlb? Saya memanggil aplikasi menggunakan set app = CreateObject("...") Contoh menunjukkan semua yang diketik sebagai "objek" dalam contoh mereka yang tidak memberikan intellisense dari VBA (tentu saja)

Apakah mungkin untuk mereferensikan enum sebagai nilai teksnya tanpa mengubahnya kembali ke nilai integernya? Juga, apakah ada cara untuk mengetik objek aplikasi dengan benar daripada menggunakan object dalam skrip dasar?

1
GisMofx 15 Desember 2017, 18:25

1 menjawab

Jawaban Terbaik

Bisakah saya menghindari mengonversi kode terikat awal ke terikat akhir dengan mendefinisikan referensi dalam file bas?

Tidak, Anda tidak bisa. File .bas tidak berisi metadata seperti itu. Faktanya, satu-satunya metadata yang dimilikinya, adalah nama modul, disimpan sebagai atribut VB_Name tersembunyi yang digunakan VBE untuk mengisi properti Name modul.

Referensi milik objek VBProject; jika Anda ingin file .bas berdiri sendiri dan dapat dieksekusi di luar VBE melalui runtime VBScript, maka Anda harus mengonversi kode terikat awal menjadi terikat akhir.

Ini berarti Anda benar-benar kehilangan intellisense, karena semua tipe yang didefinisikan dalam pustaka batas akhir itu sekarang harus dideklarasikan sebagai Object, dan nilai enum perlu dikonversi ke nilai integer yang mendasarinya.

Atau Anda dapat menentukan konstanta nama yang sama untuk enum ini, dan menyimpan namanya:

Private Const SomeEnumValue As Long = 42

Atau, [kembali] tentukan sendiri enumnya:

Private Enum SoneEnum
    SomeEnumValue = 42
    '...
End Enum
1
Mathieu Guindon 15 Desember 2017, 16:17