{"id":374962,"date":"2024-05-21T06:13:04","date_gmt":"2024-05-21T06:13:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=374962"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=374962","title":{"rendered":"<span>VBA \u043c\u0430\u043a\u0440\u043e\u0441\u044b. \u041e\u0442 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0438\u0446\u044b \u043a \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u043c\u0443. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/810289\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>, \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u043b\u044c \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u044f, \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u044f\u0434\u0440\u043e \u2013 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<br \/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, <code>SettingsForm<\/code>, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0421\u0430\u043c\u0443 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0432\u0441\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441 \u043d\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <strong>UI<\/strong>.<\/p>\n<h3>\u041d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b<\/h3>\n<p>\u042f, \u043e\u0431\u044b\u0447\u043d\u043e, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0444\u043e\u043d \u043d\u0430 <strong>Button Face<\/strong>, \u0448\u0440\u0438\u0444\u0442 <strong>Segoe UI 9pt<\/strong>. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0448\u0440\u0438\u0444\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0444\u043e\u0440\u043c\u044b, \u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0435\u0433\u043e \u0434\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e Frame, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u043e\u0440\u043c\u044b.<br \/>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/99a\/3fc\/3a5\/99a3fc3a573874811b2e772587acdcb3.png\" alt=\"\u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\" title=\"\u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\" width=\"655\" height=\"424\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/99a\/3fc\/3a5\/99a3fc3a573874811b2e772587acdcb3.png\"\/><\/p>\n<div><figcaption>\u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<p>\u042f \u0435\u0449\u0435 \u043b\u044e\u0431\u043b\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0430 \u0444\u043e\u0440\u043c\u044b. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u0430 \u0444\u043e\u0440\u043c\u0430 (\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438 \u0442.\u0434.), \u0438\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445.<br \/>\u0415\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438 \u0438\u043a\u043e\u043d\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<br \/>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e (\u0444\u043e\u0440\u043c\u0430\u0442 png):<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/938\/3df\/ea3\/9383dfea39eed89cc11bd3bf5ae1a6ca.png\" alt=\"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709\" title=\"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709\" width=\"128\" height=\"128\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/938\/3df\/ea3\/9383dfea39eed89cc11bd3bf5ae1a6ca.png\"\/><\/p>\n<div><figcaption>\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709\" rel=\"noopener noreferrer nofollow\">https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709<\/a><\/figcaption><\/div>\n<\/figure>\n<h4>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043b\u0430\u0439\u0444\u0445\u0430\u043a<\/h4>\n<p>UserForm \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 png, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0443 \u043d\u0430\u0441 \u0438\u043a\u043e\u043d\u043a\u0430. \u0422\u0430\u043a \u0436\u0435, \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u042f \u043d\u0430\u0448\u0435\u043b \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u0430\u043a \u0443\u0431\u0438\u0442\u044c \u0434\u0432\u0443\u0445 \u0437\u0430\u0439\u0446\u0435\u0432 \u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043d\u0430 \u043b\u0438\u0441\u0442 Excel. \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u0443\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e47\/8ab\/509\/e478ab509b8a0c642b20dc7b1f591551.png\" alt=\"\u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\" title=\"\u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438\" width=\"547\" height=\"356\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e47\/8ab\/509\/e478ab509b8a0c642b20dc7b1f591551.png\"\/><\/p>\n<div><figcaption>\u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<\/li>\n<li>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0415\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 (Image) \u0432 \u0444\u043e\u0440\u043c\u0435. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e: 1.57\u04451.57 \u0441\u043c<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0435\u043b\u044f\u043c \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Ctrl+C<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0444\u043e\u0440\u043c\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <strong>Image<\/strong>, \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0444\u043e\u043d (fmBorderStyleNone, fmBackStyleTransparent). \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e 42\u044542.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043c\u044b\u0448\u043a\u043e\u0439 \u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0443\u043d\u043a\u0442 Picture \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Ctrl+V \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3a0\/2ee\/34a\/3a02ee34a5b8b51a19f8c7efb71c4f67.png\" alt=\"\u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (Bitmap)\" title=\"\u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (Bitmap)\" width=\"415\" height=\"485\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a0\/2ee\/34a\/3a02ee34a5b8b51a19f8c7efb71c4f67.png\"\/><\/p>\n<div><figcaption>\u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (Bitmap)<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u043e\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2fa\/a4b\/ffc\/2faa4bffc0a0b2e047d2f7c6ebdc45a6.png\" width=\"655\" height=\"424\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2fa\/a4b\/ffc\/2faa4bffc0a0b2e047d2f7c6ebdc45a6.png\"\/><\/figure>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435 \u0445\u0438\u0442\u0440\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439, \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/55f\/14f\/3aa\/55f14f3aa1b21042dc9722b12031afa8.png\" alt=\"\u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0430\u043f\u043a\u0438: https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664\" title=\"\u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0430\u043f\u043a\u0438: https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664\" width=\"655\" height=\"471\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/55f\/14f\/3aa\/55f14f3aa1b21042dc9722b12031afa8.png\"\/><\/p>\n<div><figcaption>\u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0430\u043f\u043a\u0438: <a href=\"https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664\" rel=\"noopener noreferrer nofollow\">https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664<\/a><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/169\/3cd\/7a4\/1693cd7a445454b342e659df84d16551.png\" alt=\"\u0442\u0440\u0435 \u043c\u0430\u043d\u0438\u0444\u0438\u043a\u044c\" title=\"\u0442\u0440\u0435 \u043c\u0430\u043d\u0438\u0444\u0438\u043a\u044c\" width=\"226\" height=\"226\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/169\/3cd\/7a4\/1693cd7a445454b342e659df84d16551.png\"\/><\/p>\n<div><figcaption>\u0442\u0440\u0435 \u043c\u0430\u043d\u0438\u0444\u0438\u043a\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u044f\u043b\u043e \u043c\u0438\u043d\u0443\u0442 5-10. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a\u0438\u0445 \u043e\u043a\u043e\u043d \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0431\u044c\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430.<\/p>\n<p>\u0412\u043d\u0438\u0437\u0443 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043a\u043d\u043e\u043f\u043a\u0443. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u043c\u0435\u043d\u044f\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0430 \u043d\u0435 \u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c, \u043e\u0442\u0442\u0435\u043d\u0438\u043b \u0444\u043e\u043d. \u0421\u0442\u0438\u043b\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 flat. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0435\u043d\u0435\u0435 \u0443\u0433\u043b\u043e\u0432\u0430\u0442\u043e, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439. \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u043a\u0443\u0441\u043e\u0432\u0449\u0438\u043d\u0430.<\/p>\n<p>\u0417\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0444\u043e\u0440\u043c\u044b \u044f \u0432\u044b\u043d\u0435\u0441 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <code>Cancel = True<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0438 Esc, \u0447\u0442\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c. \u0422\u0430\u043a \u0432\u043e\u0442 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 Esc \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Click event \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e. \u041d\u0430 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u044b \u0432\u0435\u0448\u0430\u0435\u043c <code>Unload Me<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0438 \u043a\u0430\u0439\u0444\u0443\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 Esc.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/505\/d3c\/677\/505d3c6776446e00853feb393ce5f856.png\" alt=\"\u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\" title=\"\u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\" width=\"1092\" height=\"473\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/505\/d3c\/677\/505d3c6776446e00853feb393ce5f856.png\"\/><\/p>\n<div><figcaption>\u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0444\u043e\u0440\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"vbscript\">Private Sub CloseCommandButton_Click()     Unload Me ' \u0412\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u043e\u0440\u043c\u0443 End Sub<\/code><\/pre>\n<h3>Config<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 Excel. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f).<\/p>\n<p>\u041c\u043e\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/690298\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0430 habr \u043a\u0430\u043a \u0440\u0430\u0437 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0448\u0435\u043b \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0445\u0440\u0430\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 VBA. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b),  \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443 \u043d\u0435 \u0441\u0431\u0438\u0432\u0430\u044f \u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u044f \u043b\u044e\u0431\u043b\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9db\/52c\/3a2\/9db52c3a27aabd596b5722bf5919b810.png\" width=\"697\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9db\/52c\/3a2\/9db52c3a27aabd596b5722bf5919b810.png\"\/><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <code>Config<\/code> \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <a href=\"https:\/\/t.me\/vban_diary\/97\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>), \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c ConfigCstr Public Function NewConfig(ByVal AppName As String) As Config     Set NewConfig = New Config     NewConfig.SetAppName AppName End Function   ' \u041a\u043b\u0430\u0441\u0441 Config Private Type TConfig     AppName As String     Section As String End Type  Private this As TConfig  Public Function SetAppName(ByVal Name As String) As Config     this.AppName = Name     Set SetAppName = Me End Function  Public Function SetSection(ByVal Name As String) As Config     this.Section = Name     Set SetSection = Me End Function  Public Sub SetValue(ByVal Key As String, ByVal Value As String)     CheckSettings      SaveSetting this.AppName, this.Section, Key, Value End Sub  Public Function GetValue( _     ByVal Key As String, _     Optional ByVal DefaultValue As Variant = Empty, _     Optional ByVal CastType As VbVarType = VbVarType.vbString _ ) As Variant     CheckSettings      GetValue = Cast(GetSetting(this.AppName, this.Section, Key, DefaultValue), CastType) End Function  Private Sub CheckSettings()     If Len(this.AppName) = 0 Then Err.Raise 91, TypeName(Me), \"\u041d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f AppName.\"     If Len(this.Section) = 0 Then Err.Raise 91, TypeName(Me), \"\u041d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f Section.\" End Sub  Private Function Cast(ByVal Value As Variant, ByVal CastType As VbVarType) As Variant     Select Case CastType     Case vbString: Cast = CStr(Value)     Case vbBoolean         On Error Resume Next         Cast = CBool(Value)         Cast = iif(Err.Number = 0, Cast, false)     End Select End Function<\/code><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>Set<\/code> \u0438 <code>Get<\/code> <code>Value<\/code>, \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043a\u043b\u0430\u0441\u0441\u0430, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443, \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"vbscript\">Config.SetAppName(\"SomeApp\").SetSection(\"Section\").SetValue \"SomeKey\", \"SomeValue\"<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 <code>CheckSettings<\/code> \u0438 <code>Cast<\/code>. <br \/>\u041f\u0435\u0440\u0432\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0438\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0435\u043a\u0446\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043a\u0443\u0434\u0430 \u043c\u044b \u0432\u043d\u043e\u0441\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0445 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u043e, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0435\u043b\u0438 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041a\u043e\u043d\u0444\u0438\u0433 \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u0442\u0443 \u0440\u043e\u043b\u044c.<\/p>\n<p><code>Cast<\/code> \u2013 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u043b\u0438\u0431\u043e \u0442\u0438\u043f\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 enum <code>VbVarType<\/code> \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 boolean \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0435, \u0442\u0430\u043a \u043a\u0430\u043a, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, null \u0438\u043b\u0438 &#171;&#187; \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 boolean, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>False<\/code>.<\/p>\n<p>\u041d\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u0443\u0434\u0430 \u0436 \u0431\u0435\u0437 \u043d\u0435\u0435.<\/p>\n<h3>FormController<\/h3>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0444\u043e\u0440\u043c\u044b \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u043e\u0440\u043c\u044b, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0443\u0436\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0448\u0430\u043d\u0438\u043d\u0435 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>SettingsFormController<\/code> (\u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c, \u0435\u0441\u0435\u0441\u0441\u043d\u043e):<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c SettingsFormControllerCstr Public Function NewSettingsFormController(ByRef Form As MSForms.UserForm, ByRef Config As Config) As SettingsFormController     Set NewSettingsFormController = New SettingsFormController     Set NewSettingsFormController.Form = Form     Set NewSettingsFormController.Config = Config End Function   ' \u041a\u043b\u0430\u0441\u0441 SettingsFormController Private Type TSettingsFormController     Config As Config     Form As MSForms.UserForm End Type  Private this As TSettingsFormController  Public Property Set Config(ByVal RHS As Config)     Set this.Config = RHS End Property  Public Property Set Form(ByVal RHS As MSForms.UserForm)     Set this.Form = RHS End Property  Public Sub LoadValues()     Dim Control As MSForms.Control     For Each Control In this.Form.Controls         If Strings.Len(Control.Tag) = 0 Then GoTo Continue          Dim CastType As VbVarType         If IsTextBox(Control) Then             CastType = vbString         ElseIf IsOptionButton(Control) Then             CastType = vbBoolean         Else             GoTo Continue         End If          Dim Value As Variant         Value = this.Config.GetValue(Control.Tag, CastType:=CastType)         If IsEmpty(Value) Then GoTo Continue         Control.Value = Value Continue:     Next End Sub  Public Sub SaveValues()     Dim Control As MSForms.Control     For Each Control In this.Form.Controls         If Not IsTextBox(Control) _         And Not IsOptionButton(Control) Then GoTo Continue          Me.SaveValue Control Continue:     Next End Sub  Public Sub SaveValue(ByRef Control As Control)     this.Config.SetValue Control.Tag, Control.Value End Sub<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u0434\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <strong>TextBox<\/strong> \u0438 <strong>OptionButton<\/strong>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 <code>Utils<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"vbscript\">Public Function IsTextBox(ByVal Control As MSForms.Control) As Boolean     IsTextBox = TypeName(Control) = \"TextBox\" End Function  Public Function IsOptionButton(ByVal Control As MSForms.Control) As Boolean     IsOptionButton = TypeName(Control) = \"OptionButton\" End Function<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2013 \u0442\u044d\u0433\u0438. \u0418\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c FormTags Public Const FilePath As String = \"FilePath\" Public Const GT20Collector As String = \"GT20Collector\" Public Const LT20Collector As String = \"LT20Collector\"<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 \u0444\u043e\u0440\u043c\u044b, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:<\/p>\n<pre><code class=\"vbscript\">Private Type TSettingsForm     Controller As SettingsFormController End Type  Private this As TSettingsForm  Private Sub UserForm_Initialize()     SetTags      Set this.Controller = NewSettingsFormController( _         Form:=Me, _         Config:=NewConfig(Constants.APP_NAME_ENG).SetSection(\"Settings\") _     )      this.Controller.LoadValues End Sub  Private Sub SetTags()     Me.FilePathTextBox.Tag = FormTags.FilePath     Me.GT20OptionButton.Tag = FormTags.GT20Collector     Me.LT20OptionButton.Tag = FormTags.LT20Collector End Sub  Private Sub SelectFilePathCommandButton_Click()     Dim Path As Variant     Path = Application.GetOpenFilename( _         Title:=\"\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u043e\u0442\u0447\u0435\u0442\u0430\", _         FileFilter:=\"Excel \u0424\u0430\u0439\u043b\u044b (*.xls*), *.xls*\" _     )      If IsBoolType(Path) Then Exit Sub     Me.FilePathTextBox.Value = Path End Sub  Private Sub RunCommandButton_Click()     this.Controller.SaveValues     App.Main     Unload Me End Sub  Private Sub CloseCommandButton_Click()     Unload Me End Sub   ' \u041c\u043e\u0434\u0443\u043b\u044c Utils Public Function IsBoolType(ByVal Value As Variant) As Boolean     IsBoolType = VarType(Value) = vbBoolean End Function<\/code><\/pre>\n<ol>\n<li>\n<p>\u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u044d\u0433\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0430\u043c\u0443 \u0444\u043e\u0440\u043c\u0443 \u043f\u043b\u044e\u0441 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u0443\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0435\u0439 <strong>Settings<\/strong> (\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0436\u0435, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>SetSection<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e <code>Config<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430?). \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 <code>GetOpenFileName<\/code> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0435\u0441\u043b\u0438 boolean \u2013 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u0442.\u043a. \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0436\u0430\u043b \u043a\u043d\u043e\u043f\u043a\u0443 \u041e\u0442\u043c\u0435\u043d\u0430. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 TextBox \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 <strong>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c<\/strong>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>Main<\/code> \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0438 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0438 \u0432\u044b\u0431\u0440\u0430\u043d \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0441\u0431\u043e\u0440\u0449\u0438\u043a:<\/p>\n<pre><code class=\"vbscript\">' \u041a\u043b\u0430\u0441\u0441 SettingsFormController Public Function IsPrepairedToRun(ParamArray Controls() As Variant) As TCheckResult     Dim OptionSelected As Boolean      Dim Control As Variant     For Each Control In Controls         If IsTextBox(Control) Then             If Strings.Len(Control.Value) = 0 Then                 IsPrepairedToRun.HasError = True                 IsPrepairedToRun.Message = \"\u041d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.\"                 Exit Function             ElseIf Not NewFileSystemObject().FileExists(Control.Value) Then                 IsPrepairedToRun.HasError = True                 IsPrepairedToRun.Message = \"\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"                 Exit Function             End If         ElseIf IsOptionButton(Control) Then             If Not OptionSelected Then OptionSelected = Control.Value         Else             GoTo Continue         End If Continue:     Next      If Not OptionSelected Then         IsPrepairedToRun.HasError = True         IsPrepairedToRun.Message = \"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d \u043d\u0438 \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u0441\u0431\u043e\u0440\u043a\u0438.\"     End If End Function<\/code><\/pre>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 TextBox \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e \u0438 \u0442\u043e \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 OptionButton \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e OptionSelected \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 True \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0432\u044b\u0431\u0440\u0430\u043d \u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0444\u043e\u0440\u043c\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c:<\/p>\n<pre><code class=\"vbscript\">Private Sub RunCommandButton_Click()     this.Controller.SaveValues      Dim Check As TCheckResult     Check = this.Controller.IsPrepairedToRun( _         Me.FilePathTextBox, _         Me.GT20OptionButton, _         Me.LT20OptionButton _     )      If Check.HasError Then         MsgBox Check.Message, vbExclamation, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\"         Exit Sub     End If      App.Main     Unload Me End Sub<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/290\/1d0\/611\/2901d0611782ab72ec5589ce2239e2c3.png\" alt=\"\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f\" title=\"\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f\" width=\"699\" height=\"754\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/290\/1d0\/611\/2901d0611782ab72ec5589ce2239e2c3.png\"\/><\/p>\n<div><figcaption>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/57a\/ef7\/1d4\/57aef71d43291e45e8a4c99c5312a713.png\" width=\"500\" height=\"500\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57a\/ef7\/1d4\/57aef71d43291e45e8a4c99c5312a713.png\"\/><\/figure>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<h3>\u0414\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443<\/h3>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <code>FilePath<\/code> \u0438 <code>Kind<\/code>.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c <code>Config<\/code> \u0432 <code>Main<\/code> \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435. \u0421 <code>FilePath<\/code> \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u0430 \u0432\u043e\u0442 \u0434\u043b\u044f \u0442\u0438\u043f\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043e\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>CollectorTypes<\/code>:<\/p>\n<pre><code class=\"vbscript\">Public Enum CollectorKind     GT20     LT20 End Enum  Public Function GetCollectorKind(ByRef Config As Config) As CollectorKind     If Config.GetValue(FormTags.GT20Collector, CastType:=vbBoolean) Then         GetCollectorKind = GT20     ElseIf Config.GetValue(FormTags.LT20Collector, CastType:=vbBoolean) Then         GetCollector = LT20     Else         Err.Raise 9, \"GetCollectorKind\", \"\u0412\u044b\u0431\u0440\u0430\u043d \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430.\"     End If End Function<\/code><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0437\u0434\u0435\u0441\u044c? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0432 enum, \u043c\u044b \u0442\u0443\u0442 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0423\u0434\u043e\u0431\u043d\u043e \u0436\u0435.<\/p>\n<h3>\u041f\u0430\u0440\u0430 \u0448\u0442\u0440\u0438\u0445\u043e\u0432<\/h3>\n<p>\u042d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043a\u0443 \u043e <strong>DEV<\/strong> \u0440\u0435\u0436\u0438\u043c\u0435. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043d\u043e \u044f \u043b\u044e\u0431\u043b\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c <code>MsgBox<\/code> \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 <code>Main<\/code> (\u0447\u0442\u043e\u0431\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0441\u0435\u0431\u0435 \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c) \u0438 \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043a\u043d\u0438\u0433\u0438 (\u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443 dev-\u0432\u0435\u0440\u0441\u0438\u044e):<\/p>\n<pre><code class=\"vbscript\">' \u042d\u0442\u0430\u041a\u043d\u0438\u0433\u0430 Private Sub Workbook_BeforeClose(Cancel As Boolean)     #If DEV Then         Dim Confirm As VbMsgBoxResult         Confirm = MsgBox( _             \"\u041a\u043d\u0438\u0433\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?\", _             vbQuestion + vbYesNo, _             \"DEV MODE\" _         )         Cancel = Confirm = vbNo     #End If End Sub  ' \u041c\u043e\u0434\u0443\u043b\u044c App Public Sub Main()     On Error GoTo Catch      #If DEV Then         MsgBox \"\u041c\u0430\u043a\u0440\u043e\u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\", vbInformation, \"DEV MODE\"     #End If      Utils.DisableSettings   ' .... End Sub<\/code><\/pre>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ActiveX, \u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b, \u0430 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0441\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/816\/434\/0a3\/8164340a3fc74a789847ce14d85d9827.png\" width=\"376\" height=\"327\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/816\/434\/0a3\/8164340a3fc74a789847ce14d85d9827.png\"\/><\/figure>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c ButtonHandlers '@Folder(\"GoodsCollectorProject.src.UI\") Option Explicit  Public Sub ShowSettings_Click()     SettingsForm.Show End Sub<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u0441\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u043b\u0438\u0448\u043d\u0435\u0435 \u0438 \u0432\u044b\u0434\u044b\u0445\u0430\u0442\u044c, \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bfd\/1c9\/b90\/bfd1c9b90da288ff3b2fece845423bb0.png\" width=\"731\" height=\"851\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfd\/1c9\/b90\/bfd1c9b90da288ff3b2fece845423bb0.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b23\/a59\/b23\/b23a59b23a529993b5d38e1034063e5b.png\" width=\"612\" height=\"408\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b23\/a59\/b23\/b23a59b23a529993b5d38e1034063e5b.png\"\/><\/figure>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0448 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0431\u041e\u043b\u044c\u0448\u0443\u044e \u0435\u0433\u043e \u0447\u0430\u0441\u0442\u044c \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c. \u0422\u0430\u043a \u0436\u0435, \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0435\u043b \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25e\/aad\/4f4\/25eaad4f4639c9ea73ed23e11a30fe04.png\" width=\"644\" height=\"976\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/25e\/aad\/4f4\/25eaad4f4639c9ea73ed23e11a30fe04.png\"\/><\/figure>\n<details class=\"spoiler\">\n<summary>\u0411\u043e\u043d\u0443\u0441, \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0435\u0437 Rubberduck<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f26\/2b4\/d74\/f262b4d74801b00c1275997fc9740d35.png\" width=\"367\" height=\"709\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f26\/2b4\/d74\/f262b4d74801b00c1275997fc9740d35.png\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430! ?<\/strong> \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438 \u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438:\u00a0<a href=\"https:\/\/github.com\/artemdorozhkin\/vba-macro-refact\" rel=\"noopener noreferrer nofollow\"><strong>GitHub<\/strong><\/a><\/p>\n<p>\u041c\u043e\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c:\u00a0<a href=\"https:\/\/t.me\/VBAn_Diary\" rel=\"noopener noreferrer nofollow\"><strong>\u0414\u043d\u0435\u0432\u043d\u0438\u043a VBA\u0448\u043d\u0438\u043a\u0430<\/strong><\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/811099\/\"> https:\/\/habr.com\/ru\/articles\/811099\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/810289\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438<\/a>, \u0447\u0435\u0440\u0435\u0437 \u0431\u043e\u043b\u044c \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u044f, \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u044f\u0434\u0440\u043e \u2013 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<br \/>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430, <code>SettingsForm<\/code>, \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0421\u0430\u043c\u0443 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0432\u0441\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441 \u043d\u0435\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <strong>UI<\/strong>.<\/p>\n<h3>\u041d\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044b<\/h3>\n<p>\u042f, \u043e\u0431\u044b\u0447\u043d\u043e, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0444\u043e\u043d \u043d\u0430 <strong>Button Face<\/strong>, \u0448\u0440\u0438\u0444\u0442 <strong>Segoe UI 9pt<\/strong>. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0448\u0440\u0438\u0444\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0444\u043e\u0440\u043c\u044b, \u044f \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0435\u0433\u043e \u0434\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e Frame, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u043e\u0440\u043c\u044b.<br \/>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440<\/figcaption><\/div>\n<\/figure>\n<p>\u042f \u0435\u0449\u0435 \u043b\u044e\u0431\u043b\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0430 \u0444\u043e\u0440\u043c\u044b. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u0430 \u0444\u043e\u0440\u043c\u0430 (\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438 \u0442.\u0434.), \u0438\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u0430, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445.<br \/>\u0415\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u043c\u0438 \u0438\u043a\u043e\u043d\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<br \/>\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e (\u0444\u043e\u0440\u043c\u0430\u0442 png):<\/p>\n<figure class=\"\">\n<div><figcaption>\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709\" rel=\"noopener noreferrer nofollow\">https:\/\/www.flaticon.com\/free-icon\/filtering_10061709?term=filtering&amp;page=1&amp;position=34&amp;origin=search&amp;related_id=10061709<\/a><\/figcaption><\/div>\n<\/figure>\n<h4>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043b\u0430\u0439\u0444\u0445\u0430\u043a<\/h4>\n<p>UserForm \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 png, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0443 \u043d\u0430\u0441 \u0438\u043a\u043e\u043d\u043a\u0430. \u0422\u0430\u043a \u0436\u0435, \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u042f \u043d\u0430\u0448\u0435\u043b \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431, \u043a\u0430\u043a \u0443\u0431\u0438\u0442\u044c \u0434\u0432\u0443\u0445 \u0437\u0430\u0439\u0446\u0435\u0432 \u0440\u0430\u0437\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u0412\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043d\u0430 \u043b\u0438\u0441\u0442 Excel. \u0412 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043f\u0443\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<\/li>\n<li>\n<p>\u041c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0415\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 (Image) \u0432 \u0444\u043e\u0440\u043c\u0435. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e: 1.57\u04451.57 \u0441\u043c<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0434\u0435\u043b\u044f\u043c \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Ctrl+C<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u0444\u043e\u0440\u043c\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <strong>Image<\/strong>, \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0444\u043e\u043d (fmBorderStyleNone, fmBackStyleTransparent). \u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e 42\u044542.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043c\u044b\u0448\u043a\u043e\u0439 \u0434\u0435\u043b\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0443\u043d\u043a\u0442 Picture \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Ctrl+V \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430:<\/p>\n<figure class=\"\">\n<div><figcaption>\u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (Bitmap)<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c, \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u043e\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0438\u0442.<\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><\/figure>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435 \u0445\u0438\u0442\u0440\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439, \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a\u043e\u0435 \u043e\u043a\u043d\u043e (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443):<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0438\u043a\u043e\u043d\u043a\u0430 \u043f\u0430\u043f\u043a\u0438: <a href=\"https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664\" rel=\"noopener noreferrer nofollow\">https:\/\/www.flaticon.com\/free-icon\/open-folder_3748664?term=folder&amp;page=1&amp;position=22&amp;origin=search&amp;related_id=3748664<\/a><\/figcaption><\/div>\n<\/figure>\n<figure class=\"\">\n<div><figcaption>\u0442\u0440\u0435 \u043c\u0430\u043d\u0438\u0444\u0438\u043a\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u044f\u043b\u043e \u043c\u0438\u043d\u0443\u0442 5-10. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a\u0438\u0445 \u043e\u043a\u043e\u043d \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0431\u044c\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430.<\/p>\n<p>\u0412\u043d\u0438\u0437\u0443 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043a\u043d\u043e\u043f\u043a\u0443. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u043c\u0435\u043d\u044f\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0430 \u043d\u0435 \u0442\u0435\u0440\u044f\u043b\u0430\u0441\u044c, \u043e\u0442\u0442\u0435\u043d\u0438\u043b \u0444\u043e\u043d. \u0421\u0442\u0438\u043b\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 flat. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0435\u043d\u0435\u0435 \u0443\u0433\u043b\u043e\u0432\u0430\u0442\u043e, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439. \u041d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u043a\u0443\u0441\u043e\u0432\u0449\u0438\u043d\u0430.<\/p>\n<p>\u0417\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0444\u043e\u0440\u043c\u044b \u044f \u0432\u044b\u043d\u0435\u0441 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <code>Cancel = True<\/code>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0438 Esc, \u0447\u0442\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c. \u0422\u0430\u043a \u0432\u043e\u0442 \u044d\u0442\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 Esc \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Click event \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e. \u041d\u0430 \u044d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u044b \u0432\u0435\u0448\u0430\u0435\u043c <code>Unload Me<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u0438 \u043a\u0430\u0439\u0444\u0443\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0443 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043d\u0430 Esc.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0444\u043e\u0440\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<pre><code class=\"vbscript\">Private Sub CloseCommandButton_Click()     Unload Me ' \u0412\u0435\u0448\u0430\u0435\u043c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u043e\u0440\u043c\u0443 End Sub<\/code><\/pre>\n<h3>Config<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 Excel. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f).<\/p>\n<p>\u041c\u043e\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/690298\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0430 habr \u043a\u0430\u043a \u0440\u0430\u0437 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0448\u0435\u043b \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0438 \u0445\u0440\u0430\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 VBA. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b),  \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u043e\u0442 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043a \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443 \u043d\u0435 \u0441\u0431\u0438\u0432\u0430\u044f \u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u2013 \u044f \u043b\u044e\u0431\u043b\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0438.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <code>Config<\/code> \u0438 \u043c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <a href=\"https:\/\/t.me\/vban_diary\/97\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>), \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c ConfigCstr Public Function NewConfig(ByVal AppName As String) As Config     Set NewConfig = New Config     NewConfig.SetAppName AppName End Function   ' \u041a\u043b\u0430\u0441\u0441 Config Private Type TConfig     AppName As String     Section As String End Type  Private this As TConfig  Public Function SetAppName(ByVal Name As String) As Config     this.AppName = Name     Set SetAppName = Me End Function  Public Function SetSection(ByVal Name As String) As Config     this.Section = Name     Set SetSection = Me End Function  Public Sub SetValue(ByVal Key As String, ByVal Value As String)     CheckSettings      SaveSetting this.AppName, this.Section, Key, Value End Sub  Public Function GetValue( _     ByVal Key As String, _     Optional ByVal DefaultValue As Variant = Empty, _     Optional ByVal CastType As VbVarType = VbVarType.vbString _ ) As Variant     CheckSettings      GetValue = Cast(GetSetting(this.AppName, this.Section, Key, DefaultValue), CastType) End Function  Private Sub CheckSettings()     If Len(this.AppName) = 0 Then Err.Raise 91, TypeName(Me), \"\u041d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f AppName.\"     If Len(this.Section) = 0 Then Err.Raise 91, TypeName(Me), \"\u041d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f Section.\" End Sub  Private Function Cast(ByVal Value As Variant, ByVal CastType As VbVarType) As Variant     Select Case CastType     Case vbString: Cast = CStr(Value)     Case vbBoolean         On Error Resume Next         Cast = CBool(Value)         Cast = iif(Err.Number = 0, Cast, false)     End Select End Function<\/code><\/pre>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>Set<\/code> \u0438 <code>Get<\/code> <code>Value<\/code>, \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u043a\u043b\u0430\u0441\u0441\u0430, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443, \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"vbscript\">Config.SetAppName(\"SomeApp\").SetSection(\"Section\").SetValue \"SomeKey\", \"SomeValue\"<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435, \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 <code>CheckSettings<\/code> \u0438 <code>Cast<\/code>. <br \/>\u041f\u0435\u0440\u0432\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0438\u043c\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0441\u0435\u043a\u0446\u0438\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043a\u0443\u0434\u0430 \u043c\u044b \u0432\u043d\u043e\u0441\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0445 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u043e, \u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0435\u043b\u0438 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041a\u043e\u043d\u0444\u0438\u0433 \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u0442\u0443 \u0440\u043e\u043b\u044c.<\/p>\n<p><code>Cast<\/code> \u2013 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u043b\u0438\u0431\u043e \u0442\u0438\u043f\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 enum <code>VbVarType<\/code> \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u0442\u0438\u043f\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 boolean \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0435, \u0442\u0430\u043a \u043a\u0430\u043a, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, null \u0438\u043b\u0438 &#171;&#187; \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 boolean, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0431\u044b\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>False<\/code>.<\/p>\n<p>\u041d\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u0443\u0434\u0430 \u0436 \u0431\u0435\u0437 \u043d\u0435\u0435.<\/p>\n<h3>FormController<\/h3>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u0441\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0444\u043e\u0440\u043c\u044b \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u0441\u0430\u043c\u043e\u0439 \u0444\u043e\u0440\u043c\u044b, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0443\u0436\u0430\u0441\u043d\u043e\u0439 \u043c\u0435\u0448\u0430\u043d\u0438\u043d\u0435 \u043d\u0435\u0441\u0432\u044f\u0437\u043d\u043e\u0433\u043e \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>SettingsFormController<\/code> (\u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c, \u0435\u0441\u0435\u0441\u0441\u043d\u043e):<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c SettingsFormControllerCstr Public Function NewSettingsFormController(ByRef Form As MSForms.UserForm, ByRef Config As Config) As SettingsFormController     Set NewSettingsFormController = New SettingsFormController     Set NewSettingsFormController.Form = Form     Set NewSettingsFormController.Config = Config End Function   ' \u041a\u043b\u0430\u0441\u0441 SettingsFormController Private Type TSettingsFormController     Config As Config     Form As MSForms.UserForm End Type  Private this As TSettingsFormController  Public Property Set Config(ByVal RHS As Config)     Set this.Config = RHS End Property  Public Property Set Form(ByVal RHS As MSForms.UserForm)     Set this.Form = RHS End Property  Public Sub LoadValues()     Dim Control As MSForms.Control     For Each Control In this.Form.Controls         If Strings.Len(Control.Tag) = 0 Then GoTo Continue          Dim CastType As VbVarType         If IsTextBox(Control) Then             CastType = vbString         ElseIf IsOptionButton(Control) Then             CastType = vbBoolean         Else             GoTo Continue         End If          Dim Value As Variant         Value = this.Config.GetValue(Control.Tag, CastType:=CastType)         If IsEmpty(Value) Then GoTo Continue         Control.Value = Value Continue:     Next End Sub  Public Sub SaveValues()     Dim Control As MSForms.Control     For Each Control In this.Form.Controls         If Not IsTextBox(Control) _         And Not IsOptionButton(Control) Then GoTo Continue          Me.SaveValue Control Continue:     Next End Sub  Public Sub SaveValue(ByRef Control As Control)     this.Config.SetValue Control.Tag, Control.Value End Sub<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u0434\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <strong>TextBox<\/strong> \u0438 <strong>OptionButton<\/strong>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 <code>Utils<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0432\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"vbscript\">Public Function IsTextBox(ByVal Control As MSForms.Control) As Boolean     IsTextBox = TypeName(Control) = \"TextBox\" End Function  Public Function IsOptionButton(ByVal Control As MSForms.Control) As Boolean     IsOptionButton = TypeName(Control) = \"OptionButton\" End Function<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2013 \u0442\u044d\u0433\u0438. \u0418\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c FormTags Public Const FilePath As String = \"FilePath\" Public Const GT20Collector As String = \"GT20Collector\" Public Const LT20Collector As String = \"LT20Collector\"<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 \u0444\u043e\u0440\u043c\u044b, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438:<\/p>\n<pre><code class=\"vbscript\">Private Type TSettingsForm     Controller As SettingsFormController End Type  Private this As TSettingsForm  Private Sub UserForm_Initialize()     SetTags      Set this.Controller = NewSettingsFormController( _         Form:=Me, _         Config:=NewConfig(Constants.APP_NAME_ENG).SetSection(\"Settings\") _     )      this.Controller.LoadValues End Sub  Private Sub SetTags()     Me.FilePathTextBox.Tag = FormTags.FilePath     Me.GT20OptionButton.Tag = FormTags.GT20Collector     Me.LT20OptionButton.Tag = FormTags.LT20Collector End Sub  Private Sub SelectFilePathCommandButton_Click()     Dim Path As Variant     Path =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-374962","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374962","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=374962"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374962\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=374962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=374962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=374962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}