Tentukan apakah Popup ada di latar depan Excel

Saya sedang menulis add-in VSTO untuk Excel dan saya perhatikan bahwa jika saya mengunci lembar dan melindunginya dengan kata sandi (jadi hanya add-in saya yang dapat menulisnya tetapi pengguna dapat melihatnya), jika pengguna mencoba mengedit lembar tersebut mereka mendapatkan popup "Lembar ini terkunci". Jika saat perintah tersebut masih menunggu masukan pengguna, add-in mencoba menulis ke lembar, Excel mengalami crash. Tindakan menulis ke sheet melibatkan membuka proteksinya, menulis data, lalu menguncinya kembali. Add-in menangkap data dari sumber eksternal melalui port serial sehingga data dapat ditulis kapan saja.

Untuk membuat ulang: 1. Kunci lembar dengan add-in. 2. Pengguna mencoba mengedit isi lembar 3. Pengguna diberitahu bahwa mereka tidak dapat mengedit isi lembar karena terkunci. 4. Data masuk dalam port serial dan add-in mencoba membuka kunci, menulis data, dan mengunci lembar sebelum pengguna sempat menerima perintah yang diberikan. 5. Excel menghapuskan debu.

Ada saran? Saya bermain-main dengan gagasan untuk mempertahankan lembar "master" yang tersembunyi dan lembar yang terlihat dan hanya menggunakan rumus excel atau rentang bernama untuk mereferensikan lembar yang tersembunyi. Namun hal ini akan terbuka terhadap pengeditan dan potensi kerusakan data oleh pengguna. Data harus sedapat mungkin tidak dapat diedit.

Pembaruan: Saya akan puas dengan menangkap COMException sehingga tidak mematikan Excel, namun "catch (Exception ex)" yang umum sepertinya tidak membantu.


person Pete Garafano    schedule 28.12.2011    source sumber


Jawaban (4)


Di VBA Anda dapat melindungi lembar dengan UserInterFaceOnly:=True. Ini berarti kode masih dapat ditulis ke sheet. Dari tautan ini sepertinya hal ini juga berlaku pada add-on VSTO.

person Doug Glancy    schedule 29.12.2011
comment
Saya sudah menyetel UserInterFaceOnly = true, namun jika pengguna masih mencoba mengedit formulir dengan cara tertentu, kotak kesalahan akan muncul sehingga pengguna harus mengklik OK sebelum kode saya dapat terus dijalankan tanpa mengeluarkan COMException. - person Pete Garafano; 29.12.2011

Anda dapat memberi tanda centang untuk memastikan lembar dalam mode interaktif atau sel aktif bukan nol, jika pemeriksaan gagal keluar dari fungsi yang melakukan operasi tulis

 private bool IsExcelInteractive()
    {
        try
        {
            Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
            return true;
        }
        catch
        {
            return false;
        }
    }
person Brijesh Mishra    schedule 29.12.2011

Tampaknya masalahnya adalah

catch(Exception)

tidak berfungsi sebagai penampung umum ketika menyangkut COMException. Menambahkan garis

using System.Runtime.InteropServices;

dan kemudian menambahkan

catch(COMException)

pada blok try...catch saya memungkinkan saya menangani kesalahan dengan lebih baik. Campurkan itu dengan beberapa kode untuk mencoba kembali tindakan yang gagal beberapa kali setelah digunakan

SendKeys.SendWait("{ESC}");

tampaknya membuat segalanya lebih baik. Namun, mengirimkan kunci escape secara membabi buta ke program terdepan dapat menyebabkan beberapa masalah, namun saya tidak bisa duduk diam tanpa henti menunggu pengguna yang mungkin atau mungkin tidak memperhatikan untuk menyelesaikan masalah di layar. Tampaknya menyebabkan port serial berhenti melakukan buffering data dan menjatuhkannya begitu saja jika tidak ditangani dengan cukup cepat.

person Pete Garafano    schedule 29.12.2011

Daripada melakukan operasi ini dengan mengklik sel, bisakah Anda menambahkan tombol di pita dan dengan mengkliknya lakukan tugas ini, cara ini akan menghilangkan jendela pop up

person Brijesh Mishra    schedule 30.12.2011
comment
Masalahnya adalah saya melakukan tugas di latar belakang tanpa campur tangan pengguna. Ini sedang memproses data yang masuk di port serial. Datanya tidak terjadwal, jadi jika pengguna berinteraksi dengan excel, mis. memiliki sel yang terbuka untuk diedit (atau mencoba melakukannya, tetapi tidak bisa karena sel saya terkunci) dan add-in VSTO mencoba berinteraksi dengan Excel, add-in tersebut gagal dan menguntungkan pengguna. Lihat jawaban saya untuk trik yang saya buat untuk mengatasi masalah ini. - person Pete Garafano; 04.01.2012