<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ProductivityBlog.com.ua &#187; VBA</title>
	<atom:link href="http://productivityblog.com.ua/?feed=rss2&#038;tag=vba" rel="self" type="application/rss+xml" />
	<link>http://productivityblog.com.ua</link>
	<description>Поради з підвищення персональної продуктивності за допомогою програмного забезпечення і онлайнових сервісів</description>
	<lastBuildDate>Tue, 31 Mar 2026 13:41:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		
	<item>
		<title>Власні функції в Excel: зроби один раз і користуйся постійно!</title>
		<link>http://productivityblog.com.ua/?p=1839</link>
		<comments>http://productivityblog.com.ua/?p=1839#comments</comments>
		<pubDate>Wed, 17 Oct 2012 12:47:22 +0000</pubDate>
		<dc:creator>Alexander Babich</dc:creator>
				<category><![CDATA[MS Office]]></category>
		<category><![CDATA[навчання]]></category>
		<category><![CDATA[програмне забезпечення]]></category>
		<category><![CDATA[продуктивність]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[macros]]></category>
		<category><![CDATA[training]]></category>
		<category><![CDATA[VBA]]></category>

		<guid isPermaLink="false">http://productivityblog.com.ua/?p=1839</guid>
		<description><![CDATA[Доброго дня, друзі!
Сьогодні вночі я повернувся з Києва, де проводив черговий тренінг – цього разу з програмування мовою VBA у середовищі Microsoft Excel.
Дуже часто запитання, отримані під час тренінгу, наштовхують на роздуми і в результаті я пишу повідомлення в блог. Ось і сьогодні мені хочеться дати коротку пораду тим, кому часто доводиться писати в Excel [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Доброго дня, друзі!</p>
<p align="justify">Сьогодні вночі я повернувся з Києва, де проводив черговий тренінг – цього разу з програмування мовою VBA у середовищі Microsoft Excel.</p>
<p align="justify">Дуже часто запитання, отримані під час тренінгу, наштовхують на роздуми і в результаті я пишу повідомлення в блог.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /> Ось і сьогодні мені хочеться дати коротку пораду тим, кому часто доводиться писати в Excel одні й ті ж довгі формули – перенести їх до VBA і зекономити собі час наступного разу.</p>
<p align="justify"><a href="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_thumb.png" width="416" height="520" /></a></p>
<p align="justify">Не хвилюйтесь – для цього не потрібно бути програмістом – у більшості випадків, користуючись моїми інструкціями, ви легко впораєтесь самотужки.Якщо ж щось не виходить – просто <a title="Спонсорство ProductivityBlog.com.ua" href="mailto:alexander.taurus@gmail.com" target="_blank">зв’яжіться зі мною</a>.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /></p>
<p>  <span id="more-1839"></span>
<p align="justify">Розповідати краще на прикладі.Тож почнемо ми з розгляду такого сценарію. Уявіть собі, що ви обробляєте анкети зворотнього зв’язку &#8211; підраховуєте середні бали, якими учасники тренінгу або семінару оцінили якість навчальних матеріалів, адекватність обладнання, рівень організації заходу, ваші викладацькі якості тощо.</p>
<p align="justify">Давайте також уявимо, що обчислюємо середній бал ми за таким правилом – відкидаємо найбільшу і найменшу оцінки, а те, що зосталось усереднюємо.</p>
<p align="justify">Для розрахунків середнього балу, за припущення, що оцінки знаходяться у комірках <strong>А1:А25</strong>, вам доведеться написати формулу на кшталт такої:</p>
<blockquote><p align="justify">=(SUM(A1:A25)-MIN(A1:A25)-MAX(A1:A25))/(COUNT(A1:A25)-2)</p>
</blockquote>
<p align="justify">Звичайно, ви можете справедливо розкритикувати такий спосіб розрахунків, однак ще раз повторюю – це чисто гіпотетичний сценарій, приклад, який я щойно вигадав.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /> </p>
<p align="justify">Формула, яку я навів, досить невеличка, однак якщо вам треба ввести її для обчислення оцінок різних аспектів заходу хоча б з десяток разів, ви вже замислитесь про те, як би її скоротити!</p>
<p align="justify">І дійсно, вихід є – один раз створити власну функцію на VBA – мові програмування, вбудованій в Excel &#8211; і потім користуватись нею весь час. Але як це зробити?</p>
<p align="justify">Почнемо з виклику середовища розробки VBA – натиснемо <strong>Alt+F11</strong>. Ви маєте побачити щось подібне:</p>
<p align="justify"><a href="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_thumb_3.png" width="589" height="399" /></a></p>
<p align="justify">Не лякаємось<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" />, а додаємо новий модуль з кодом. Для цього у меню <strong>Insert</strong> обираємо пункт <strong>Module</strong>:</p>
<p align="justify"><a href="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_thumb_4.png" width="428" height="285" /></a></p>
<p>У результаті відкриється віконце для вводу коду:</p>
<p><a href="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/image_thumb_5.png" width="589" height="399" /></a></p>
<p>Тут ви маєте написати ось такий код (зараз я все поясню):</p>
<blockquote><p>Public Function RealAVG(r As Variant) As Variant</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; RealAVG = (WorksheetFunction.Sum(r) &#8211; WorksheetFunction.Min(r) &#8211; WorksheetFunction.Max(r)) / (WorksheetFunction.Count(r) &#8211; 2)      <br />&#160;&#160;&#160; </p>
<p>End Function</p>
</blockquote>
<p align="justify">Середній рядок (починається з “RealAVG=”) пишемо в один рядок – тут, в блозі він просто не вмістися за шириною запису. Так, в VBA можна переносити рядки (за допомогою пробілу і підкреслення), однак в даному випадку ми обійдесось без цього.</p>
<p align="justify">Все! Тепер ви можете під час роботи в Excel замість довгої формули писати просто:</p>
<blockquote><p align="justify">=RealAVG(A1:A25)</p>
</blockquote>
<p align="justify">Працює так само, але набагато коротше, чи не так?</p>
<p align="justify">Давайте тепер розглянемо код нашої функції аби зрозуміти що є що, і як вам перенести до VBA свої власні формули.</p>
<p align="justify">У першому рядку ми написали, що далі буде опис <strong>публічної</strong> (доступної звідусюди у вашому документі) <strong>функції</strong> з іменем <strong>RealAVG</strong> (“справжнє середнє”). Ім’я ви можете вигадати будь-яке. Лише одна порада – воно має бути красномовним, щоб одразу можна було зрозуміти що робить функція. </p>
<p align="justify">Далі в дужках йдуть параметри – ті початкові дані, які функція буде використовувати для обчислення результату. У нас параметр тільки один – змінна з ім’ям <strong>r</strong> типу <strong>Variant</strong>, тобто її значення може бути будь-яким.&#160; У нашому випадку ми повинні дати функції дійсно один параметр – адресу діапазону з початковими даними. Якщо вам потрібно більше параметрів, опишіть їх так само і через кому.</p>
<p align="justify">Далі ми бачимо слова <strong>As Variant</strong> – це ми говоримо, що результат, який поверне нам функція, може бути будь-якого типу – число, рядок, що завгодно. Аби не морочитись, ви можете описувати подібним чином всі свої функції.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /></p>
<p align="justify">А далі – найцікавіше &#8211; ми описуємо правило обчислення результату. Робиться це просто – пишете ім’я функції, потім знак рівності (тут він означає присвоєння нового значення) і далі – формулу для обчислення. Думаю, ви її впізнали.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /> Єдина відмінність від екселівської формули – замість <strong>SUM</strong> ви пишете <strong>WorksheetFunction.Sum</strong>. Так само чинимо і з іншими функціями. Чому? Думаю, ви вже здогадались – VBA не знає екселівських функцій, тож треба йому сказати, що Sum – це не його власна функція, а одна з тих, які ви можете використовувати у комірках листів книги в Excel. До речі, VBA підтримує не всі з них! Будьте уважними!</p>
<p align="justify">На цьому можна було б і закінчити, але є ще два нюанси:</p>
<p align="justify">Перший: <strong>а що, коли у якості аргумента ви випадкого напишете нісенітницю?</strong> Наприклад, ось так: =RealAVG(&quot;FDDGhhkjk&quot;)</p>
<p align="justify">Хотілося б, щоб у таких випадках функція автоматично інформувала вас про помилки. І це можна зробити! Достатньо змінити вашу функцію таким чином:</p>
<blockquote><p>Public Function RealAVG(r As Variant) As Variant     <br />On Error GoTo Err</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; RealAVG = (WorksheetFunction.Sum(r) &#8211; WorksheetFunction.Min(r) &#8211; WorksheetFunction.Max(r)) / (WorksheetFunction.Count(r) &#8211; 2)</p>
<p>On eroor GoTo 0     <br />Exit Function</p>
<p>Err:     <br />&#160;&#160;&#160; RealAVG = &quot;Wrong function parameter!&quot;      <br />&#160;&#160;&#160; ActiveCell.Font.Color = vbRed      <br />0:</p>
<p>End Function</p>
</blockquote>
<p align="justify">Тепер, якщо результат не вдалось обчислити, функція замість середнього балу виведе червоним кольором напис &quot;Wrong function parameter!&quot;. Думаю, як працює код зрозуміло.<img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://productivityblog.com.ua/images/PostPics/493527a38b21_A85D/wlEmoticon-smile.png" /> Це, звичайно, не ідеал функції, </p>
<p align="justify">Другий нюанс: ви <strong>зможете використовувати цю функцію тільки в межах даного документу</strong>. Аби можна було користуватись нею у будь-якій таблиці, відкритій на вашій машині, треба було зберігати функцію в іншому місці. Але про це – у наступній статті.</p>
<p align="justify">До зустрічі за тиждень!</p>
<div class="bottomcontainerBox" style="border:1px solid #808080; border-radius:5px 5px 5px 5px; box-shadow:2px 2px 5px rgba(0,0,0,0.3);">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fproductivityblog.com.ua%2F%3Fp%3D1839&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:80px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://productivityblog.com.ua/?p=1839"></g:plusone>
			</div>
			<div style="float:left; width:95px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://productivityblog.com.ua/?p=1839"  data-text="Власні функції в Excel: зроби один раз і користуйся постійно!" data-count="horizontal" data-via="liketaurus"></a>
			</div><div style="float:left; width:105px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script type="in/share" data-url="http://productivityblog.com.ua/?p=1839" data-counter="right"></script></div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://productivityblog.com.ua/?p=1839"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://productivityblog.com.ua/?feed=rss2&amp;p=1839</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	
</channel>
</rss>
