O'rnatilgan vba funktsiyalari. VBA Excel. Maxsus funktsiya (sintaksis, komponentlar). VBA-da bir nechta argumentlar bilan funksiya yaratish

VBA-da yozilgan funksiya hisoblashni amalga oshiradigan va qiymatni (yoki qiymatlar massivini) qaytaradigan koddir. Funktsiyani yaratganingizdan so'ng, uni uchta usulda ishlatishingiz mumkin:

  1. Ishchi varaqdagi formula sifatida, u argumentlarni qabul qilishi va qiymatlarni qaytarishi mumkin.
  2. VBA tartibingizning bir qismi sifatida. Sub protsedurada yoki boshqa funktsiyalar ichida.
  3. Shartli formatlash qoidalarida.

Excel allaqachon 450 dan ortiq o'rnatilgan funktsiyalarni o'z ichiga olgan bo'lsa-da, ba'zida ular ham etishmayapti. Ba'zan o'rnatilgan funktsiyalar siz qilmoqchi bo'lgan narsani qila olmaydi. Ba'zan, natijaga erishish uchun siz boshqalarga tushunarsiz bo'lgan ulkan va murakkab formulani yaratishingiz kerak. Bunday holda siz o'qish va ishlatish uchun qulay bo'lgan maxsus funktsiyani yaratishingiz mumkin.

E'tibor bering, VBA bilan yaratilgan foydalanuvchi tomonidan belgilangan funktsiyalar, odatda, o'rnatilgan funktsiyalardan sezilarli darajada sekinroq. Shuning uchun, ular o'rnatilgan funktsiyalar yordamida natijaga erisha olmaydigan yoki ko'p hisoblash bo'lmagan va ishlash jazosi muhim bo'lmagan holatlar uchun eng mos keladi.

O'rnatilgan funksiyalardan nafaqat siz, balki sizning hamkasblaringiz ham foydalanishlari mumkin. Siz yozgan funksiyalar Funktsiya ustasi muloqot oynasida boshqalar bilan birga paydo bo'ladi. Funktsiyalarni yaratish jarayoni sizni qo'rqitishi mumkin, ammo men sizni ishontirib aytamanki, bu juda oddiy.

Protsedura (Sub) va funksiya (Funktsiya) o'rtasidagi farq nima?

Asosiy farq shundaki, protsedura (sub) buyruqlar to'plamini bajarish uchun ishlatiladi va funktsiyadan (funktsiyadan) farqli o'laroq, qiymatni (yoki qiymatlar qatorini) qaytarish uchun mo'ljallanmagan.

Ko'rsatish uchun keling, misol keltiraylik. Misol uchun, 1 dan 100 gacha bo'lgan raqamlar qatori mavjud va siz juftlarni toqlardan ajratishingiz kerak.

(Sub) protsedurasidan foydalanib, siz, masalan, katakchalar bo'ylab o'tishingiz va to'ldirish yordamida g'alati bo'lganlarni ajratib ko'rsatishingiz mumkin. Va funktsiya qo'shni ustunda ishlatilishi mumkin va u qiymat juft yoki yo'qligiga qarab TRUE yoki FALSE qaytaradi. Bular. siz ish varag'idagi funksiya yordamida to'ldirish rangini o'zgartira olmaysiz.

VBA-da foydalanuvchi tomonidan aniqlangan oddiy funktsiyani yaratish

Keling, VBA-da oddiy moslashtirilgan funktsiyani yaratamiz va bularning barchasi qanday ishlashini ko'rib chiqamiz.

Quyida harf qiymatlaridan voz kechib, matndan faqat raqamlarni qoldiradigan funksiyaning kodi keltirilgan.

Funksiya raqamlari(Matn satr sifatida) Long Dim i Kadar Long Dim Natija String sifatida i = 1 To Len(Matn) Agar IsNumeric(Mid(Mat, i, 1)) bo‘lsa, natija = natija & Mid(Matn, i, 1) ) Keyingi raqamlar = CLng (natija) tugatish funktsiyasi

Hamma narsa siz uchun ishlashi uchun siz kiritishingiz kerak bu kod kitob moduliga. Agar buni qanday qilishni bilmasangiz, Excel-da makrosni qanday yozishni maqolasidan boshlang.

Endi funksiya qanday ishlashini ko'rib chiqamiz, keling, uni varaqda ishlatishga harakat qilaylik:

Funktsiyaning o'zini tahlil qilishdan oldin, uning yaratilishidan keyin paydo bo'lgan ikkita yoqimli daqiqaga e'tibor qaratamiz:

  • U har qanday boshqa o'rnatilgan funksiya kabi mavjud bo'ldi (qanday yaratish kerak yashirin funksiya, biz batafsil aytib beramiz).
  • "=" belgisini kiritib, funktsiya nomini yozishni boshlaganingizda, Excel barcha mosliklarni ko'rsatadi va nafaqat o'rnatilgan funktsiyalarni, balki moslashtirilgan funksiyalarni ham ko'rsatadi.

Funktsiyani bosqichma-bosqich tahlil qilaylik

Keling, chuqur sho'ng'in qilaylik va bu xususiyat qanday yaratilganini ko'rib chiqaylik. Funktsiya chiziqdan boshlanadi

Funksiya raqamlari (Matn string sifatida).

So'z Funktsiya funktsiyaning boshlanishi haqida gapiradi, keyin uning nomi, bizning holatlarimizda Raqamlar.

  • Funktsiya nomida bo'shliq bo'lishi mumkin emas. Bundan tashqari, agar funktsiya hujayra mos yozuvlar nomi bilan to'qnashsa, uni chaqira olmaysiz. Masalan, siz ABC123 funksiyasini nomlay olmaysiz, chunki bu nom Excel ish varag'idagi katakka ham tegishli.
  • Funksiyangizga mavjud funksiya bilan bir xil nom bermasligingiz kerak. Agar buni qilsangiz, Excel o'rnatilgan funksiyaga ustunlik beradi.
  • Agar so'zlarni ajratmoqchi bo'lsangiz, pastki chiziq belgisidan foydalanishingiz mumkin. Masalan, Kuirsivdagi suma haqiqiy nomdir.

Nomdan keyin funksiya argumentlari qavs ichida tasvirlangan. O'rnatilganga o'xshash Excel funktsiyalari. Bizning holatlarimizda yagona argument ishlatiladi Matn. Argument nomidan keyin biz ko'rsatdik String sifatida, bu bizning argumentimiz ekanligini anglatadi matn qiymati yoki matn qiymatini o'z ichiga olgan katakka havola. Agar ma'lumotlar turini belgilamasangiz, VBA uni shunday ko'rib chiqadi Variant(ya'ni siz har qanday ma'lumot turidan foydalanishingiz mumkin, VBA buni siz uchun aniqlaydi).

Birinchi qatorning oxirgi qismi As Long funktsiya qaytaradigan ma'lumotlar turini belgilaydi. Bizning holatda, funktsiya butun son qiymatlarini qaytaradi. Bu ham kerak emas.

Funktsiyaning ikkinchi va uchinchi qatorlari biz foydalanadigan qo'shimcha ichki o'zgaruvchilarni e'lon qiladi.

Dim i As Long Dim natija As String

O'zgaruvchan i Biz undan belgilarni sanash uchun foydalanamiz. Oʻzgaruvchi natija funksiyaning oraliq natijasini saqlash uchun.

Funktsiyaning vazifasi Matn o'zgaruvchisidagi barcha belgilarni ko'rib chiqish va faqat raqamlar bo'lganlarni saqlashdir. Shuning uchun biz tsiklni 1 dan oxirgi belgigacha boshlaymiz.

i uchun = 1 Len (Matn)

Len - bu belgilar sonini aniqlaydigan funksiya.

Funktsiyaning asosiy qatori matnning keyingi belgisi raqam ekanligini tekshirish va agar shunday bo'lsa, uni natija o'zgaruvchisida saqlashdir.

Agar IsNumeric (O'rta(Matn, i, 1)) bo'lsa, natija = natija va O'rta (Matn, i, 1)

Buning uchun bizga funksiya kerak IsNumeric- u qaytadi To'g'ri agar matn raqam bo'lsa va Yolg'on aks holda.

Funktsiya O'rta Matn argumentidan oladi i belgi (ma'nosi 1 , funksiya ekanligini bildiradi O'rta faqat 1 belgini oladi)/

Funktsiya Keyingisi- halqani yopadi Uchun bu erda hamma narsa aniq.

Raqamlar = CLng (natija)

Ushbu qator bilan biz matn o'zgaruvchisini aylantiramiz natija, unda argumentning barcha raqamlari mavjud Matn, V raqamli qiymat. Va biz funktsiyamiz qanday natija berishi kerakligini aytamiz Raqamlar.

Kodning oxirgi qatori Tugatish funktsiyasi. Bu VBA ga funksiya kodi shu yerda tugashini bildiruvchi talab qilinadigan kod qatori.

Yuqoridagi kod VBA-da yaratilgan odatiy foydalanuvchi tomonidan belgilangan funksiyaning turli qismlarini tavsiflaydi. Kelgusi maqolalarda biz ushbu elementlarni batafsilroq ko'rib chiqamiz va shuningdek, ko'rib chiqamiz turli yo'llar bilan ijro VBA funktsiyalari Excelda.

Dim nResult As Integer

nMult1 = CInt(InputBox("Birinchi raqamni kiriting: ")) nMult2 = CInt(InputBox("Ikkinchi raqamni kiriting: ")) nResult = fMultiply(nMult1, nMult2)

Selection.InsertAfter nResult Selection.Collapse wdCollapseEnd

4. Kodni sharhlash uchun AutoNew() , ushbu protsedura uchun barcha kodlarni (jumladan, Public Sub AutoNew() va End Sub ) belgilang va Tahrirlash asboblar panelidagi Sharhni bloklash tugmasini bosing.

3.9. O'rnatilgan VBA til funktsiyalari

3.9.1. O'rnatilgan funktsiyalar nima

IN VBA dasturlash tili bir necha o'nlab dasturlarni taqdim etadio'rnatilgan funktsiyalar. Ular VBA tilidagi har qanday dasturda mavjud va biz qaysi dasturiy mahsulotda ekanligimiz muhim emas - Excel, Word, Access yoki, masalan, AutoCAD. Ular juda faol ishlatiladi va ko'p hollarda ularsiz qilolmaysiz. Professional dasturchilar ularni to'liq avtomatik ravishda ishlatishadi, lekin men oddiy foydalanuvchilarga ular bilan tanishish uchun bir necha soat sarflashni maslahat beraman, chunki bu funktsiyalarni bilmasdan ular VBA-da samarali ishlay olmaydilar. Ularni o'rganish foydasiga qo'shimcha dalil shundaki, odatdagidek deyarli bir xil funktsiyalar to'plami topilgan. Visual Basic va VBScript va bir xil nomlar va sintaksisga ega ushbu funktsiyalarning aksariyati boshqa dasturlash tillarida - C++, Delphi, Java, JavaScript va boshqalarda mavjud.

IN VBA yordamida o'rnatilgan funktsiyalar harflar bo'yicha guruhlangan (3.2-rasm).

Kurslarning ko'plab ishtirokchilari savol berishdi: rus tilida ushbu funktsiyalar bo'yicha yordam bormi? Afsuski, men bunday sertifikatni topa olmadim, shuning uchun taqdim etishga harakat qilaman qisqacha ma'lumot bu kitobda. Keyinchalik biz VBA tilining ko'pgina faol qo'llaniladigan funktsiyalari (kosinus yoki tangens kabi matematik funktsiyalar) haqida gaplashamiz. amaliy ish deyarli ishlatilmaydi va biz moliyaviy funktsiyalarni ko'rib chiqmaymiz). Joyni tejash uchun funktsiyalarning to'liq sintaksisi berilmaydi: asosiysi, har bir funktsiya nima qilishini va qanday holatlarda ishlatilishini tushunishdir.

Quyidagi bo'limlardagi funktsiyalar funksionallik bo'yicha guruhlangan. Agar siz ma'lumotni oddiygina funktsiya nomi bilan topishingiz kerak bo'lsa, kitob oxiridagi indeksdan foydalanishingiz mumkin.

Guruch. 3.2. O'rnatilgan funksiyalar yordami

3.9.2. Konvertatsiya va ma'lumotlar turini tekshirish funktsiyalari

VBA dasturlarida qiymatlarni bir ma'lumot turidan boshqasiga aylantirish juda keng tarqalgan. Buni qilish kerak bo'lgan bir nechta odatiy holatlar:

InputBox() orqali foydalanuvchidan qiymat qabul qilishda satr qiymatidan raqamli qiymatga aylantirish;

Sana/vaqt qiymatini foydalanuvchilar kompyuterlaridagi mintaqaviy sozlamalardan qat'iy nazar, sana yoki vaqtni bir xilda ko'rsatishimiz kerak bo'lganda, satr qiymatiga aylantirish;

maxsus sana/vaqt funksiyalaridan foydalanish uchun qiymatni satrdan sana/vaqtga aylantirish.

Ko'pincha ma'lumotlar turlarini o'zgartirish uchun nomi "C" prefiksi (Convert so'zidan) va ma'lumotlar turi nomidan iborat bo'lgan funktsiyalardan foydalaniladi. Bu funksiyalar ro‘yxati quyidagicha: CBool(), CByte(), CCur(), CDate(),

CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate(), CVErr().

Oxir-oqibat nima sodir bo'lganini TypeName() funksiyasidan foydalanib ko'rishingiz mumkin, u ishlatiladigan ma'lumotlar turi nomini qaytaradi, masalan:

nVar1 = CInt(InputBox("Qiymatni kiriting")) MsgBox TypeName(nVar1)

Bunday holda, bu funktsiya "Integer" ni qaytaradi.

Bundan tashqari, konvertatsiya qilish uchun foydali bo'lgan bir nechta boshqa funktsiyalar mavjud.

Str() - raqamli qiymatni satrga aylantirish imkonini beradi. CStr() bilan deyarli bir xil ishlaydi, lekin musbat raqamlardan oldin bo'sh joy qo'yadi.

Val() - raqamlar va harflar aralashmasidan faqat raqamli qiymatni "tashqariga chiqaradi". Bunday holda, funktsiya ma'lumotlarni chapdan o'ngga o'qiydi va birinchi raqamli bo'lmagan qiymatda to'xtaydi (ruxsat etilgan yagona raqamli bo'lmagan qiymat nuqta bo'lib, butun sonni kasr qismidan ajratib turadi). Raqamli ma'lumotlar bilan kesishgan o'lchov birliklarini yoki valyutani yozishda juda qulaydir.

IsNumeric() va IsDate() - konvertatsiya paytida xatolik bo'lmasligi uchun qiymatlarni muvofiqlikni tekshiring. Maxsus qiymatlarga muvofiqligini tekshirish uchun IsArray(), IsEmpty(), funksiyalaridan foydalanishingiz mumkin.

IsError(), IsMissing(), IsNull() va IsObject() . Bu funktsiyalarning barchasi qaytadi

To'g'ri yoki noto'g'ri, ularga berilgan qiymatni tekshirish natijalariga qarab.

Hex() va Oct() - o'nlik ma'lumotlarni o'n oltilik va sakkizlik qiymatlarning qator ko'rinishiga aylantirish.

3.9.3. String funktsiyalari

Bu eng ko'p ishlatiladigan funktsiyalar. Ular doimo kerak va ularni juda yaxshi bilish kerak.

Asc() - bu funksiya o'tgan belgi uchun raqamli kodni qaytarish imkonini beradi. Masalan, Asc("D") 68 ni qaytaradi. Bu funksiya keyingi yoki oldingi harfni aniqlash uchun foydalidir. Odatda qarama-qarshi amalni bajaradigan Chr() funksiyasi bilan birgalikda ishlatiladi - u o'zining raqamli kodiga muvofiq belgini qaytaradi. Masalan, Excel-dagi ushbu kod rus alifbosining harflarini A dan U gacha A1 dan A20 gacha bo'lgan katakchalarga ketma-ket yozishga imkon beradi:

Dim n, nCharCode sifatida butun son n = 1

nCharCode = Asc("A") Do while n<= 20

ActiveWorkbook.ActiveSheet.Range("A" & n).Qiymat = Chr(nCharCode)

VBA sintaksisi va dasturlash konstruksiyalari

nCharCode = nCharCode + 1 tsikl

Bu funksiyaning variantlari AscB() va AscW(). AscB() belgi uchun raqamli kodning faqat birinchi baytini qaytaradi, AscW() esa belgi uchun Unicode kodini qaytaradi.

Chr() - belgini raqamli kodi bilan qaytaradi. Asc() funksiyasi bilan birgalikda ishlatilishiga qo'shimcha ravishda (oldingi misolga qarang), siz yana bitta vaziyatda usiz ishlay olmaysiz: xizmat belgisini chiqarish kerak bo'lganda. Misol uchun, Word dasturida "Gazprom" qiymatini (tirnoq ichida) yozishimiz kerak. Iqtibos - bu xizmat belgisi va qatordan foydalanishga urinish:

Tanlash.Matn = ""Gazprom""

sintaksis xatosiga olib keladi. Va hamma narsa yaxshi bo'ladi:

Tanlash.Matn = Chr(34) & "Gazprom" & Chr(34)

Bu funksiyaning variantlari mavjud - ChrB() va ChrW(). Ular Asc() funksiyasi uchun bir xil variantlarga o'xshash ishlaydi.

InStr() va InStrRev() eng mashhur funksiyalardandir. Satr oʻzgaruvchisi tanasidagi belgilar ketma-ketligini aniqlash va uning oʻrnini qaytarish imkonini beradi. Agar ketma-ketlik topilmasa, InStr() funksiyasi satr boshidan izlaydi, InStrRev() esa oxiridan qaytariladi.

Left() , Right() , Mid() - mos ravishda chap, o'ng yoki o'rtadagi mavjud satr o'zgaruvchisidan ko'rsatgan belgilar sonini olish imkonini beradi.

Len() - satrdagi belgilar sonini (satr uzunligi) qaytaradi. Ko'pincha looplar, almashtirish operatsiyalari va boshqalar bilan ishlatiladi.

LCase() va UCase() - satrni mos ravishda kichik va katta harflarga aylantiradi. Ko'pincha muhim bo'lmagan holatlarda taqqoslash uchun qiymatlarni tayyorlash uchun foydalaniladi (familiyalar, kompaniyalar, shaharlar va boshqalar).

LSet() va RSet() - bir o'zgaruvchini uzunligini o'zgartirmasdan boshqasining belgilari bilan to'ldirish (mos ravishda chap va o'ng). Qo'shimcha belgilar kesiladi va etishmayotgan belgilar o'rniga bo'sh joylar qo'yiladi.

LTrim() , RTrim() , Trim() - mos ravishda chap, o'ng yoki ikkala chap va o'ngdagi bo'shliqlarni olib tashlash.

Replace() - satrdagi bir belgilar ketma-ketligini boshqasiga almashtiradi.

Space() va String() - mos ravishda siz belgilagan bo'shliqlar yoki belgilar soni qatorini qaytaradi. Odatda shakllantirish uchun ishlatiladi

Funktsiya-protsedura natijani qaytaruvchi VBA protsedurasining maxsus turi. VBA o'rnatilgan funktsiyalari kabi foydalanuvchi tomonidan belgilangan protsedura funktsiyalari ixtiyoriy va nomlangan argumentlarga ega bo'lishi mumkin. Protsedura funksiyasini yozib olish uchun siz so'l yozuvchisidan foydalana olmaysiz, garchi siz magnitafon tomonidan yozilgan makrosni tahrirlashingiz va uni protsedura funksiyasiga aylantirishingiz mumkin.

Funktsiya protsedurasining boshqa protseduralardan asosiy farqi, funksiyalar qiymat qaytaradi, protseduralar esa qaytarmaydi, bundan tashqari, funktsiya protsedurasi kalit so'zlardan foydalanadi. Funktsiya Va Tugatish funktsiyasi.

Sintaksis:

Funktsiya nomi()
"VBA bayonotlari
Tugatish funktsiyasi

Funktsiya - bu funktsiyaning boshlanishini e'lon qiluvchi kalit so'z.

Ism - funktsiya nomi. Funktsiya nomlari boshqa VBA identifikatorlari nomlari bilan bir xil qoidalarga amal qiladi.

Arglist - bu funktsiya uchun argumentlar ro'yxati, ixtiyoriy element.

Turi - har qanday turdagi funktsiyani qaytarish qiymati. Agar tur aniqlanmagan bo'lsa, protsedura funktsiyasi tomonidan qaytariladigan natija Variant turiga kiradi.

Ism = ifoda VBA ga funksiya qaysi qiymatni qaytarishi kerakligini aytadigan funksiya topshirigʻi, ixtiyoriy element. Biroq, har doim protsedura funktsiyalariga tayinlash operatorini kiritishingiz kerak.

End Function - funktsiyani tugatuvchi kalit so'zlar.


Funktsiyada argumentlar bo'lmasa ham (masalan, Hozir, Sana), funksiya e'lonida qavslardan foydalanish kerak.

Odatda funktsiya hisoblashni amalga oshirish va natijani qaytarish uchun mo'ljallangan. Protsedura funksiyasini e'lon qilishda siz funktsiyaga uzatiladigan har bir argument nomini ko'rsatasiz. Ro'yxatdagi argument nomlari vergul bilan ajratilgan va har qanday VBA identifikatoriga tegishli qoidalarga amal qilishi kerak.


Quyida bosh va keyingi bo'shliqlarni olib tashlaydigan va ifodadagi belgilar sonini hisoblaydigan oddiy protsedura funksiyasidan foydalanish ro'yxati keltirilgan.



Funktsiyadan foydalanmasdan, ro'yxat quyidagicha ko'rinadi:



Ushbu oddiy misoldan, menimcha, protsedura funktsiyalaridan foydalanishning asosiy g'oyasi aniq - dastur kodini o'qishni yaxshilash va uni qisqartirish (boshqacha qilib aytganda, protsedura funktsiyasi bir xil kod "bo'lagi" 2 dan ortiq paydo bo'lganda yoziladi. dastur kodida -3 marta). Haqiqatan ham, agar bizning protsedura funksiyamiz bir qatordan emas, balki, aytaylik, 10 qatordan iborat bo'lsa; va dastur kodi ushbu protsedura funktsiyasidan 5 marta foydalanadi, keyin umumiy dastur ro'yxati 38 qatorga qisqaroq bo'ladi.


Yuqorida aytib o'tilganidek, VBA barcha argumentlarni Variant turlari sifatida funktsiya protsedurasiga o'tkazadi. Argumentlar ro'yxatidagi har bir argument uchun maxsus ma'lumotlar turlarini e'lon qilishingiz mumkin.

O'zingizning VBA funktsiyalaringizni yaratishni boshlashdan oldin, Excel VBA-da kod yozishda foydalanishingiz mumkin bo'lgan oldindan o'rnatilgan o'rnatilgan funktsiyalarning katta to'plami borligini bilish foydali bo'ladi.

Ushbu funktsiyalar ro'yxatini VBA muharririda ko'rish mumkin:

  • Excel ish kitobini oching va VBA muharririni ishga tushiring (bu yerni bosing Alt+F11) va keyin bosing F2.
  • Ekranning yuqori chap qismidagi ochiladigan ro'yxatdan kutubxonani tanlang VBA.
  • O'rnatilgan VBA sinflari va funktsiyalari ro'yxati paydo bo'ladi. Oynaning pastki qismida uning qisqacha tavsifini ko'rsatish uchun funksiya nomini bosing. Bosish F1 ushbu funksiya uchun onlayn yordam sahifasini ochadi.

Bundan tashqari, misollar bilan o'rnatilgan VBA funktsiyalarining to'liq ro'yxatini Visual Basic Developer Center veb-saytida topish mumkin.

VBA-da maxsus funksiya va pastki protseduralar

Excel Visual Basic dasturida ma'lum bir vazifani bajaradigan buyruqlar to'plami protseduraga joylashtirilgan Funktsiya(funktsiya) yoki Sub(Ichki dastur). Jarayonlar orasidagi asosiy farq Funktsiya Va Sub protsedura shu Funktsiya natijani, protsedurani qaytaradi Sub- Yo'q.

Shuning uchun, agar siz harakatlarni bajarishingiz va biron bir natija olishingiz kerak bo'lsa (masalan, bir nechta raqamlarni yig'ing), unda protsedura odatda qo'llaniladi. Funktsiya, va oddiygina ba'zi amallarni bajarish uchun (masalan, hujayralar guruhining formatini o'zgartirish) protsedurani tanlashingiz kerak. Sub.

Argumentlar

Argumentlar yordamida VBA protseduralariga turli ma'lumotlar uzatilishi mumkin. Argumentlar ro'yxati protsedura e'lon qilinganda ko'rsatiladi. Masalan, protsedura Sub VBA da tanlangan diapazondagi har bir katakka belgilangan butun sonni (Integer) qo'shadi. Ushbu raqamni argument yordamida protseduraga o'tkazishingiz mumkin, masalan:

Sub AddToCells(i Integer) ... End Sub

E'tibor bering, protseduralar uchun argumentlar mavjud Funktsiya Va Sub VBA-da ixtiyoriy. Ba'zi protseduralar argumentlarni talab qilmaydi.

Ixtiyoriy argumentlar

VBA protseduralari ixtiyoriy argumentlarga ega bo'lishi mumkin. Bu argumentlar bo'lib, agar foydalanuvchi xohlasa, belgilashi mumkin va agar ular o'tkazib yuborilsa, protsedura ular uchun standart qiymatlardan foydalanadi.

Oldingi misolga qaytsak, ixtiyoriy funktsiyaga butun son argumentini qo'shish uchun siz uni quyidagicha e'lon qilasiz:

Sub AddToCells(Ixtiyoriy i Butun son = 0)

Bunday holda, butun son argumenti i standart 0 bo'ladi.

Protsedurada bir nechta ixtiyoriy argumentlar bo'lishi mumkin, ularning barchasi argumentlar ro'yxatining oxirida keltirilgan;

Argumentlarni qiymat va mos yozuvlar bo'yicha uzatish

VBA-dagi argumentlar protseduraga ikki usulda uzatilishi mumkin:

  • ByVal- argumentni qiymat bo'yicha uzatish. Demak, protseduraga faqat qiymat (ya’ni argument nusxasi) uzatiladi va shuning uchun protsedura ichida argumentga kiritilgan har qanday o‘zgartirishlar u chiqqanda yo‘qoladi.
  • Ref– argumentni havola orqali berish. Ya'ni, argumentni xotirada joylashtirishning haqiqiy manzili protseduraga uzatiladi. Protsedura ichida argumentga kiritilgan har qanday o'zgarishlar protsedura tugagandan so'ng saqlanadi.

Kalit so'zlardan foydalanish ByVal yoki Ref Protsedura deklaratsiyasida siz argumentning protseduraga qanday uzatilishini aniq belgilashingiz mumkin. Bu quyida misollar bilan tasvirlangan:

Esda tutingki, VBA-dagi argumentlar sukut bo'yicha mos yozuvlar orqali uzatiladi. Boshqacha qilib aytganda, agar kalit so'zlar ishlatilmasa ByVal yoki Ref, keyin argument havola orqali uzatiladi.

Jarayonlarni o'rganishni davom ettirishdan oldin Funktsiya Va Sub Batafsilroq, ushbu ikki turdagi protseduralar o'rtasidagi xususiyatlar va farqlarni yana bir bor ko'rib chiqish foydali bo'ladi. Quyida VBA protseduralarining qisqacha muhokamasi keltirilgan Funktsiya Va Sub va oddiy misollar ko'rsatilgan.

VBA protsedurasi "Funktsiya"

VBA muharriri protsedurani taniydi Funktsiya

Function...End Function

Yuqorida aytib o'tilganidek, protsedura Funktsiya VBA-da (farqli ravishda Sub), qiymatni qaytaradi. Qaytish qiymatlari uchun quyidagi qoidalar qo'llaniladi:

  • Qaytish qiymatining ma'lumotlar turi protsedura sarlavhasida e'lon qilinishi kerak Funktsiya.
  • Qaytish qiymatini o'z ichiga olgan o'zgaruvchi protsedura bilan bir xil nomlanishi kerak Funktsiya. Bu o'zgaruvchini alohida e'lon qilish shart emas, chunki u har doim protseduraning ajralmas qismi sifatida mavjud. Funktsiya.

Bu quyidagi misolda mukammal tarzda tasvirlangan.

"Funktsiya" VBA protsedurasiga misol: 3 ta raqam bilan matematik operatsiyani bajarish

Quyida VBA protsedura kodi misoli keltirilgan Funktsiya, u uchta turdagi argumentni oladi Ikki marta(ikki aniqlikdagi suzuvchi nuqta raqamlari). Natijada, protsedura boshqa turdagi raqamni qaytaradi Ikki marta, birinchi ikkita argument yig‘indisidan uchinchi argumentni ayirib tashlagan holda teng:

Funktsiya SumMinus(dNum1 Double, dNum2 Double, dNum3 Double) As Double SumMinus = dNum1 + dNum2 - dNum3 End Function

Bu juda oddiy VBA protsedurasi Funktsiya argumentlar orqali ma'lumotlarning protseduraga qanday uzatilishini ko'rsatadi. Jarayon tomonidan qaytarilgan ma'lumotlar turi sifatida aniqlanganligini ko'rishingiz mumkin Ikki marta(so'zlar buni aytadi Double sifatida argumentlar ro'yxatidan keyin). Ushbu misol, shuningdek, protsedura natijasi qanday ekanligini ko'rsatadi Funktsiya protsedura nomi bilan bir xil nomdagi o'zgaruvchida saqlanadi.

VBA protsedurasini chaqirish "Funktsiya"

Yuqorida muhokama qilingan oddiy protsedura bo'lsa Funktsiya Visual Basic muharririda modulga kiritilgan, uni boshqa VBA protseduralaridan chaqirish yoki Excel ish kitobidagi ish varag'ida ishlatish mumkin.

VBA protsedurasini boshqa protseduradan "Funktsiya" ga chaqirish

Jarayon Funktsiya boshqa VBA protsedurasidan oddiygina ushbu protsedurani o'zgaruvchiga tayinlash orqali chaqirilishi mumkin. Quyidagi misol protseduraga qo'ng'iroqni ko'rsatadi SumMinus, bu yuqorida tavsiflangan edi.

Sub main() Xira jami ikki marta jami = SumMinus(5, 4, 3) End Sub

VBA protsedurasini ishchi varaqdan "Funktsiya" deb chaqirish

VBA protsedurasi Funktsiya Excel ish varag'idan boshqa o'rnatilgan Excel funksiyasi kabi chaqirilishi mumkin. Shuning uchun, oldingi misolda yaratilgan protsedura FunktsiyaSumMinus quyidagi ifodani ishchi varaq katakchasiga kiritish orqali chaqirish mumkin:

Summinus(10, 5, 2)

VBA protsedurasi "Sub"

VBA muharriri bu protsedura ekanligini tushunadi Sub, u quyidagi ochilish va yopish iboralari o'rtasida joylashgan buyruqlar guruhiga duch kelganida:

Sub...End Sub

VBA protsedurasi "Sub": 1-misol. Tanlangan hujayralar oralig'ida markazga moslashtirish va shrift hajmini o'zgartirish

Keling, oddiy VBA protsedurasining misolini ko'rib chiqaylik Sub, uning vazifasi tanlangan hujayralar diapazonini formatlashni o'zgartirishdir. Hujayralar markazga (vertikal va gorizontal) moslashtiriladi va shrift o'lchami foydalanuvchi tomonidan belgilanganiga o'zgartiriladi:

Sub Format_Centered_Va_Sized(Ixtiyoriy iFontSize As Integer = 10) Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Size = iFontSize End Sub

Ushbu protsedura Sub amallarni bajaradi, lekin natijalarni qaytarmaydi.

Ushbu misolda ixtiyoriy argument ham qo'llaniladi iFontSize. Agar argument bo'lsa iFontSize protseduraga o'tmagan Sub, keyin uning standart qiymati 10 deb qabul qilinadi. Biroq, agar argument iFontSize protseduraga o'tdi Sub, keyin foydalanuvchi tomonidan belgilangan shrift o'lchami tanlangan hujayralar oralig'ida o'rnatiladi.

VBA protsedurasi "Sub": 2-misol. O'rtaga tekislash va tanlangan katakchalar oralig'ida shriftga qalinni qo'llash

Keyingi protsedura yuqorida muhokama qilinganga o'xshaydi, lekin bu safar o'lchamni o'zgartirish o'rniga tanlangan hujayralar diapazoniga qalin shrift uslubini qo'llaydi. Bu misol protsedurasi Sub, unga hech qanday argument berilmaydi:

Sub Format_Centered_And_Bold() Selection.HorizontalAlignment = xlCenter Selection.VerticalAlignment = xlCenter Selection.Font.Bold = True End Sub

Excel VBA da "Sub" protsedurasini chaqirish

VBA protsedurasini boshqa protseduradan "Sub" deb chaqirish

VBA protsedurasini chaqirish uchun Sub boshqa VBA protsedurasidan siz kalit so'zni yozishingiz kerak Qo'ng'iroq qiling, protsedura nomi Sub va keyin qavs ichida protsedura argumentlari. Bu quyidagi misolda ko'rsatilgan:

Sub main() Call Format_Centered_And_Sized(20) End Sub

Agar protsedura Format_markazlangan_va_oʻlchamli bir nechta argumentga ega, ular vergul bilan ajratilishi kerak. Mana bunday:

Sub main() Call Format_Centered_And_Sized(arg1, arg2, ...) End Sub

VBA protsedurasini ishchi varaqdan "Sub" deb chaqirish

Jarayon Sub uni to'g'ridan-to'g'ri Excel ish varag'i katakchasiga kiritish mumkin emas, chunki protsedura yordamida amalga oshirilishi mumkin Funktsiya, chunki protsedura Sub qiymat qaytarmaydi. Biroq, protseduralar Sub, argumentlarga ega bo'lmagan va deb e'lon qilingan Ommaviy(keyinroq ko'rsatilgandek) ishchi varaq foydalanuvchilari uchun mavjud bo'ladi. Shunday qilib, agar yuqorida muhokama qilingan oddiy tartiblar Sub Visual Basic muharririda modulga kiritilgan, keyin protsedura Format_markazlangan_va_qalin Excel ish varag'ida foydalanish uchun mavjud bo'ladi va protsedura Format_markazlangan_va_oʻlchamli– mavjud bo'lmaydi, chunki unda argumentlar mavjud.

Mana protsedurani ishga tushirish (yoki bajarish)ning oddiy usuli Sub, ish varag'ida mavjud:

  • bosing Alt+F8(tugmasini bosing Alt va uni ushlab turganda tugmani bosing F8).
  • Ko'rsatilgan makroslar ro'yxatida ishga tushirmoqchi bo'lgan birini tanlang.
  • bosing Bajarish(Yugurish)

Jarayonni bajarish uchun Sub tez va oson, siz unga tugmalar birikmasini belgilashingiz mumkin. Buning uchun:

  • bosing Alt+F8.
  • Ko'rsatilgan makroslar ro'yxatida klaviatura yorlig'ini tayinlamoqchi bo'lgan birini tanlang.
  • bosing Variantlar(Tanlovlar) va paydo bo'lgan muloqot oynasiga klaviatura yorliqlarini kiriting.
  • bosing KELISHDIKMI va dialog oynasini yoping Ibratli(Makro).

Diqqat: Makrosga klaviatura yorlig'ini belgilashda, u Exceldagi standart kabi ishlatilmasligiga ishonch hosil qiling (masalan, Ctrl+C). Agar siz mavjud klaviatura yorlig'ini tanlasangiz, u makrosga qayta tayinlanadi va natijada foydalanuvchi tasodifan makrosni ishga tushirishi mumkin.

VBA protseduralari doirasi

Ushbu qo'llanmaning 2-qismida o'zgaruvchilar va konstantalar doirasi va kalit so'zlarning roli mavzusi muhokama qilindi Ommaviy Va Shaxsiy. Ushbu kalit so'zlar VBA protseduralariga nisbatan ham ishlatilishi mumkin:

Shuni esda tutingki, agar VBA protsedurasini e'lon qilishdan oldin Funktsiya yoki Sub kalit so'z kiritilmagan bo'lsa, protsedura uchun standart xususiyat o'rnatiladi Ommaviy(ya'ni, u berilgan VBA loyihasida hamma joyda mavjud bo'ladi). Bu sukut bo'yicha o'zgaruvchilarni e'lon qilishdan farq qiladi Shaxsiy.

"Funktsiya" va "Sub" VBA protseduralaridan erta chiqish

Agar siz VBA protsedurasining bajarilishini to'xtatishingiz kerak bo'lsa Funktsiya yoki Sub, uning tabiiy tugashini kutmasdan, buning uchun operatorlar mavjud Chiqish funksiyasi Va Sub-dan chiqish. Ushbu operatorlardan foydalanish quyida oddiy protsedura misoli yordamida ko'rsatilgan Funktsiya, bu keyingi operatsiyalarni bajarish uchun ijobiy dalil olishni kutadi. Agar protseduraga ijobiy bo'lmagan qiymat o'tkazilsa, u holda boshqa operatsiyalarni bajarib bo'lmaydi, shuning uchun foydalanuvchiga xato xabari ko'rsatilishi va protsedura darhol tugatilishi kerak:

Funktsiya VAT_Amount(sVAT_Rate as Yagona) VAT_Amount = 0 Agar sVAT_Rate<= 0 Then MsgBox "Expected a Positive value of sVAT_Rate but Received " & sVAT_Rate Exit Function End If ... End Function

E'tibor bering, protsedurani yakunlashdan oldin FunktsiyaQQS_summasi, kodga o'rnatilgan VBA funksiyasi kiritilgan MsgBox, bu foydalanuvchiga qalqib chiquvchi ogohlantirish oynasini ko'rsatadi.

Excelda VBA kodini yozishda har bir qadamda o'rnatilgan operatorlar to'plami ishlatiladi. Bu operatorlar matematik, satr, taqqoslash va mantiqiy operatorlarga bo'linadi. Keyinchalik biz operatorlarning har bir guruhini batafsil ko'rib chiqamiz.

Matematik operatorlar

Asosiy VBA matematik operatorlari quyidagi jadvalda keltirilgan.

Jadvalning o'ng ustunida qavslarsiz standart operator ustunligi ko'rsatilgan. Ifodaga qavslar qo'shish orqali siz VBA bayonotlarining bajarilishi tartibini xohlagancha o'zgartirishingiz mumkin.

String operatorlari

Excel VBA-dagi asosiy string operatori birlashtiruvchi operatordir & (birlashma):

Taqqoslash operatorlari

Taqqoslash operatorlari ikkita raqam yoki satrni solishtirish va shunga o'xshash mantiqiy qiymatni qaytarish uchun ishlatiladi Mantiqiy(To'g'ri yoki noto'g'ri). Asosiy Excel VBA taqqoslash operatorlari ushbu jadvalda keltirilgan:

Mantiqiy operatorlar

Taqqoslash operatorlari kabi mantiqiy operatorlar mantiqiy turdagi turdagi qiymatni qaytaradi Mantiqiy(To'g'ri yoki noto'g'ri). Excelning asosiy VBA mantiqiy operatorlari quyidagi jadvalda keltirilgan:

Yuqoridagi jadvalda VBA-da mavjud bo'lgan barcha mantiqiy operatorlar ro'yxati yo'q. Mantiqiy operatorlarning to'liq ro'yxatini Visual Basic Developer Center-da topish mumkin.

O'rnatilgan funktsiyalar

VBA-da kod yozishda foydalanish mumkin bo'lgan ko'plab o'rnatilgan funktsiyalar mavjud. Quyida eng ko'p ishlatiladigan ba'zilari keltirilgan:

Funktsiya Harakat
Abs Berilgan raqamning mutlaq qiymatini qaytaradi.
  • Abs(-20) 20 qiymatini qaytaradi;
  • Abs(20) 20 qiymatini qaytaradi.
Chr Parametrning raqamli qiymatiga mos keladigan ANSI belgisini qaytaradi.
  • Chr(10) qator uzilishini qaytaradi;
  • Chr(97) belgini qaytaradi a.
Sana Joriy tizim sanasini qaytaradi.
Qo'shish sanasi Belgilangan sanaga ma'lum vaqt oralig'ini qo'shadi. Funktsiya sintaksisi:

qo'shish sanasi( interval , raqam , sana )

Bahs qayerda interval berilgan vaqt oralig'ining turini belgilaydi sana argumentda ko'rsatilgan miqdorda raqam .

Dalil interval quyidagi qiymatlardan birini qabul qilishi mumkin:

  • Qo'shish sanasi("d", 32, "01/01/2015") 01/01/2015 sanaga 32 kun qo'shadi va shu bilan 02/02/2015 sanani qaytaradi.
  • Qo'shish sanasi("ww", 36, "01/01/2015") 01/01/2015 sanaga 36 hafta qo'shadi va 09/09/2015 sanani qaytaradi.
DateDiff Ikki berilgan sana orasidagi belgilangan vaqt oraliqlari sonini hisoblab chiqadi.
  • DateDiff("d", "01/01/2015", "02/02/2015") 01/01/2015 va 02/02/2015 sanalari orasidagi kunlar sonini hisoblab chiqadi, natijani 32 qaytaradi.
  • DateDiff("ww", "01/01/2015", "03/03/2016") 01/01/2015 va 03/03/2016 sanalari orasidagi haftalar sonini hisoblab chiqadi, natijani 61 qaytaradi.
kun Berilgan sanadagi oy kuniga mos keladigan butun sonni qaytaradi.

Misol: Kun (“29.01.2015”) 29 raqamini qaytaradi.

Soat Berilgan vaqtdagi soatlar soniga mos keladigan butun sonni qaytaradi.

Misol: Soat (“22:45:00”) 22 raqamini qaytaradi.

InStr Argument sifatida butun son va ikkita satrni oladi. Qidiruvni butun son bilan belgilangan joydan boshlab, birinchi qatordagi ikkinchi qatorning paydo bo'lish o'rnini qaytaradi.
  • InStr(1, "Mana siz izlayotgan so'z", "so'z") 13 raqamini qaytaradi.
  • InStr(14, “Mana qidiruv soʻzi, mana boshqa qidiruv soʻzi”, “soʻz”) 38 raqamini qaytaradi.

Eslatma: Raqam argumenti ko'rsatilmasligi mumkin, bu holda qidiruv funksiyaning ikkinchi argumentida ko'rsatilgan satrning birinchi belgisidan boshlanadi.

Int Berilgan sonning butun qismini qaytaradi.

Misol: Int(5,79) natijani qaytaradi 5.

Sana Qaytadi To'g'ri agar berilgan qiymat sana bo'lsa yoki Yolg'on- agar bu sana bo'lmasa.
  • Ish sanasi (“01/01/2015”) qaytadi To'g'ri;
  • Ish sanasi(100) qaytadi Yolg'on.
IsError Qaytadi To'g'ri, agar berilgan qiymat xato bo'lsa, yoki Yolg'on- agar bu xato bo'lmasa.
Missing Ixtiyoriy protsedura argumentining nomi funksiyaga argument sifatida uzatiladi. Missing qaytadi To'g'ri, agar ko'rib chiqilayotgan protsedura argumenti uchun qiymat o'tkazilmasa.
IsNumeric Qaytadi To'g'ri agar berilgan qiymat raqam sifatida qaralishi mumkin bo'lsa, aks holda qaytariladi Yolg'on.
Chapga O'tkazilgan satr boshidan belgilangan belgilar sonini qaytaradi. Funktsiyaning sintaksisi quyidagicha:

Chap ( chiziq , uzunligi )

Qayerda chiziq asl satrdir va uzunligi– satr boshidan hisoblangan qaytarilgan belgilar soni.

  • Chap("abvgdezziklmn", 4)“abvg” qatorini qaytaradi;
  • Chap("abvgdezziklmn", 1)“a” qatorini qaytaradi.
Len Satrdagi belgilar sonini qaytaradi.

Misol: Len("abvgdezh") 7 raqamini qaytaradi.

Oy Berilgan sanadagi oyga mos keladigan butun sonni qaytaradi.

Misol: Oy (“29.01.2015”) 1 qiymatini qaytaradi.

O'rta O'tkazilgan qatorning o'rtasidan belgilangan belgilar sonini qaytaradi. Funktsiya sintaksisi:

O'rta( chiziq , Boshlash , uzunligi )

Qayerda chiziq asl qatordir Boshlash- chiqarilgan satr boshining pozitsiyasi, uzunligi- ajratib olinadigan belgilar soni.

  • O'rta("abvgdezziklmn", 4, 5)"qaerda" qatorini qaytaradi;
  • O'rta("abvgdezziklmn", 10, 2)"cl" qatorini qaytaradi.
Daqiqa Berilgan vaqtdagi daqiqalar soniga mos keladigan butun sonni qaytaradi. Daqiqa (“22:45:15”) 45 qiymatini qaytaradi.
Hozir Joriy tizim sanasi va vaqtini qaytaradi.
To'g'ri O'tkazilgan satr oxiridan belgilangan belgilar sonini qaytaradi. Funktsiya sintaksisi:

To'g'ri( chiziq , uzunligi )

Qayerda chiziq asl satrdir va uzunligi- bu berilgan satr oxiridan boshlab chiqarib olinishi kerak bo'lgan belgilar soni.

  • O'ng("abvgdezziklmn", 4)"clmn" qatorini qaytaradi;
  • O'ng("abvgdezziklmn", 1)"n" qatorini qaytaradi.
Ikkinchi Berilgan vaqtdagi soniyalar soniga mos keladigan butun sonni qaytaradi.

Misol: Ikkinchi ("22:45:15") 15 qiymatini qaytaradi.

Sqr Argument sifatida berilgan raqamli qiymatning kvadrat ildizini qaytaradi.
  • Sqr(4) 2 qiymatini qaytaradi;
  • Sqr(16) 4 qiymatini qaytaradi.
Vaqt Joriy tizim vaqtini qaytaradi.
Ubound Belgilangan massiv o'lchamining yuqori belgisini qaytaradi.

Eslatma: Ko'p o'lchovli massivlar uchun ixtiyoriy argument qaysi o'lchov qaytarilishi kerakligini ko'rsatishi mumkin. Belgilanmagan bo'lsa, birlamchi qiymat 1 ga teng.