{"id":374629,"date":"2024-05-21T06:05:00","date_gmt":"2024-05-21T06:05:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=374629"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=374629","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. \u042f\u0434\u0440\u043e<\/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<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d8b\/bbd\/416\/d8bbbd416c416398c85deaf0122f22d8.png\" width=\"500\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d8b\/bbd\/416\/d8bbbd416c416398c85deaf0122f22d8.png\"\/><\/figure>\n<p><em>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u044f \u0431\u044b \u043e\u0442\u0434\u0430\u043b \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e. \u0422\u043e\u0433\u0434\u0430, \u044f \u0440\u044b\u043b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 VBA \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b.<\/em><\/p>\n<p>\u0412\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e! \u041d\u0430\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u0447\u0430\u0439, \u043d\u0430\u0440\u0435\u0437\u0430\u0439\u0442\u0435 \u0431\u0443\u0442\u0435\u0440\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0430\u0441 \u0436\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u043e\u0435, \u043d\u0443\u0434\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e, \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0427\u0442\u0438\u0432\u043e \u043f\u0440\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430.<\/p>\n<h4>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h4>\n<blockquote>\n<ol>\n<li>\n<p><strong>\u0412\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043b\u0438\u0447\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u042f \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0445\u043e\u0447\u0443 \u043e\u0441\u043a\u043e\u0440\u0431\u0438\u0442\u044c\/\u0443\u043d\u0438\u0437\u0438\u0442\u044c\/\u043e\u0431\u0438\u0434\u0435\u0442\u044c.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u0430\u043c \u0437\u0430\u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u0441\u044f<\/strong><\/p>\n<\/li>\n<\/ol>\n<\/blockquote>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0443\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043d\u043e\u0436\u0438 \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c!<\/p>\n<p><sub>\u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 github.<\/sub><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/da1\/dbe\/e40\/da1dbee403b7d71aba77900c2b82a39c.png\" width=\"421\" height=\"482\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da1\/dbe\/e40\/da1dbee403b7d71aba77900c2b82a39c.png\"\/><\/figure>\n<h3>\u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e-\u0442\u043e?<\/h3>\n<p>\u041d\u0443 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0430\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438\u0437 \u0441\u043c\u0435\u0436\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u0430 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442:<br \/>&#8212; \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441, \u0412\u0430\u0441\u044f \u041f\u0443\u043f\u043a\u0438\u043d \u0434\u0435\u043b\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u043e\u043b\u0438\u043b\u0441\u044f \u0441\u0442\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0422\u0430\u043a \u0432\u043e\u0442 \u043e\u043d \u0447\u0435\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0413\u043b\u044f\u043d\u044c, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u0422\u0417 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435:<\/p>\n<p><em>\u041d\u0443\u0436\u043d\u043e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435) \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0442\u043e\u0432\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 20 (\u044d\u0442\u043e \u044f \u0441\u0430\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a), \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438 (\u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439 \u0437\u0430\u0447\u0435\u043c) \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043a\u043d\u0438\u0433\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043b\u0438\u0441\u0442\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a. \u0421\u0430\u043c\u0443 \u043a\u043d\u0438\u0433\u0443 \u043f\u0435\u0440\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c &#8212; \u0434\u0434\u043c\u043c\u0433\u0433\u0447\u0447\u043c\u043c.xlsx. \u0412\u043e\u0442.<\/em><\/p>\n<p><em>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 (\u043f\u0440\u0438\u043c\u0435\u0440):<\/em><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u2116 \u043f\/\u043f<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">\u0410\u0440\u0442\u0438\u043a\u0443\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0434\u0438\u043d\u0438\u0446\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">123654<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0432\u0430\u04401<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">20<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">654123<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0432\u0430\u04402<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0448\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">15<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0444\u0430\u0439\u043b data.xlsx \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c \u0432\u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ebb\/eff\/4fd\/ebbeff4fde01de51f545de477f6b5b10.png\" alt=\"\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u044d\u0442\u043e \u0436 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\" title=\"\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u044d\u0442\u043e \u0436 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\" width=\"694\" height=\"265\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ebb\/eff\/4fd\/ebbeff4fde01de51f545de477f6b5b10.png\"\/><\/p>\n<div><figcaption>\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u044d\u0442\u043e \u0436 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0442\u0443\u0442 \u0432\u0441\u0435 \u044f\u0441\u043d\u043e. \u0422\u043e\u0432\u0430\u0440\u0438\u0449 \u041f\u0443\u043f\u043a\u0438\u043d \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0438 \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u0438.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441. \u041f\u0435\u0440\u0432\u043e\u0435 \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u2013 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u041d\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439, \u043d\u0435 \u043f\u043e\u0431\u043e\u044e\u0441\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a88\/23c\/5fa\/a8823c5fa9b946b66eb3dacd308475a4.png\" alt=\"\u0430 \u0447\u0435, \u0432\u0441\u0435 \u0436 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\" title=\"\u0430 \u0447\u0435, \u0432\u0441\u0435 \u0436 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\" width=\"920\" height=\"279\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a88\/23c\/5fa\/a8823c5fa9b946b66eb3dacd308475a4.png\"\/><\/p>\n<div><figcaption>\u0430 \u0447\u0435, \u0432\u0441\u0435 \u0436 \u043f\u043e\u043d\u044f\u0442\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u0433\u0440\u0443\u0434\u044c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c VBE.<\/p>\n<h3>\u041d\u0435  \u0434\u043b\u044f \u0441\u043b\u0430\u0431\u043e\u043d\u0435\u0440\u0432\u043d\u044b\u0445<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 ProjectExplorer \u0434\u0430\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043a\u043b\u0430\u0441\u0441\u044b \u0435\u0441\u0442\u044c&#8230;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7db\/e93\/3ec\/7dbe933ecf2a2871d41e1653f815293c.png\" alt=\"\u0430, \u0442\u0443\u0442 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c\" title=\"\u0430, \u0442\u0443\u0442 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c\" width=\"297\" height=\"132\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7db\/e93\/3ec\/7dbe933ecf2a2871d41e1653f815293c.png\"\/><\/p>\n<div><figcaption>\u0430, \u0442\u0443\u0442 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4ee\/8b1\/846\/4ee8b1846381f54ce101100a25e84371.png\" width=\"252\" height=\"449\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ee\/8b1\/846\/4ee8b1846381f54ce101100a25e84371.png\"\/><\/figure>\n<p>\u0423\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043a \u0447\u0435\u043c\u0443 \u0432\u0441\u0435 \u0438\u0434\u0435\u0442, \u0434\u0430?<\/p>\n<p>\u0412 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <code>\u041b\u0438\u0441\u04421<\/code> \u0438 \u0435\u0433\u043e \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vbscript\">Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)     If Target.Address = \"$B$1\" Then         With Application.FileDialog(msoFileDialogFilePicker)             .AllowMultiSelect = False             .ButtonName = \"\u0412\u044b\u0431\u0440\u0430\u0442\u044c\"             .Show             If .SelectedItems.Count > 0 Then                 Worksheets(1).Range(\"B1\").Value = .SelectedItems.Item(1)                 Cancel = True             End If         End With     End If End Sub<\/code><\/pre>\n<p>\u041d\u0443 \u0432 \u0446\u0435\u043b\u043e\u043c.. \u041b\u0430\u0434\u043d\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n<p>\u0414\u0430\u043c\u044b \u0438 \u0433\u043e\u0441\u043f\u043e\u0434\u0430, <code>Module1<\/code>:<\/p>\n<pre><code class=\"vbscript\">Sub \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430()     Application.ScreenUpdating = False     Application.Calculation = xlCalculationManual      Dim f As String, bm As Boolean     Dim twb, workb As Workbook     Dim sh As Worksheet     Dim lr As Long, lc As Long, i As Long, ii As Long, iii As Long     Dim arr     Dim tovary_cotoryx_bolshe_than_20 As Object: Set tovary_cotoryx_bolshe_than_20 = CreateObject(\"Scripting.Dictionary\")     Dim tovary_cotoryx_menshe_chem_20 As Object: Set tovary_cotoryx_menshe_chem_20 = CreateObject(\"Scripting.Dictionary\")     Dim q, v, g     Dim sh2 As Worksheet      f = Sheets(1).Range(\"B1\").Value     bm = Sheets(1).Range(\"B2\").Value = \"0\"          If Len(f) = 0 Then         MsgBox \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      Set twb = ThisWorkbook     Workbooks.Open f     Set workb = ActiveWorkbook     Set sh = workb.ActiveSheet      If sh.Range(\"B1\").Value &lt;> \"\u0410\u0440\u0442\u0438\u043a\u0443\u043b\" And sh.Range(\"B1\").Value &lt;> \"\u0410\u0420\u0422\u0418\u041a\u0423\u041b\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If LCase(sh.Range(\"C1\").Value) &lt;> \"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If sh.Range(\"E1\").Value Like \"*\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" = False Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      lr = workb.ActiveSheet.Rows(Rows.Count).End(xlUp).Row     lc = workb.ActiveSheet.Columns(Columns.Count).End(xlToLeft).Column     arr = workb.ActiveSheet.Range(Cells(1, 1), Cells(lr, lc)).Value      For i = 1 To lr         If IsNumeric(arr(i, 5)) Then             If arr(i, 5) > 20 Then                 If tovary_cotoryx_bolshe_than_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_bolshe_than_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                          ElseIf arr(i, 5) = 0 Then                          Else                                  If tovary_cotoryx_menshe_chem_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_menshe_chem_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                  End If         End If     Next      workb.Sheets.Add     Set sh2 = workb.Sheets(1)      If bm Then         v = tovary_cotoryx_bolshe_than_20.Items()         g = tovary_cotoryx_bolshe_than_20.Keys()     Else         v = tovary_cotoryx_menshe_chem_20.Items()         g = tovary_cotoryx_menshe_chem_20.Keys()     End If     For ii = LBound(g) To UBound(g)         sh2.Cells(ii + 1, 1).Value = Split(g(ii), \";\")(0)         sh2.Cells(ii + 1, 2).Value = Split(g(ii), \";\")(1)     Next     For iii = LBound(v) To UBound(v)         sh2.Cells(iii + 1, 3).Value = v(iii)     Next      workb.SaveAs twb.Path &amp; \"\\\" &amp; Format(Now, \"ddmmyyhhnn\") &amp; \".xlsx\"      workb.Close False          MsgBox \"\u0413\u043e\u0442\u043e\u0432\u043e!\", vbInformation, \"\u0413\u043e\u0442\u043e\u0432\u043e\"     Application.ScreenUpdating = True     Application.Calculation = xlCalculationAutomatic End Sub<\/code><\/pre>\n<blockquote>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442! <strong>\u00a9<\/strong>  \u0412.\u041f\u0443\u043f\u043a\u0438\u043d<\/p>\n<\/blockquote>\n<h3>\u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f?<\/h3>\n<p>\u0414\u0430\u044e \u0432\u0430\u043c 2 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0448\u043b\u043e&#8230;<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/659\/068\/99f\/65906899f71971b565899d0636c65aae.png\" alt=\"\u0418\u0434\u0438\u0442\u0435-\u0438\u0434\u0438\u0442\u0435,  \u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0443.\" title=\"\u0418\u0434\u0438\u0442\u0435-\u0438\u0434\u0438\u0442\u0435,  \u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0443.\" width=\"184\" height=\"274\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/659\/068\/99f\/65906899f71971b565899d0636c65aae.png\"\/><\/p>\n<div><figcaption>\u0418\u0434\u0438\u0442\u0435-\u0438\u0434\u0438\u0442\u0435,  \u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0443.<\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vbscript\">Sub \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430() ' \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435     Application.ScreenUpdating = False     Application.Calculation = xlCalculationManual      ' \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b     Dim f As String, bm As Boolean     Dim twb, workb As Workbook ' \u043d\u0435 \u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432     Dim sh As Worksheet     Dim lr As Long, lc As Long, i As Long, ii As Long, iii As Long     Dim arr   ' \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0430 \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0441\u043b\u043e\u0432     Dim tovary_cotoryx_bolshe_than_20 As Object: Set tovary_cotoryx_bolshe_than_20 = CreateObject(\"Scripting.Dictionary\")     Dim tovary_cotoryx_menshe_chem_20 As Object: Set tovary_cotoryx_menshe_chem_20 = CreateObject(\"Scripting.Dictionary\")     Dim q, v, g     Dim sh2 As Worksheet   ' \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435    ' \u041d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438 \u0437\u0430\u0447\u0435\u043c     f = Sheets(1).Range(\"B1\").Value     bm = Sheets(1).Range(\"B2\").Value = \"0\"          If Len(f) = 0 Then         MsgBox \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"       ' \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 ScreenUpdating \u0438 \u0430\u0432\u0442\u043e\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u0443\u043b         Exit Sub     End If      ' \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ThisWorkBook     Set twb = ThisWorkbook     Workbooks.Open f     Set workb = ActiveWorkbook     Set sh = workb.ActiveSheet      If sh.Range(\"B1\").Value &lt;> \"\u0410\u0440\u0442\u0438\u043a\u0443\u043b\" And sh.Range(\"B1\").Value &lt;> \"\u0410\u0420\u0422\u0418\u041a\u0423\u041b\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If LCase(sh.Range(\"C1\").Value) &lt;> \"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If sh.Range(\"E1\").Value Like \"*\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" = False Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      lr = workb.ActiveSheet.Rows(Rows.Count).End(xlUp).Row     lc = workb.ActiveSheet.Columns(Columns.Count).End(xlToLeft).Column     arr = workb.ActiveSheet.Range(Cells(1, 1), Cells(lr, lc)).Value        For i = 1 To lr         If IsNumeric(arr(i, 5)) Then             If arr(i, 5) > 20 Then                 ' \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c                 ' \u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430                 If tovary_cotoryx_bolshe_than_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_bolshe_than_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                          ElseIf arr(i, 5) = 0 Then                          Else                                  If tovary_cotoryx_menshe_chem_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_menshe_chem_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                  End If         End If     Next      workb.Sheets.Add     Set sh2 = workb.Sheets(1)      If bm Then         v = tovary_cotoryx_bolshe_than_20.Items()         g = tovary_cotoryx_bolshe_than_20.Keys()     Else         v = tovary_cotoryx_menshe_chem_20.Items()         g = tovary_cotoryx_menshe_chem_20.Keys()     End If     For ii = LBound(g) To UBound(g)         sh2.Cells(ii + 1, 1).Value = Split(g(ii), \";\")(0)         sh2.Cells(ii + 1, 2).Value = Split(g(ii), \";\")(1)     Next     For iii = LBound(v) To UBound(v)         sh2.Cells(iii + 1, 3).Value = v(iii)     Next      workb.SaveAs twb.Path &amp; \"\\\" &amp; Format(Now, \"ddmmyyhhnn\") &amp; \".xlsx\"      workb.Close False          MsgBox \"\u0413\u043e\u0442\u043e\u0432\u043e!\", vbInformation, \"\u0413\u043e\u0442\u043e\u0432\u043e\"     Application.ScreenUpdating = True     Application.Calculation = xlCalculationAutomatic ' \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b ' \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 End Sub<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<blockquote>\n<p><em>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430:<\/em><\/p>\n<ol>\n<li>\n<p><em>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f bad \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0440 (\u0442.\u0435. \u044f).<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u043e \u043d\u0438\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0443\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439. \u042f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u044b\u0435 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u043e \u0441\u0442\u0440\u043e\u043a \u0431\u044b\u043b\u043e \u0432 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435.<\/em><\/p>\n<\/li>\n<\/ol>\n<\/blockquote>\n<p>\u041d\u0443 \u0447\u0442\u043e\u0448&#8230; \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0438\u0437\u0431\u0438\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437 \u0432\u0430\u0441 \u043f\u0438\u0441\u0430\u043b \u043a\u043e\u0434 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0441 \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u2013 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0441 VBA? \u041d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u043d\u043e \u043f\u043e \u0441\u0443\u0442\u0438, \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435!<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043d\u0438\u0433\u0443, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 VBE, \u0432 ProjectExplorer \u0436\u043c\u0435\u043c \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u043d\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0443\u043d\u043a\u0442 <em>VBAProject properties&#8230;<\/em> \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c, \u0442\u0430\u043a\u0438, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0433\u043e\u0441\u043f\u043e\u0434\u0430!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f8\/394\/127\/9f83941274f23b569002ba4ff1fb4317.png\" alt=\"\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439... (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" title=\"\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439... (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" width=\"1000\" height=\"563\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9f8\/394\/127\/9f83941274f23b569002ba4ff1fb4317.png\"\/><\/p>\n<div><figcaption>\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\/\u0444\u0443\u043d\u043a\u0446\u0438\u0438\/\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439&#8230; <br \/>(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441? \u041a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u0432\u0430\u0440\u044b \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e. \u042f \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b <em>GoodsCollector<\/em> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0445\u043e\u0442\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043d\u043e \u043a\u0443\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e <em>VBAProject<\/em>&#8230;<br \/>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0435\u0449\u0435 \u0434\u0435\u043b\u0430\u044e \u044f, \u043d\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0438\u043a\u043e\u043c\u0443 \u2013 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043b\u043e\u0432\u043e <em>Project<\/em>, \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043a\u043b\u0430\u0441\u0441, vba \u043d\u0435 \u0440\u0443\u0433\u0430\u043b\u0441\u044f.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d22\/89c\/a15\/d2289ca1587aa60dc5de195527032e58.png\" alt=\"perfect!\" title=\"perfect!\" width=\"453\" height=\"467\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d22\/89c\/a15\/d2289ca1587aa60dc5de195527032e58.png\"\/><\/p>\n<div><figcaption>perfect!<\/figcaption><\/div>\n<\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0432\u0445\u043e\u0434\u0430<\/h3>\n<p>\u041d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u044b! \u041f\u043e\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0434\u0434\u0430\u043a\u043d\u0443 \u044f!<br \/>\u0418 \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u044b, \u043f\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443. \u041f\u0435\u0440\u0435\u0444\u0440\u0430\u0437\u0438\u0440\u0443\u044f \u0441\u043b\u043e\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430: <em>\u043d\u0443 \u043d\u0435 \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u043b\u043e\u0436\u043d\u043e.<\/em><\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043a\u0430\u0437\u0443\u0441\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>App<\/code>, \u0430 \u0432 \u043d\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 <code>Main<\/code>.<br \/>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>Index<\/code>, <code>Program<\/code>, \u043a\u0430\u043a \u0445\u043e\u0442\u0438\u0442\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0448\u0430\u0440\u0438\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u043e\u043b\u043d\u0438\u0435\u043d\u043e\u0441\u043d\u043e \u0441\u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c \u0433\u0434\u0435 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/475\/2ca\/035\/4752ca0357c5bcfa72db365d2adce654.png\" alt=\"rubberdu'\u0447\u0438\u0439 code explorer, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\" title=\"rubberdu'\u0447\u0438\u0439 code explorer, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\" width=\"824\" height=\"357\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/475\/2ca\/035\/4752ca0357c5bcfa72db365d2adce654.png\"\/><\/p>\n<div><figcaption>rubberdu&#8217;\u0447\u0438\u0439 code explorer, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0422.\u043a. \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 Rubberduck, \u044f \u0432\u0437\u044f\u043b \u0437\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0443\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b Excel, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u041b\u0438\u0441\u04421 \u0438\u043b\u0438 \u042d\u0442\u0430\u041a\u043d\u0438\u0433\u0430, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fbc\/77e\/7a1\/fbc77e7a1123764f50cefa14593f1fd9.png\" alt=\"\u041f\u0440\u0438\u0447\u0435\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043d\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" title=\"\u041f\u0440\u0438\u0447\u0435\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043d\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\" width=\"308\" height=\"184\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fbc\/77e\/7a1\/fbc77e7a1123764f50cefa14593f1fd9.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u0447\u0435\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043d\u0435 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u041d\u0430\u0447\u043d\u0435\u043c\u0441<\/h3>\n<p>\u0410 \u043d\u0430\u0447\u043d\u0435\u043c \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0435\u0431\u0435 \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.<br \/>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>DevUtils<\/code> \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<pre><code class=\"vbscript\">'@Folder(\"GoodsCollectorProject\") Option Explicit  Public DEV As Boolean<\/code><\/pre>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043b\u0438\u0441\u0442\u044b, \u044f \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e \u0441\u044e\u0434\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 <code>Public Sub DevMode(ByVal State As Boolean)<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0438 \u043b\u0438\u0441\u0442\u044b \u043b\u0438\u0431\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u044e, \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e. \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 (Immediate Window):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/838\/782\/67c\/83878267cb81f39934a95fdfada814e5.png\" alt=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u043f\u0440\u043e\u0436\u0430\u043b\u0438 enter, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f\" title=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u043f\u0440\u043e\u0436\u0430\u043b\u0438 enter, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f\" width=\"549\" height=\"253\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/838\/782\/67c\/83878267cb81f39934a95fdfada814e5.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u043f\u0440\u043e\u0436\u0430\u043b\u0438 enter, \u0440\u0430\u0434\u0443\u0435\u043c\u0441\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>DEV<\/code>.<br \/>\u041f\u043e\u0437\u0436\u0435 \u043f\u043e\u0439\u043c\u0435\u0442\u0435 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0430.<br \/>\u0415\u0449\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 <strong>Conditional Compilation Arguments<\/strong> \u0441\u0442\u0440\u043e\u0447\u043a\u0443 <code>DEV = 1<\/code>, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b, \u043a\u0430\u043a \u0431\u044b, \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/da2\/a16\/b8f\/da2a16b8ffa9c505efb0df9b93689d75.png\" width=\"472\" height=\"476\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da2\/a16\/b8f\/da2a16b8ffa9c505efb0df9b93689d75.png\"\/><\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c&#8230;<\/p>\n<h3>\u0420\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043c<\/h3>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043e\u0442\u0447\u0435\u0442\u0443. \u041c\u044b \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c UserForm&#8217;\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043d\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"vbscript\">Public Sub Main()     #If DEV Then         Const FilePath As String = \"C:\\dev\\projects\\vba\\refact\\data.xlsx\"     #Else         Dim FilePath As String         ' TODO: \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0438     #End If End Sub<\/code><\/pre>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>DEV<\/code> \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u0432 <code>DevUtils<\/code> \u043c\u043e\u0434\u0443\u043b\u0435, \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0443 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0436\u0438\u043c\u043e\u043c: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \/ \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d (\u043d\u0443 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c).<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \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 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0435, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0443 \u043d\u0430 <code>DEV = 0<\/code> \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c, \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043c\u043e\u0434 (\u0442\u0430\u043a \u0441\u043a\u0430\u0430\u0430\u0442\u044c).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/22f\/30f\/5c9\/22f30f5c93d6c7a3cf5b5d28450bbc57.png\" alt=\"\u043d\u0443 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" title=\"\u043d\u0443 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" width=\"240\" height=\"210\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/22f\/30f\/5c9\/22f30f5c93d6c7a3cf5b5d28450bbc57.png\"\/><\/p>\n<div><figcaption>\u043d\u0443 <br \/>(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430 \u0443 \u043d\u0430\u0441 \u0438\u0434\u0435\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u043b\u044c\u043a\u0430\u043d\u0438\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0430\u0432\u0442\u043e\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 (\u043d\u0443 \u043d\u0430\u0434\u043e, \u0442\u0430\u043a \u043d\u0430\u0434\u043e).<br \/>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u0434\u0435\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0446\u0435, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u0438 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Exit Sub<\/code> \u044d\u0442\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f.<br \/>\u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0442\u0430\u043a\u0438\u043c \u0432\u043e\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"vbscript\">    On Error GoTo Catch      #If DEV Then         Const FilePath As String = \"C:\\dev\\projects\\vba\\refact\\data.xlsx\"     #Else         Dim FilePath As String         ' TODO: \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0438     #End If ExitSub:     ' \u0427\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434 Exit Sub  Catch:     ' \u041b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443     Resume ExitSub<\/code><\/pre>\n<ol>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>On Error GoTo Catch<\/code> \u0438 \u043b\u0435\u0439\u0431\u043b <code>Catch<\/code> \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 <code>Catch<\/code> \u0441\u0442\u0430\u0432\u0438\u043c <code>Exit Sub<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 <code>Catch<\/code> \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430 (\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 <code>Exit Sub<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0435\u0439\u0431\u043b <code>ExitSub<\/code>, \u0430 \u0432 <code>Catch<\/code>, \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u043b\u0435\u0439\u0431\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Resume ExitSub<\/code>.<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0447\u0435\u043c\u0443 Resume, \u044d?<\/summary>\n<div class=\"spoiler__content\">\n<blockquote>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u00a0<code>Goto<\/code>\u043d\u0435 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 Err (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<code>Err.Clear<\/code>) \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0448 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c. \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u00a0\u043c\u0435\u0442\u043a\u0438, \u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u00a0<code>Resume<\/code>\u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 Err \u0438 \u0441\u043d\u043e\u0432\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a (\u043e\u043d \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a). \u0415\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u00a0<code>Cleanup<\/code>\u043c\u0435\u0442\u043a\u0438, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0432<code>ErroHandler<\/code><\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>(c) <a href=\"https:\/\/stackoverflow-com.translate.goog\/questions\/2996697\/difference-between-resume-and-goto-in-error-handling-block?_x_tr_sl=en&amp;_x_tr_tl=ru&amp;_x_tr_hl=ru&amp;_x_tr_pto=sc\" rel=\"noopener noreferrer nofollow\">StackOverflow<\/a><\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0439\u043c\u0430\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438, \u0432\u044b\u0448\u043b\u0438 \u0441\u0443\u0445\u0438\u043c\u0438 \u0438 \u0447\u0438\u0441\u0442\u044b\u043c\u0438.<\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432 <code>MsgBox<\/code> \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u0432\u0431\u0430\u043d\u0441\u043e\u043b\u044c (Immediate Window). \u041f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043b\u043e\u0433\u0433\u0435\u0440 \u0438 \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<pre><code class=\"vbscript\">Catch:     ' \u041b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443     Call MsgBox( _         \"\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430.\" &amp; vbNewLine &amp; vbNewLine &amp; Err.Description, _         vbCritical, _         \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\" _     ) ' \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0437\u0434\u0435\u0441\u044c Call, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445,       '   \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \"\u043a\u0440\u0430\u0441\u043e\u0442\u044b\"     Debug.Print \"#\" &amp; Err.Number, Err.Description     Resume ExitSub<\/code><\/pre>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435?<br \/>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>Utils<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0448\u043a\u0438.<br \/>\u0418 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c Utils  Public Sub DisableSettings()     Application.ScreenUpdating = False     Application.Calculation = xlCalculationManual End Sub  Public Sub EnableSetting()     Application.ScreenUpdating = True     Application.Calculation = xlCalculationAutomatic End Sub<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0432 <code>Main<\/code>:<\/p>\n<pre><code class=\"vbscript\">    On Error GoTo Catch      Utils.DisableSettings      #If DEV Then         Const FilePath As String = \"C:\\dev\\projects\\vba\\refact\\data.xlsx\"     #Else         Dim FilePath As String         ' TODO: \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0443\u0442\u0438     #End If ExitSub:     ' \u0427\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434     Utils.EnableSetting Exit Sub  Catch:     ' \u041b\u043e\u0432\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443     GoTo ExitSub<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9f5\/ced\/9b3\/9f5ced9b319e3202a26f2d65027666de.png\" alt=\"\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043c\u044b \u0438\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" title=\"\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043c\u044b \u0438\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" width=\"447\" height=\"255\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9f5\/ced\/9b3\/9f5ced9b319e3202a26f2d65027666de.png\"\/><\/p>\n<div><figcaption>\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043c\u044b \u0438\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u043c<br \/>(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p><em>\u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u2013 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0412\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0432\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/em><\/p>\n<\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0443\u0442\u044c. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c. \u041d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e <code>PathChecker<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Validate<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c&#8230;\u0445\u043c, \u043a\u043e\u0435-\u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0425\u043e\u0447\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0435 \u0431\u044b \u043d\u0435\u0442, \u043a\u0442\u043e \u043c\u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442:<\/p>\n<pre><code class=\"vbscript\">Public Function ValidatePath(ByVal Path As String) As TCheckResult<\/code><\/pre>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>CheckerTypes<\/code> \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c UDT:<\/p>\n<pre><code class=\"vbscript\">Public Type TCheckResult     HasError As Boolean     Message As String End Type<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u043e\u0433\u0438\u043a\u0443:<\/p>\n<pre><code class=\"vbscript\">Public Function Validate(ByVal Path As String) As TCheckResult     If Len(Path) = 0 Then         Validate.HasError = True         Validate.Message = \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d.\"         Exit Function     End If      Dim FSO As Object: Set FSO = CreateObject(\"Scripting.FileSystemObject\")     If Not FSO.FileExists(Path) Then         Validate.HasError = True         Validate.Message = \"\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c.\"         Exit Function     End If End Function<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u041f\u043e \u0432\u043a\u0443\u0441\u0443.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e, \u043c\u043d\u0435 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <code>FSO<\/code>. \u041d\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432 <code>Utils<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c Utils Public Function NewFileSystemObject() As Object     Set NewFileSystemObject = CreateObject(\"Scripting.FileSystemObject\") End Function   ' \u041c\u043e\u0434\u0443\u043b\u044c PathChecker Public Function Validate(ByVal Path As String) As TCheckResult     If Len(Path) = 0 Then         Validate.HasError = True         Validate.Message = \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d.\"         Exit Function     End If      Dim FSO As Object: Set FSO = Utils.NewFileSystemObject() ' \u0422\u0430\u043a \u043b\u0443\u0447\u0448\u0435     If Not FSO.FileExists(Path) Then         Validate.HasError = True         Validate.Message = \"\u0424\u0430\u0439\u043b \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c.\"         Exit Function     End If End Function<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae4\/39d\/431\/ae439d431f91ce7d771ab9c534b21a3e.png\" width=\"648\" height=\"712\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae4\/39d\/431\/ae439d431f91ce7d771ab9c534b21a3e.png\"\/><\/figure>\n<p>\u0412 <code>Main<\/code> \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u043e\u0432\u043e\u0438\u0441\u043f\u0435\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439:<\/p>\n<pre><code class=\"vbscript\">    Dim Result As TCheckResult: Result = PathChecker.Validat(FilePath)     If Result.HasError Then         MsgBox Result.Message, vbExclamation, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443\"         GoTo ExitSub     End If  ExitSub:     ' \u0427\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434     Utils.EnableSetting Exit Sub<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0422\u0430\u043c Resume, \u0442\u0443\u0442 GoTo, \u043d\u0443 \u044d\u0442\u043e \u0447\u0435 \u0442\u0430\u043a\u043e\u0435?<\/summary>\n<div class=\"spoiler__content\">\n<\/div>\n<\/details>\n<p>\u0412\u044b\u0437\u0432\u0430\u043b\u0438, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0447\u0438\u0441\u0442\u043e \u0432\u044b\u0448\u043b\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/808\/5a2\/066\/8085a2066bf1b60ea04e1a80991e2aa2.png\" alt=\"profet!(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" title=\"profet!(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" width=\"640\" height=\"478\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/808\/5a2\/066\/8085a2066bf1b60ea04e1a80991e2aa2.png\"\/><\/p>\n<div><figcaption>profet!<br \/>(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043f\u043b\u0430\u043d\u0443:<\/p>\n<ol>\n<li>\n<p>\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043a\u043d\u0438\u0433\u0443<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043c\u0430\u0441\u0441\u0438\u0432<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0443 \u0432\u044b \u0436\u0435 \u043d\u0435 \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u0442\u044c \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0433\u0443?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d1\/4d6\/dcb\/1d14d6dcb77351ff3b9105fabc8a34a0.png\" width=\"651\" height=\"383\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d1\/4d6\/dcb\/1d14d6dcb77351ff3b9105fabc8a34a0.png\"\/><\/figure>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0438<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f \u043a\u043d\u0438\u0433\u0438-\u043e\u0442\u0447\u0435\u0442\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043e\u0442\u0447\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u041e\u0442\u0447\u0435\u0442<\/em>. \u0417\u043d\u0430\u0447\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0443\u043b\u044c `ReportBook`. \u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a, \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0435\u043c \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a65\/28e\/acd\/a6528eacd38b8df0fc95e7e7ff792023.png\" alt=\"\u0438 \u044d\u0442\u043e \u043c\u044b \u0435\u0449\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438\" title=\"\u0438 \u044d\u0442\u043e \u043c\u044b \u0435\u0449\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438\" width=\"361\" height=\"251\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a65\/28e\/acd\/a6528eacd38b8df0fc95e7e7ff792023.png\"\/><\/p>\n<div><figcaption>\u0438 \u044d\u0442\u043e \u043c\u044b \u0435\u0449\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0430\u0447\u0430\u043b\u0438<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p><em>\u041c\u0438\u043d\u0443\u0442\u043a\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0432\u0442\u043e\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043d\u0438\u0436\u0435. \u0412 VBA \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 &#171;\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440&#187;. \u0415\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d <\/em><a href=\"https:\/\/rubberduckvba.blog\/2018\/04\/24\/factories-parameterized-object-initialization\/\" rel=\"noopener noreferrer nofollow\"><em>Object Initialization<\/em><\/a><em>. \u041d\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0438\u0436\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0438\u0441\u0430\u043b \u0432 <\/em><a href=\"https:\/\/t.me\/vban_diary\/97\" rel=\"noopener noreferrer nofollow\"><em>tg<\/em><\/a><em>.<\/em><\/p>\n<\/blockquote>\n<p>\u0414\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>ReportBookCstr<\/code>, \u0430 \u0432 \u043d\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"vbscript\">Public Function NewReportBook(ByVal Path As String) As ReportBook     Set NewReportBook = New ReportBook     NewReportBook.Path = Path End Function<\/code><\/pre>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 <code>ReportBook<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>Path<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 udt \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>Path<\/code> \u0438 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043f\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u044b <code>Validate<\/code> \u0438 <code>GetData<\/code>: <\/p>\n<pre><code class=\"vbscript\">Option Explicit  Private Type TReportBook     Book As Workbook     Path As String End Type  Private this As TReportBook  Public Property Get Path() As String     Path = this.Path End Property Public Property Let Path(ByVal RHS As String)     this.Path = RHS End Property  Public Function Validate() As TCheckResult      End Function  Public Function GetData() As Variant      End Function<\/code><\/pre>\n<p>\u0412\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432.<\/p>\n<h3>\u041f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u044b<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c <code>ColumnTypes<\/code>, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043a\u0443 <code>TColumn<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>FindColumn<\/code>:<\/p>\n<pre><code class=\"vbscript\">Option Explicit  Public Type TColumn     Name As String     Index As Integer End Type  Public Function FindColumn(ByRef NameOrNames As Variant, ByRef Table As Range) As TColumn     Dim Names As Variant     If IsArray(NameOrNames) Then Names = NameOrNames Else Names = Array(NameOrNames)      Dim Name As Variant     For Each Name In Names         Dim FoundCell As Range: Set FoundCell = Table.Find( _             What:=Name, _             LookIn:=XlFindLookIn.xlValues, _             Lookat:=XlLookAt.xlWhole, _             MatchCase:=False _         )         If Not FoundCell Is Nothing Then             FindColumn.Name = FoundCell.Value             FindColumn.Index = FoundCell.Column             Exit Function         End If     Next      Dim ErrMsg As String     ErrMsg = GenerateErrMsg(Names, Table.Parent.Parent)      Call Err.Raise( _          Number:=9, _          Source:=\"FindColumn\", _          Description:=ErrMsg _     ) End Function  Public Function GenerateErrMsg(ByRef Names As Variant, ByRef Book As Workbook)     GenerateErrMsg = \"\u0412 \u043a\u043d\u0438\u0433\u0435 '\" &amp; Book.Name &amp; \"' \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0438\u043c\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u0430\u043c:\" &amp; _         vbNewLine &amp; Strings.Join(Names, vbNewLine) End Function<\/code><\/pre>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438\u043c\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u043c\u0435\u043d + \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043d\u0430\u0439\u0434\u0435\u043d, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u041b\u043e\u0433\u0438\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<p><em>\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c <\/em><code>Source<\/code><em> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439.<\/em><\/p>\n<\/blockquote>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u044b <code>Find<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044e (\u0438\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u0445 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>FindColumn<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440). \u0414\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u0435\u0439\u0441\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u0438\u0445.<\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>ReportColumns<\/code> \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c ReportColumnsCstr Public Function NewReportColumns(ByRef Table As Range) As ReportColumns     Set NewReportColumns = New ReportColumns     NewReportColumns.RegisterColumns Table End Function   ' \u041a\u043b\u0430\u0441\u0441 ReportColumns Option Explicit  Private Type TReportColumns     Item As TColumn     Name As TColumn     Quantity As TColumn End Type  Private this As TReportColumns  Public Property Get Item() As TColumn     Item = this.Item End Property  Public Property Get Name() As TColumn     Name = this.Name End Property  Public Property Get Quantity() As TColumn     Quantity = this.Quantity End Property  Public Sub RegisterColumns(ByRef Table As Range)     this.Item = ColumnTypes.FindColumn(\"\u0410\u0440\u0442\u0438\u043a\u0443\u043b\", Table)     this.Name = ColumnTypes.FindColumn(\"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\", Table)     this.Quantity = ColumnTypes.FindColumn(Array( _         \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\", _         \"\u041a\u043e\u043b-\u0432\u043e\", _         \"\u041a\u043e\u043b.\" _     ), Table) End Sub<\/code><\/pre>\n<blockquote>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>RegisterColumns<\/code>, \u0447\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043d\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e), \u043d\u043e \u0432\u0441\u0435 \u0447\u0442\u043e \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u2013 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <em>\u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u043e\u043a\u044d\u0439<\/em>.<\/p>\n<\/blockquote>\n<p>\u041f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 ReportBook.Validate:<\/p>\n<pre><code class=\"vbscript\">Private Type TReportBook     Book As Workbook     Path As String     Columns As ReportColumns ' \u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 Columns End Type  Private this As TReportBook  Public Property Get Path() As String     Path = this.Path End Property Public Property Let Path(ByVal RHS As String)     this.Path = RHS End Property  Public Function Validate() As TCheckResult     Set this.Book = Workbooks.Open(this.Path)     On Error GoTo Catch     Set this.Columns = NewReportColumns(this.Book.ActiveSheet.UsedRange) Exit Function  Catch:     Validate.HasError = True     Validate.Message = Err.Description     Resume Next ' \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0438\u043d\u0444\u044b \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 End Function<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 <code>FindColumn<\/code> \u0432\u044b\u0437\u043e\u0432 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0435\u0435 \u043e\u0442\u043b\u043e\u0432\u0438\u0442\u044c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0414\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 <code>Main<\/code> \u043d\u043e\u0432\u044b\u0439 \u043a\u0443\u0441\u043e\u0447\u0435\u043a:<\/p>\n<pre><code class=\"vbscript\">    Dim Result As TCheckResult: Result = PathChecker.Validate(FilePath)     If Result.HasError Then         MsgBox Result.Message, vbExclamation, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443\"         GoTo ExitSub     End If      Dim Book As ReportBook: Set Book = NewReportBook(FilePath) ' \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ReportBook     Result = Book.Validate() ' \u0412\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443     If Result.HasError Then         MsgBox Result.Message, vbExclamation, \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0444\u0430\u0439\u043b\u0430\"         GoTo ExitSub     End If ExitSub:     ' \u0427\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434     Utils.EnableSetting Exit Sub<\/code><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90b\/442\/837\/90b4428371c9c97e92be6a1f72ba3440.png\" alt=\"\u0447\u0435\u0442\u043a\u043e \u0438 \u044f\u0441\u043d\u043e\" title=\"\u0447\u0435\u0442\u043a\u043e \u0438 \u044f\u0441\u043d\u043e\" width=\"540\" height=\"241\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90b\/442\/837\/90b4428371c9c97e92be6a1f72ba3440.png\"\/><\/p>\n<div><figcaption>\u0447\u0435\u0442\u043a\u043e \u0438 \u044f\u0441\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0435\u043b\u043e \u0437\u0430 \u043c\u0430\u043b\u044b\u043c&#8230;<\/p>\n<h3>\u0412 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u0443\u0436\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e<\/h3>\n<p>\u0410 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430?<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/834\/45d\/1c1\/83445d1c120c19b36ee41eb5df6af547.png\" alt=\"\u0443\u0445, \u043f\u043e\u0440\u0430 \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c\" title=\"\u0443\u0445, \u043f\u043e\u0440\u0430 \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c\" width=\"372\" height=\"341\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/834\/45d\/1c1\/83445d1c120c19b36ee41eb5df6af547.png\"\/><\/p>\n<div><figcaption>\u0443\u0445, \u043f\u043e\u0440\u0430 \u0440\u0430\u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c \u0447\u0435\u0442\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043d\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0438\u0447\u043d\u043e \u044f \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u043f\u0430\u043f\u043a\u0443 Common.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043b\u0430\u0441\u0441\u0443 \u043f\u0430\u043f\u043a\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043f\u0430\u043f\u043a\u0443 src.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0439 \u0432\u0438\u0434:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dc5\/4ff\/c69\/dc54ffc69bbf271271f5b152861c0485.png\" alt=\"\u043d\u0443 \u0432\u043e\u0442, \u0443\u0436\u0435 \u043f\u043e\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435\" title=\"\u043d\u0443 \u0432\u043e\u0442, \u0443\u0436\u0435 \u043f\u043e\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435\" width=\"380\" height=\"619\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dc5\/4ff\/c69\/dc54ffc69bbf271271f5b152861c0485.png\"\/><\/p>\n<div><figcaption>\u043d\u0443 \u0432\u043e\u0442, \u0443\u0436\u0435 \u043f\u043e\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440<\/h3>\n<p>\u0414\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>GoodsCollector<\/code>, \u043d\u043e \u044f \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0445\u043e\u0447\u0443 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f. <\/p>\n<p>\u0427\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441:<br \/>\u0435\u0441\u0442\u044c \u0434\u0432\u0430 <s>\u0441\u0442\u0443\u043b\u0430<\/s>\u043a\u0435\u0439\u0441\u0430 \u2013 \u0431\u043e\u043b\u044c\u0448\u0435 20 \u0438 \u043c\u0435\u043d\u044c\u0448\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a9d\/188\/560\/a9d1885605e15f7e139ce57ebb6dfb8d.png\" alt=\"\u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u043a\u0435\u0439\u0441\u044b(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" title=\"\u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u043a\u0435\u0439\u0441\u044b(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)\" width=\"599\" height=\"215\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a9d\/188\/560\/a9d1885605e15f7e139ce57ebb6dfb8d.png\"\/><\/p>\n<div><figcaption>\u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u043a\u0435\u0439\u0441\u044b<br \/>(\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u0432\u0430, \u0430 &#171;\u0437\u0430\u0432\u0442\u0440\u0430&#187; \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0435 40.<\/p>\n<p>\u0422\u0430\u043a \u0432\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0448\u0435\u0435:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>IGoodsCollector<\/code>. <\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>GT20Collecor<\/code> \u0438 <code>LT20Collector<\/code> (\u043e\u0442 Greater \u0438 Lower Than \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e). <\/p>\n<\/li>\n<li>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0432\u0441\u0435 \u0434\u0438\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0435\u043c \u043c\u0435\u0442\u043e\u0434 Collect \u0431\u0435\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u043e\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Rubberduck \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439:<\/p>\n<pre><code class=\"vbscript\">'@Interface '@Folder \"GoodsCollectorProject.src.Core.GoodsCollector\" Option Explicit  Public Function Collect() As Object End Function<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c64\/fc0\/ccf\/c64fc0ccf978606847f3d9a244a0ab7a.png\" alt=\"\" title=\"\" width=\"694\" height=\"569\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c64\/fc0\/ccf\/c64fc0ccf978606847f3d9a244a0ab7a.png\"\/><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a5\/229\/4c4\/7a52294c4c6e5322bf759acb83d878b6.png\" alt=\"\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435\" title=\"\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435\" width=\"193\" height=\"36\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a5\/229\/4c4\/7a52294c4c6e5322bf759acb83d878b6.png\"\/><\/p>\n<div><figcaption>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0438\u0448\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u042f \u043f\u043e\u043a\u0430\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u0435\u0439\u0441\u0430 &#171;\u0431\u043e\u043b\u044c\u0448\u0435 20&#187;, \u0442.\u043a. &#171;\u043c\u0435\u043d\u044c\u0448\u0435 20&#187; \u0432 \u0446\u0435\u043b\u043e\u043c \u0442\u0430\u043a\u043e\u0439 \u0436\u0435.<\/p>\n<pre><code class=\"vbscript\">' \u041a\u043b\u0430\u0441\u0441 GT20Collector  '@Folder \"GoodsCollectorProject.src.Core.GoodsCollector.GT20Collector\" Option Explicit  Implements IGoodsCollector  Private Type TGT20Collector     Data As Variant     Columns As ReportColumns End Type  Private this As TGT20Collector  Public Property Get Data() As Variant     Data = this.Data End Property Public Property Let Data(ByVal RHS As Variant)     this.Data = RHS End Property  Public Property Get Columns() As ReportColumns     Set Columns = this.Columns End Property Public Property Set Columns(ByVal RHS As ReportColumns)     Set this.Columns = RHS End Property  Public Function Collect() As Object     Dim Goods As Object: Set Goods = NewDictionary()      Dim Row As Long     For Row = LBound(this.Data, 1) To UBound(this.Data, 1)         Dim Quantity As Variant: Quantity = Data(Row, this.Columns.Quantity.Index)         If Not IsNumeric(Quantity) Then GoTo Continue         If Not Quantity > 20 Then GoTo Continue          Dim Key As String: Key = GenerateKey(Row)         Goods(Key) = Goods(Key) + Quantity Continue:     Next      Set Collect = Goods End Function  Public Function GenerateKey(ByVal Row As Long) As String     Dim KeyData As Variant: KeyData = Array( _         this.Data(Row, this.Columns.Item.Index), _         this.Data(Row, this.Columns.Name.Index) _     )      GenerateKey = KeySerializer.Stringify(KeyData) End Function  Private Function IGoodsCollector_Collect() As Object     Set IGoodsCollector_Collect = Collect() End Function<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Dictionary<\/code>?<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c Utils Public Function NewDictionary() As Object     Set NewDictionary = CreateObject(\"Scripting.Dictionary\") End Function<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0443 \u043d\u0430\u0441 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>Collect<\/code>. \u041f\u043e \u0441\u0443\u0442\u0438 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u0432 \u043a\u043e\u0434\u0435 \u0412\u0430\u0441\u0438\u043b\u0438\u044f, \u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e. \u041e\u0441\u043e\u0431\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>GenerateKey<\/code>. \u041c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0412\u0430\u0441\u044f, \u043d\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043c \u0435\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c KeySerialize  '@Folder(\"GoodsCollectorProject.src.Common\") Option Explicit  Const SEPARATOR As String = \";\"  Public Function Stringify(ByRef KeyData As Variant) As String     Stringify = Strings.Join(KeyData, SEPARATOR) End Function  Public Function Parse(ByVal Key As String) As Variant     Parse = Strings.Split(Key, SEPARATOR) End Function <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0434\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u2013 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u0443\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435.<\/p>\n<p>\u041f\u0440\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"vbscript\">Public Function NewGT20Collector(ByRef Data As Variant, ByRef Columns As ReportColumns) As GT20Collector     Set NewGT20Collector = New GT20Collector     NewGT20Collector.Data = Data     Set NewGT20Collector.Columns = Columns End Function<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0430 \u043c\u043e\u0434\u0443\u043b\u044f: <code>CollectorTypes<\/code> \u0438 <code>GoodsCollectorFactory<\/code>:<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c CollectorTypes  ' \u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432 Public Enum CollectorKind     GT20     LT20 End Enum   ' \u041c\u043e\u0434\u0443\u043b\u044c GoodsCollectorFactory Public Function GetCollector(ByVal Kind As CollectorKind, ByRef Data As Variant, ByRef Columns As ReportColumns) As IGoodsCollector     Select Case Kind     Case CollectorKind.GT20         Set GetCollector = NewGT20Collector(Data, Columns)     Case CollectorKind.LT20         Set GetCollector = NewLT20Collector(Data, Columns)     Case Else         Call Err.Raise( _             Number:=9, _             Source:=\"GetCollector\", _             Description:=\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430: \" &amp; Kind _         )     End Select End Function<\/code><\/pre>\n<p>\u0415\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u0443\u0442 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435:<\/p>\n<ol>\n<li>\n<p>\u0412 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0442\u0438\u043f \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432 Select Case \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0438\u0434\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0444\u0430\u0431\u0440\u0438\u043a\u0443. \u0412 <code>Main<\/code> \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 (\u043a\u0441\u0442\u0430\u0442\u0438, <code>ReportBook<\/code> \u0447\u0443\u0442\u044c \u0434\u043e\u043f\u0438\u0448\u0435\u043c):<\/p>\n<pre><code class=\"vbscript\">' \u041c\u043e\u0434\u0443\u043b\u044c App  Dim Collector As IGoodsCollector ' \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u043e\u0440, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u0442\u0438\u043f\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IGoodsCollector Set Collector = GoodsCollectorFactory.GetCollector( _     Kind, Book.GetData(), Book.Columns _ ) ' \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e  Dim Goods As Object: Set Goods = Collector.Collect() ' \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 Collect   ' \u041a\u043b\u0430\u0441\u0441 ReportBook ' \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 read-only \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e Columns Public Property Get Columns() As ReportColumns     Set Columns = this.Columns End Property  Public Property Get Path() As String     Path = this.Path End Property Public Property Let Path(ByVal RHS As String)     this.Path = RHS End Property  Public Function Validate() As TCheckResult     Set this.Book = Workbooks.Open(this.Path)     On Error GoTo Catch     Set this.Columns = NewReportColumns(this.Book.ActiveSheet.UsedRange) Exit Function  Catch:     Validate.HasError = True     Validate.Message = Err.Description     Resume Next End Function  ' \u0418 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e GetData Public Function GetData() As Variant     GetData = this.Book.ActiveSheet.UsedRange.Value End Function<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <code>ReportBook<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e:<\/p>\n<pre><code class=\"vbscript\">Public Sub SaveData(ByRef Goods As Object)     Dim DataSheet As Worksheet: Set DataSheet = this.Book.Worksheets.Add()      Dim Key As Variant     For Each Key In Goods         Dim Name As String: Name = KeySerializer.Parse(Key)(1)         Dim Quantity As Long: Quantity = Goods(Key)          Dim Row As Long: Row = Row + 1         DataSheet.Cells(Row, 1).Value = Name         DataSheet.Cells(Row, 2).Value = Quantity     Next      Dim FileName As String: FileName = GenerateFileName()     this.Book.SaveAs FileName End Sub  Public Sub CloseReport()     this.Book.Close SaveChanges:=False End Sub  Private Function GenerateFileName() As String     Dim FSO As Object: Set FSO = NewFileSystemObject()     Dim FileName As String: FileName = Strings.Format(DateTime.Now, \"ddmmyyhhnn\") &amp; \".xlsx\"      GenerateFileName = FSO.BuildPath(this.Book.Path, FileName) End Function<\/code><\/pre>\n<ol>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043b\u0438\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0432\u0430\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>KeySerializer<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u043e\u0441\u0438\u043c \u0438\u043c\u044f \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043d\u0438\u0433\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>CloseReport<\/code> (<code>Close<\/code> \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e).<\/p>\n<pre><code class=\"vbscript\">    Dim Goods As Object: Set Goods = Collector.Collect()     Book.SaveData Goods     Book.CloseReport      MsgBox \"\u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b.\", vbInformation, \"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e\" ExitSub:     ' \u0427\u0438\u0441\u0442\u044b\u0439 \u0432\u044b\u0445\u043e\u0434     Utils.EnableSetting Exit Sub<\/code><\/pre>\n<h3>\u0418\u0442\u043e\u0433 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>\u041d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435, \u043d\u043e \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439. \u041c\u043e\u0436\u0435\u043c \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<ul>\n<li>\n<p>18 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u0440\u043e\u0442\u0438\u0432 1 \u0443 \u0412\u0430\u0441\u0438<\/p>\n<\/li>\n<li>\n<p>~380 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 (\u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 20 \u0441\u0442\u0440\u043e\u043a, \u0442.\u043a. \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b Rubberduck) \u043f\u0440\u043e\u0442\u0438\u0432 ~100 \u0443 \u0412\u0430\u0441\u0438<\/p>\n<\/li>\n<\/ul>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4da\/726\/883\/4da72688390e891f79bc8a7da91b2f53.png\" alt=\"\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u044f\u0434\u0440\u0430\" title=\"\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u044f\u0434\u0440\u0430\" width=\"388\" height=\"823\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4da\/726\/883\/4da72688390e891f79bc8a7da91b2f53.png\"\/><\/p>\n<div><figcaption>\u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u044f\u0434\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u0432\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0435\u0449\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc8\/5ab\/c63\/bc85abc63ecaee1f5ba18dfcec8e71aa.png\" alt=\"\" title=\"\" width=\"640\" height=\"480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc8\/5ab\/c63\/bc85abc63ecaee1f5ba18dfcec8e71aa.png\"\/><\/figure>\n<blockquote>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u043d\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0440\u0435\u0448\u0430\u0442\u044c \u0432\u0430\u043c. \u042f \u043b\u0438\u0448\u044c \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 VBA \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0418, \u0435\u0441\u0435\u0441\u0441\u043d\u043e, \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043c\u0435\u043b\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435, too much. \u041d\u043e \u0432\u0441\u0435 \u043f\u043e\u0437\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438. \u042f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438 \u0435\u0441\u043b\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u044d\u0442\u043e \u043a\u043e\u0434 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u043e\u0434\u0443 \u0412\u0430\u0441\u0438), \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c.<\/p>\n<\/blockquote>\n<p>\u041a\u043e\u0434 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438: <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: <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><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438!?<\/strong><\/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\/810289\/\"> https:\/\/habr.com\/ru\/articles\/810289\/<\/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<figure class=\"\"><\/figure>\n<p><em>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u044f \u0431\u044b \u043e\u0442\u0434\u0430\u043b \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e. \u0422\u043e\u0433\u0434\u0430, \u044f \u0440\u044b\u043b \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 VBA \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u043e \u0442\u043e\u043b\u043a\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b.<\/em><\/p>\n<p>\u0412\u0441\u0435\u0445 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e! \u041d\u0430\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u0447\u0430\u0439, \u043d\u0430\u0440\u0435\u0437\u0430\u0439\u0442\u0435 \u0431\u0443\u0442\u0435\u0440\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0430\u0441 \u0436\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u043e\u0435, \u043d\u0443\u0434\u043d\u043e\u0435 \u0447\u0442\u0438\u0432\u043e, \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0427\u0442\u0438\u0432\u043e \u043f\u0440\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430.<\/p>\n<h4>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/h4>\n<blockquote>\n<ol>\n<li>\n<p><strong>\u0412\u0435\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043b\u0438\u0447\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u042f \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0445\u043e\u0447\u0443 \u043e\u0441\u043a\u043e\u0440\u0431\u0438\u0442\u044c\/\u0443\u043d\u0438\u0437\u0438\u0442\u044c\/\u043e\u0431\u0438\u0434\u0435\u0442\u044c.<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>\u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u0438\u0441\u0442\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438, \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u0430\u043c \u0437\u0430\u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u0441\u044f<\/strong><\/p>\n<\/li>\n<\/ol>\n<\/blockquote>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0443\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043d\u043e\u0436\u0438 \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c!<\/p>\n<p><sub>\u041f\u043e\u043b\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 github.<\/sub><\/p>\n<figure class=\"\"><\/figure>\n<h3>\u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e-\u0442\u043e?<\/h3>\n<p>\u041d\u0443 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a \u043d\u0430\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0438\u0437 \u0441\u043c\u0435\u0436\u043d\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u0430 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442:<br \/>&#8212; \u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441, \u0412\u0430\u0441\u044f \u041f\u0443\u043f\u043a\u0438\u043d \u0434\u0435\u043b\u0430\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0432\u043e\u043b\u0438\u043b\u0441\u044f \u0441\u0442\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0422\u0430\u043a \u0432\u043e\u0442 \u043e\u043d \u0447\u0435\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0413\u043b\u044f\u043d\u044c, \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u0422\u0417 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435:<\/p>\n<p><em>\u041d\u0443\u0436\u043d\u043e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435) \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0442\u043e\u0432\u0430\u0440\u0430\u043c\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 20 (\u044d\u0442\u043e \u044f \u0441\u0430\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a), \u043f\u0440\u043e\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438 (\u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0439 \u0437\u0430\u0447\u0435\u043c) \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043a\u043d\u0438\u0433\u0435 \u043d\u0430 \u043d\u043e\u0432\u043e\u043c \u043b\u0438\u0441\u0442\u0435 \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a. \u0421\u0430\u043c\u0443 \u043a\u043d\u0438\u0433\u0443 \u043f\u0435\u0440\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c &#8212; \u0434\u0434\u043c\u043c\u0433\u0433\u0447\u0447\u043c\u043c.xlsx. \u0412\u043e\u0442.<\/em><\/p>\n<p><em>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 (\u043f\u0440\u0438\u043c\u0435\u0440):<\/em><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u2116 \u043f\/\u043f<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">\u0410\u0440\u0442\u0438\u043a\u0443\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0434\u0438\u043d\u0438\u0446\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">123654<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0432\u0430\u04401<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0433<\/p>\n<\/td>\n<td>\n<p align=\"left\">20<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">654123<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u0432\u0430\u04402<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0448\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">15<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0444\u0430\u0439\u043b data.xlsx \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u0442\u0430\u043a\u0438\u043c \u0432\u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u044d\u0442\u043e \u0436 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0442\u0443\u0442 \u0432\u0441\u0435 \u044f\u0441\u043d\u043e. \u0422\u043e\u0432\u0430\u0440\u0438\u0449 \u041f\u0443\u043f\u043a\u0438\u043d \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0438 \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u0438.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441. \u041f\u0435\u0440\u0432\u043e\u0435 \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u2013 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u041d\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439, \u043d\u0435 \u043f\u043e\u0431\u043e\u044e\u0441\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0430 \u0447\u0435, \u0432\u0441\u0435 \u0436 \u043f\u043e\u043d\u044f\u0442\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u0433\u0440\u0443\u0434\u044c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u0434\u0443\u0445\u0430 \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c VBE.<\/p>\n<h3>\u041d\u0435  \u0434\u043b\u044f \u0441\u043b\u0430\u0431\u043e\u043d\u0435\u0440\u0432\u043d\u044b\u0445<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 ProjectExplorer \u0434\u0430\u0431\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c, \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438, \u043a\u043b\u0430\u0441\u0441\u044b \u0435\u0441\u0442\u044c&#8230;<\/p>\n<figure class=\"\">\n<div><figcaption>\u0430, \u0442\u0443\u0442 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><\/figure>\n<p>\u0423\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043a \u0447\u0435\u043c\u0443 \u0432\u0441\u0435 \u0438\u0434\u0435\u0442, \u0434\u0430?<\/p>\n<p>\u0412 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <code>\u041b\u0438\u0441\u04421<\/code> \u0438 \u0435\u0433\u043e \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vbscript\">Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)     If Target.Address = \"$B$1\" Then         With Application.FileDialog(msoFileDialogFilePicker)             .AllowMultiSelect = False             .ButtonName = \"\u0412\u044b\u0431\u0440\u0430\u0442\u044c\"             .Show             If .SelectedItems.Count > 0 Then                 Worksheets(1).Range(\"B1\").Value = .SelectedItems.Item(1)                 Cancel = True             End If         End With     End If End Sub<\/code><\/pre>\n<p>\u041d\u0443 \u0432 \u0446\u0435\u043b\u043e\u043c.. \u041b\u0430\u0434\u043d\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n<p>\u0414\u0430\u043c\u044b \u0438 \u0433\u043e\u0441\u043f\u043e\u0434\u0430, <code>Module1<\/code>:<\/p>\n<pre><code class=\"vbscript\">Sub \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430()     Application.ScreenUpdating = False     Application.Calculation = xlCalculationManual      Dim f As String, bm As Boolean     Dim twb, workb As Workbook     Dim sh As Worksheet     Dim lr As Long, lc As Long, i As Long, ii As Long, iii As Long     Dim arr     Dim tovary_cotoryx_bolshe_than_20 As Object: Set tovary_cotoryx_bolshe_than_20 = CreateObject(\"Scripting.Dictionary\")     Dim tovary_cotoryx_menshe_chem_20 As Object: Set tovary_cotoryx_menshe_chem_20 = CreateObject(\"Scripting.Dictionary\")     Dim q, v, g     Dim sh2 As Worksheet      f = Sheets(1).Range(\"B1\").Value     bm = Sheets(1).Range(\"B2\").Value = \"0\"          If Len(f) = 0 Then         MsgBox \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      Set twb = ThisWorkbook     Workbooks.Open f     Set workb = ActiveWorkbook     Set sh = workb.ActiveSheet      If sh.Range(\"B1\").Value &lt;> \"\u0410\u0440\u0442\u0438\u043a\u0443\u043b\" And sh.Range(\"B1\").Value &lt;> \"\u0410\u0420\u0422\u0418\u041a\u0423\u041b\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If LCase(sh.Range(\"C1\").Value) &lt;> \"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If sh.Range(\"E1\").Value Like \"*\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" = False Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      lr = workb.ActiveSheet.Rows(Rows.Count).End(xlUp).Row     lc = workb.ActiveSheet.Columns(Columns.Count).End(xlToLeft).Column     arr = workb.ActiveSheet.Range(Cells(1, 1), Cells(lr, lc)).Value      For i = 1 To lr         If IsNumeric(arr(i, 5)) Then             If arr(i, 5) > 20 Then                 If tovary_cotoryx_bolshe_than_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_bolshe_than_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                          ElseIf arr(i, 5) = 0 Then                          Else                                  If tovary_cotoryx_menshe_chem_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_menshe_chem_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                  End If         End If     Next      workb.Sheets.Add     Set sh2 = workb.Sheets(1)      If bm Then         v = tovary_cotoryx_bolshe_than_20.Items()         g = tovary_cotoryx_bolshe_than_20.Keys()     Else         v = tovary_cotoryx_menshe_chem_20.Items()         g = tovary_cotoryx_menshe_chem_20.Keys()     End If     For ii = LBound(g) To UBound(g)         sh2.Cells(ii + 1, 1).Value = Split(g(ii), \";\")(0)         sh2.Cells(ii + 1, 2).Value = Split(g(ii), \";\")(1)     Next     For iii = LBound(v) To UBound(v)         sh2.Cells(iii + 1, 3).Value = v(iii)     Next      workb.SaveAs twb.Path &amp; \"\\\" &amp; Format(Now, \"ddmmyyhhnn\") &amp; \".xlsx\"      workb.Close False          MsgBox \"\u0413\u043e\u0442\u043e\u0432\u043e!\", vbInformation, \"\u0413\u043e\u0442\u043e\u0432\u043e\"     Application.ScreenUpdating = True     Application.Calculation = xlCalculationAutomatic End Sub<\/code><\/pre>\n<blockquote>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442! <strong>\u00a9<\/strong>  \u0412.\u041f\u0443\u043f\u043a\u0438\u043d<\/p>\n<\/blockquote>\n<h3>\u0410 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f?<\/h3>\n<p>\u0414\u0430\u044e \u0432\u0430\u043c 2 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0448\u043b\u043e&#8230;<\/p>\n<figure class=\"\">\n<div><figcaption>\u0418\u0434\u0438\u0442\u0435-\u0438\u0434\u0438\u0442\u0435,  \u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0443.<\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u043e\u0434\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"vbscript\">Sub \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430() ' \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435     Application.ScreenUpdating = False     Application.Calculation = xlCalculationManual      ' \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b     Dim f As String, bm As Boolean     Dim twb, workb As Workbook ' \u043d\u0435 \u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432     Dim sh As Worksheet     Dim lr As Long, lc As Long, i As Long, ii As Long, iii As Long     Dim arr   ' \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0430 \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0441\u043b\u043e\u0432     Dim tovary_cotoryx_bolshe_than_20 As Object: Set tovary_cotoryx_bolshe_than_20 = CreateObject(\"Scripting.Dictionary\")     Dim tovary_cotoryx_menshe_chem_20 As Object: Set tovary_cotoryx_menshe_chem_20 = CreateObject(\"Scripting.Dictionary\")     Dim q, v, g     Dim sh2 As Worksheet   ' \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435    ' \u041d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0438 \u0437\u0430\u0447\u0435\u043c     f = Sheets(1).Range(\"B1\").Value     bm = Sheets(1).Range(\"B2\").Value = \"0\"          If Len(f) = 0 Then         MsgBox \"\u041f\u0443\u0442\u044c \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"       ' \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0431\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 ScreenUpdating \u0438 \u0430\u0432\u0442\u043e\u0440\u0430\u0441\u0447\u0435\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u0443\u043b         Exit Sub     End If      ' \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ThisWorkBook     Set twb = ThisWorkbook     Workbooks.Open f     Set workb = ActiveWorkbook     Set sh = workb.ActiveSheet      If sh.Range(\"B1\").Value &lt;> \"\u0410\u0440\u0442\u0438\u043a\u0443\u043b\" And sh.Range(\"B1\").Value &lt;> \"\u0410\u0420\u0422\u0418\u041a\u0423\u041b\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If LCase(sh.Range(\"C1\").Value) &lt;> \"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435\" Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      If sh.Range(\"E1\").Value Like \"*\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\" = False Then         MsgBox \"\u041d\u0435 \u0432\u0435\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0444\u0430\u0439\u043b\u0430!\", vbCritical, \"\u041e\u0448\u0438\u0431\u043a\u0430\"         Exit Sub     End If      lr = workb.ActiveSheet.Rows(Rows.Count).End(xlUp).Row     lc = workb.ActiveSheet.Columns(Columns.Count).End(xlToLeft).Column     arr = workb.ActiveSheet.Range(Cells(1, 1), Cells(lr, lc)).Value        For i = 1 To lr         If IsNumeric(arr(i, 5)) Then             If arr(i, 5) > 20 Then                 ' \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c                 ' \u0414\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430                 If tovary_cotoryx_bolshe_than_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_bolshe_than_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_bolshe_than_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                          ElseIf arr(i, 5) = 0 Then                          Else                                  If tovary_cotoryx_menshe_chem_20.Exists(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = True Then                     q = tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = arr(i, 5)                     tovary_cotoryx_menshe_chem_20(arr(i, 2) &amp; \";\" &amp; arr(i, 3)) = q                 Else                     tovary_cotoryx_menshe_chem_20.Add arr(i, 2) &amp; \";\" &amp; arr(i, 3), arr(i, 5)                 End If                  End If         End If     Next      workb.Sheets.Add     Set sh2 = workb.Sheets(1)      If bm Then         v = tovary_cotoryx_bolshe_than_20.Items()         g = tovary_cotoryx_bolshe_than_20.Keys()     Else         v = tovary_cotoryx_menshe_chem_20.Items()         g = tovary_cotoryx_menshe_chem_20.Keys()     End If     For ii = LBound(g) To UBound(g)         sh2.Cells(ii + 1, 1).Value = Split(g(ii), \";\")(0)         sh2.Cells(ii + 1, 2).Value = Split(g(ii), \";\")(1)     Next     For iii = LBound(v) To UBound(v)         sh2.Cells(iii + 1, 3).Value = v(iii)     Next      workb.SaveAs twb.Path &amp; \"\\\" &amp; Format(Now, \"ddmmyyhhnn\") &amp; \".xlsx\"      workb.Close False          MsgBox \"\u0413\u043e\u0442\u043e\u0432\u043e!\", vbInformation, \"\u0413\u043e\u0442\u043e\u0432\u043e\"     Application.ScreenUpdating = True     Application.Calculation = xlCalculationAutomatic ' \u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b ' \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 End Sub<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<blockquote>\n<p><em>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0435\u043c\u0430\u0440\u043a\u0430:<\/em><\/p>\n<ol>\n<li>\n<p><em>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0432\u0435\u0441\u044c<\/em><\/p>\n<\/li>\n<\/ol>\n<\/blockquote>\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-374629","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374629","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=374629"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/374629\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=374629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=374629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=374629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}