Pacar saya terlibat dalam pembelian di jaringan distribusi. Baru-baru ini, perusahaan telah mengalami pengurangan besar, sehingga jumlah pekerjaan per karyawan telah meningkat secara dramatis. Karena itu, ia harus tetap bekerja, kadang-kadang bahkan keluar pada hari Sabtu. Rekan-rekannya memiliki masalah yang sama.

Tentang keputusan yang memungkinkan pacar saya pulang tepat waktu, Anda dapat membaca di bawah potongan.
Selain itu, sebagian besar dari apa yang mereka lakukan dapat diotomatisasi: menerima data dari depan, mengisi dokumen excel, memperbarui data di depan, dll.
Hal paling masuk akal yang bisa dilakukan dalam situasi ini adalah menulis pernyataan kerja tentang pengembangan fungsionalitas yang diperlukan dan meneruskannya kepada pengembang melalui otoritas. Namun, pengurangan mempengaruhi semua orang, termasuk pengembang. Akibatnya, mereka tidak memiliki sumber daya yang cukup untuk mengimplementasikan otomatisasi ini. Dan perusahaan tidak berencana untuk membeli sistem RPA khusus di masa mendatang.
Selain itu, peningkatan pemantauan terhadap apa yang dilakukan karyawan di tempat kerja dan dalam aplikasi apa mereka bekerja.
Berdasarkan hasil dari semua keadaan yang merugikan ini dan keinginan saya yang luar biasa untuk membantu, saya memutuskan untuk menulis fungsi untuk Excel di VBA, berkat yang memungkinkan untuk mengotomatiskan operasi rutin pacar saya dan rekan-rekannya.
Persyaratan produk
Sebagai titik awal, saya memilih tugas yang menghabiskan sebagian besar waktunya menurut perasaannya. Sebagai bagian dari tugas ini, gadis itu membutuhkan:
- Transfer nomor artikel dari file excel ke bar pencarian sistem front-office;
- Untuk artikel ini, dari hasil pencarian, dapatkan pembelian, harga jual, sejumlah nilai tambahan;
- Memproses data yang dikumpulkan dalam excel untuk membuat harga produk akhir;
- Unggah harga kembali ke sistem.
- Membongkar dan memuat data berikutnya per hari membutuhkan waktu sekitar 3 jam.
Mengingat bahwa pacar saya tidak memiliki pengetahuan pemrograman, maka perlu untuk membuat alat dengan antarmuka yang sederhana dan akrab dalam bentuk fungsi di excel. Urutan tindakan harus didefinisikan hanya sebagai urutan fungsi. Singkatnya,
CIUMAN .
Berdasarkan kasus ini, saya membentuk persyaratan fungsional berikut:
- Kontrol mouse (gerakkan, keystroke) untuk menyorot elemen yang sesuai pada layar;
- Simulasikan penekanan tombol pada keyboard untuk memasukkan data;
- Transfer data dari Excel ke aplikasi pihak ketiga;
- Mengambil data dari aplikasi di Excel;
- Melakukan operasi yang sama saat menarik formula di Excel.
Mouse dan kesulitan pertama
Sebelum memindahkan kursor ke mana saja, Anda harus memahami persis ke mana harus memindahkannya. Menurut saya yang paling tepat dalam situasi ini adalah hanya mengingat posisi kursor ketika elemen tersebut melebihi elemen tertentu. Untuk mengingat koordinat, saya menggunakan fungsi GetCursorPos dari perpustakaan user32.
Nah, kami punya koordinatnya, sekarang akan menyenangkan untuk mengingatnya. Ya, tidak ada yang rumit, saya pikir, hitung saja satu atau dua sel dari sel aktif dan tuliskan koordinat X dan Y. Namun, ActiveCell.Offset (0, 1). Nilai = x tidak berfungsi. Nilai tidak berubah. Dan sebagai akibat dari eksekusi, kesalahan. Setelah memeriksa berbagai asumsi, ternyata bahwa mengubah nilai pada lembar mengarah ke penghitungan ulang seluruh lembar, dan karenanya rumus yang menyebabkan penghitungan ini. Untuk mengatasi pembatasan ini, alih-alih panggilan langsung dari fungsi tindakan tertentu, Anda perlu mengganti panggilan ini dengan Evaluate, yang memungkinkan kami mencapai hasil yang diinginkan.
Hasilnya adalah fungsi PrintCursorPosition (), yang direkam dalam dua sel di sebelah kanan posisi kursor pada saat fungsi dieksekusi. Itu perlu untuk mengetik PrintCursorPosition () di area untuk memasukkan formula, pindahkan kursor dan tekan enter pada keyboard.
Untuk memindahkan mouse, saya menggunakan SetCursorPos dari pustaka user32 yang sama. Untuk menggunakan fungsi ini, ia harus melewati nilai koordinat x dan y yang sebelumnya disimpan sebagai input. Menggunakan SetCursorPosition (x, y), saya dapat memindahkan kursor ke koordinat yang tersimpan sebelumnya. Hasil yang terlihat pertama. Hore!
Untuk mensimulasikan tindakan mouse, saya menggunakan mouse_event dari perpustakaan user32 yang sama. Dengan mengedarkan bendera tombol ke input, saya dapat mensimulasikan penekanan tombol yang sesuai. Awalnya, saya berencana untuk menulis satu fungsi MouseButtonPrees (flag), di mana flag adalah penunjukan tombol yang ditekan, tetapi setelah demonstrasi pertama, gadis itu menyadari bahwa lebih baik untuk mengganti grup fungsi LeftClick (), RightClick () dan DoubleClick (). Pendekatan ini memudahkan untuk membaca fungsi yang dihasilkan.
Keyboard
Di VBA, ada pernyataan SendKeys yang melakukan semua tindakan yang diperlukan. Teks dengan mudah diteruskan ke fungsi dengan merujuk ke sel dan memenuhi tanpa masalah. Namun, menekan tombol khusus (Enter, Tab, Alt, Ctrl, panah keyboard, dll.) Menyebabkan penolakan (untuk menekannya, perlu untuk menuliskannya dalam kurung keriting {ENTER}). Oleh karena itu, untuk yang paling sering digunakan, saya menulis fungsi seperti PressEnter (). Untuk yang jarang digunakan, saya membuat lembar contekan di dokumen yang sama.
Informasi ditransfer antara sistem dan Excel melalui penyalinan ke buffer dan menempel dari buffer. Menyalin ke buffer pada dasarnya dilakukan dengan mensimulasikan menekan Control + C, setelah itu data dari buffer dibawa ke MSForms.DataObject dan dipindahkan ke sel tertentu.
Masalah pengujian dan kinerja
Masalahnya segera dimulai.
Proses penulisan urutan tindakan skrip terdiri dari menyusun kelompok tindakan kecil dan menggabungkannya menjadi satu. Tetapi ketika beralih ke sel bebas, seluruh urutan segera berhasil, yang sangat menjengkelkan, terutama jika waktu yang dibutuhkan untuk kelompok tindakan untuk mengambil lebih dari 10 detik. Untuk mengatasi masalah ini, saya memeriksa keberadaan dalam teks formula dari sel aktif dari nama fungsi. Itu membantu.
Selain itu, selama pengujian, ia menambahkan fungsi tunggu WaitS (detik) dan WaitMS (milidetik), untuk melacak apa yang berhasil dan apa yang tidak. Ini didasarkan pada Sleep dari perpustakaan kernel32. Perbedaan antara WaitS dan WaitMS adalah bahwa dalam waktu WaitMS dalam milidetik, dan dalam WaitS dalam detik.
Masalah lain adalah eksekusi fungsi yang tidak konsisten ketika ditarik ke dalam sel. Ini disebabkan oleh perhitungan Excel yang tidak sinkron. Dia mendistribusikan perhitungan setiap sel ke prosesor yang berbeda. Akibatnya, urutan ini pertama kali dieksekusi di sel dua, lalu di kelima, lalu di ketiga, dll. Selain itu, urutannya sendiri dilakukan dari awal hingga akhir tanpa masalah. Untuk menghilangkan perilaku ini, saya mematikan perhitungan multi-utas di pengaturan Excel (Pengaturan Excel -> Tingkat Lanjut -> Rumus).
Hasil
Setelah menjelaskan cara bekerja dengan semua ini dan belajar cara menggunakannya, ia melepaskan pacarnya untuk mengotomatiskan proses di perusahaan dengan cara yang tidak tahu berterima kasih.
Berkat otomatisasi seperti itu, ternyata mengurangi waktu dari tiga jam menjadi 30 menit. Pada saat yang sama, otomatisasi memungkinkan untuk sedikit mengubah pendekatan pada proses mengunggah dan mengunduh data. Sekarang bongkar muat terjadi pada saat pacar saya pergi makan siang dan memuat di malam hari. Dengan demikian, kita dapat mengatakan bahwa bebannya berkurang hampir setengah hari kerja, yang memungkinkan pacar saya pulang tepat waktu dan kita dapat melakukan lebih banyak hal menarik daripada otomatisasi.