VB və VBA proqramları ilə məşğul olanlar üçün məsləhətlər. VBA-da dəyişənlər və sabitlər

VBA-da, hər hansı digər proqramlaşdırma dillərində olduğu kimi, dəyişənlər və sabitlər istənilən dəyəri saxlamaq üçün istifadə olunur. Adından da göründüyü kimi, dəyişənlər dəyişə bilər, sabitlər isə sabit dəyərləri saxlayır.

Məsələn, sabit Pi 3.14159265 dəyərini saxlayır... Proqramın icrası zamanı “Pi” rəqəmi dəyişməyəcək, lakin belə bir dəyəri sabit kimi saxlamaq daha rahatdır.

Eyni zamanda dəyişəndən də istifadə edə bilərik sVAT_Rate alınmış mallar üzrə ƏDV dərəcəsini saxlamaq. Dəyişən dəyər sVAT_Rate hansı əşyanın alındığına görə dəyişə bilər.

Məlumat növləri

Bütün dəyişənlər və sabitlər müəyyən bir məlumat növünə aiddir. Aşağıdakı cədvəl VBA-da istifadə olunan məlumat növlərini təsviri və mümkün dəyərlər diapazonu ilə göstərir:

Məlumat növü Ölçü Təsvir Dəyərlər diapazonu
bayt 1 bayt Müsbət tam ədədlər; tez-tez binar verilənlər üçün istifadə olunur 0-dan 255-ə qədər
Boolean 2 bayt Doğru və ya Yanlış ola bilər Doğru və ya Yanlış
Tam ədəd 2 bayt Tam ədədlər (kəsr hissəsi yoxdur) -32 768-dən +32 767-yə qədər
Uzun 4 bayt Böyük tam ədədlər (kəsir hissə yoxdur) -2 147 483 648-dən +2 147 483 647-yə qədər
Subay 4 bayt Tək dəqiqlikli üzən nöqtə nömrəsi -3.4e38-dən +3.4e38-ə qədər
İkiqat 8 bayt İkiqat dəqiqlikli üzən nöqtə nömrəsi -1,8e308 - +1,8e308
Valyuta 8 bayt Sabit onluq yerlərin sayı ilə üzən nöqtə nömrəsi -922 337 203 685 477.5808-dən +922 337 203 685 477.5807
Tarix 8 bayt Tarix və vaxt – Tarix məlumatları üzən nöqtə nömrəsi kimi təqdim olunur. Bu ədədin tam hissəsi tarixi, kəsr hissəsi isə vaxtı ifadə edir. 1 100 yanvardan 31 dekabr 9999-a qədər
Obyekt 4 bayt Obyekt istinadı İstənilən obyekt istinadı
Simli dəyişikliklər Xarakter dəsti. String növü sabit və ya dəyişən uzunluğa malik ola bilər. Ən tez-tez dəyişən uzunluqda istifadə olunur Sabit uzunluq - təxminən 65.500 simvola qədər. Dəyişən uzunluq - təxminən 2 milyard simvola qədər
Variant dəyişikliklər Tarix, üzən nöqtə nömrəsi və ya simvol sətri ola bilər. Bu tip məlumatların hansı növə daxil ediləcəyi əvvəlcədən məlum olmayan hallarda istifadə olunur. Nömrə – İkiqat, simli – Simli

Aydındır ki, yuxarıdakı cədvəldən istifadə edərək və məlumat növünü düzgün seçərək, yaddaşdan daha qənaətlə istifadə edə bilərsiniz (məsələn, məlumat növünü seçin) Tam ədədəvəzinə Uzun və ya Subayəvəzinə İkiqat). Bununla belə, daha yığcam məlumat növlərindən istifadə edərkən diqqətli olmalısınız ki, kodunuz onlara qeyri-mütənasib böyük dəyərləri sığdırmağa çalışmasın.

Dəyişənlərin və sabitlərin elan edilməsi

Tərcüməçinin qeydi: VBA-da dəyişənlərdən danışarkən, daha birini qeyd etmək lazımdır mühüm məqam. Əgər dəyişəni elan etsək, lakin ona heç bir dəyər təyin etməsək, o, standart dəyərlə işə salınır:
mətn sətirləri – boş sətirlərlə işə salınmışdır;
ədədlər - dəyər 0;
tip dəyişənlər Boolean- Yalan;
tarixlər: 30 dekabr 1899-cu il.

Dəyişən və ya sabitdən istifadə edilməzdən əvvəl o, elan edilməlidir. Bunu etmək üçün bunu makroya əlavə edin: sadə sim kod:

Dim Dəyişən_Adı kimi Data_Növü

Yuxarıda göstərilən kod xəttində Dəyişən_Adı kodda istifadə olunacaq dəyişənin adıdır və Data_Növü– bu, bu məqalədə bir az əvvəl verilmiş cədvəldəki məlumat növlərindən biridir. Məsələn:

Dim sVAT_Rate Single Dim i As Integer

Sabitlər eyni şəkildə elan edilir, lakin sabitləri elan edərkən onların dəyəri dərhal göstərilməlidir. Məsələn, bu kimi:

Const iMaxCount = 5000 Const iMaxScore = 100

Excel-də dəyişənləri elan etmək lazım deyil. Varsayılan olaraq, Excel-də daxil edilmiş, lakin elan edilməmiş bütün dəyişənlər tipli olacaqdır Variant həm ədədi, həm də mətn dəyərlərini qəbul edə biləcək.

Beləliklə, proqramçı istənilən vaxt yeni dəyişəndən istifadə edə bilər (hətta elan edilməmiş olsa belə) və Excel onu tipli dəyişən kimi qəbul edəcək. Variant. Ancaq bunu etməməyiniz üçün bir neçə səbəb var:

  1. Yaddaşdan istifadə və hesablama sürəti.Əgər məlumat növünü göstərən dəyişəni elan etməsəniz, defolt olaraq onun növü təyin olunacaq Variant. Bu məlumat növü digər məlumat növləri ilə müqayisədə daha çox yaddaş istifadə edir, hər dəyişən üçün bir neçə əlavə bayt çox görünməyə bilər, lakin praktikada yazdığınız proqramlarda minlərlə dəyişən ola bilər (xüsusilə də massivlərlə işləyərkən). Buna görə də artıq yaddaş kimi dəyişənlər tərəfindən istifadə edilir Variant, kimi dəyişənlərlə müqayisədə Tam ədəd və ya Subay, əhəmiyyətli bir məbləğə əlavə edə bilərsiniz. Bundan əlavə, növün dəyişənləri ilə əməliyyatlar Variant digər növ dəyişənlərə nisbətən daha yavaş icra olunur, buna görə də əlavə min növ dəyişən Variant hesablamaları əhəmiyyətli dərəcədə ləngidə bilər.
  2. Dəyişən adlarında səhvlərin qarşısının alınması. Bütün dəyişənlər elan olunubsa, onda siz istifadə edə bilərsiniz VBA operatoruSeçim Aydındır(bu haqda sonra danışacağıq) bütün elan edilməmiş dəyişənləri müəyyən etmək üçün bu, səhv yazılmış dəyişən adı nəticəsində proqramda səhvlərin yaranmasının qarşısını alır. Məsələn, adlı dəyişəndən istifadə etməklə sVAT_Rate, siz yazı səhvi edə bilərsiniz və bu dəyişənə dəyər təyin edərək yaza bilərsiniz: “VATRate = 0.175”. Bundan sonra dəyişən olması gözlənilir sVAT_Rate 0,175 dəyəri olmalıdır - lakin əlbəttə ki, yoxdur. Bütün istifadə olunan dəyişənlərin məcburi elan edilməsi rejimi aktivdirsə, VBA tərtibçisi dəyişəni tapa bilməyəcəyi üçün dərhal səhv göstərəcək. ƏDV dərəcəsi elan edilənlər arasındadır.
  3. Dəyişənin elan edilmiş növünə uyğun gəlməyən dəyərləri vurğulamaq. Müəyyən bir növ dəyişəni elan etsəniz və ona fərqli bir tip məlumat təyin etməyə çalışsanız, bir səhv görünəcək və düzəldilməzsə, proqram ilk baxışda elan edilməməsi üçün yaxşı bir səbəb kimi görünə bilər dəyişənlər, lakin əslində, əvvəlkindən daha Məlum oldu ki, dəyişənlərdən biri almalı olduğu səhv məlumat alıb - daha yaxşıdır! Əks təqdirdə, proqram işləməyə davam edərsə, nəticələr səhv və gözlənilməz ola bilər və səhvlərin səbəbini tapmaq daha çətin olacaq. Nəticədə, səhv diqqətdən kənarda qalacaq və səhv məlumatlarla iş davam edəcək!

Bununla əlaqədar olaraq, səhv məlumat növlərini aşkar etmək və koddakı bu cür səhvləri mümkün qədər tez düzəltmək məsləhətdir. Bu səbəblərə görə VBA makrosunu yazarkən bütün dəyişənlərin elan edilməsi tövsiyə olunur.

Seçim Aydındır

Operator Seçim Aydındır VBA kodunda istifadə olunacaq bütün dəyişənləri elan etməyə məcbur edir və tərtib edilərkən (kod icra olunmazdan əvvəl) elan olunmamış dəyişənləri xəta kimi qeyd edir. Bu operatordan istifadə etmək çətin deyil - sadəcə VBA faylının ən yuxarı hissəsində aşağıdakı sətri yazın:

Seçim Aydındır

Həmişə daxil etmək istəyirsinizsə Seçim Aydındır yaradılan hər yeni VBA modulunun əvvəlində bu avtomatik olaraq edilə bilər. Bunu etmək üçün parametri aktivləşdirməlisiniz Dəyişən Bəyannaməni tələb edin VBA redaktoru parametrlərində.

Bu belə edilir:

  • Visual Basic Redaktor menyusundan, klikləyin Alətlər > Seçimlər
  • Görünən informasiya qutusunda nişanı açın redaktor
  • Qutunu yoxlayın Dəyişən Bəyannaməni tələb edin və basın OK

Parametr aktiv olduqda, xətt Seçim Aydındır yaradılan hər yeni modulun əvvəlində avtomatik olaraq daxil ediləcək.

Dəyişənlərin və sabitlərin əhatə dairəsi

Hər elan edilmiş dəyişənin və ya sabitin öz məhdud əhatə dairəsi, yəni bu dəyişənin mövcud olduğu proqramın məhdud hissəsi var. Əhatə dairəsi dəyişən və ya daimi bəyannamənin harada edildiyindən asılıdır. Məsələn, dəyişəni götürək sVAT_Rate, funksiyasında istifadə olunur Ümumi_Xərc. Aşağıdakı cədvəldə dəyişən əhatə dairəsi üçün iki variant göstərilir: sVAT_Rate, modulda iki fərqli mövqedə elan edilmişdir:

Seçim Aydın Dim sVAT_Rate Tək Funksiya kimi Total_Cost() Cüt ... Son Funksiya

Əgər dəyişən sVAT_Rate modulun ən əvvəlində elan edilirsə, onda bu dəyişənin əhatə dairəsi bütün modul olacaq (yəni dəyişən sVAT_Rate bu moduldakı bütün prosedurlar tərəfindən tanınacaq).

Buna görə də, əgər funksiyada Ümumi_Xərc dəyişən sVAT_Rate müəyyən bir dəyər təyin ediləcək, sonra eyni modul daxilində yerinə yetirilən növbəti funksiya dəyişəndən istifadə edəcəkdir. sVAT_Rate eyni məna ilə.

Lakin, əgər başqa modulda yerləşən hansısa funksiya çağırılırsa, onda onun dəyişənidir sVAT_Rate bilinməyəcək.

Seçim Açıq Funksiya Total_Cost() İkiqat Dim kimi sVAT_Rate Tək ... Son Funksiya

Əgər dəyişən sVAT_Rate funksiyanın əvvəlində elan edilir Ümumi_Xərc, onda onun əhatə dairəsi yalnız bu funksiya ilə məhdudlaşacaq (yəni funksiya daxilində Ümumi_Xərc, dəyişəndən istifadə etmək mümkün olacaq sVAT_Rate, lakin onun xaricində deyil).

İstifadə etməyə çalışarkən sVAT_Rate başqa prosedurda VBA tərtibçisi xəta haqqında məlumat verəcək, çünki bu dəyişən funksiyadan kənarda elan olunmayıb. Ümumi_Xərc(operatordan istifadə etmək şərti ilə Seçim Aydındır).

Yuxarıda göstərilən nümunədə dəyişən açar sözdən istifadə edərək modul səviyyəsində elan edilir Dim. Bununla belə, elan edilmiş dəyişənlərin digər modullarda istifadə edilməsi lazım ola bilər. Belə hallarda açar söz əvəzinə dəyişən elan etmək Dim açar sözdən istifadə etmək lazımdır İctimai.

Yeri gəlmişkən, açar söz əvəzinə modul səviyyəsində dəyişən elan etmək üçün Dim açar sözdən istifadə edə bilərsiniz Şəxsi, bu dəyişənin yalnız cari modulda istifadə üçün nəzərdə tutulduğunu göstərəcək.

Siz həmçinin sabitləri elan etmək üçün açar sözlərdən istifadə edə bilərsiniz İctimaiŞəxsi, lakin açar söz əvəzinə deyil Const, və onunla birlikdə.

Aşağıdakı nümunələr istifadəni göstərir açar sözlər İctimaiŞəxsi dəyişənlərə və sabitlərə tətbiq olunduğu kimi.

Düz dörd il əvvəl “Visual Basic-də proqramlaşdıranlar üçün məsləhətlər” adlı ilk məqaləmiz ComputerPress 3’96-da dərc olundu. Orada cəmi üç ipucu var idi, amma düzünü desəm, o anda onların sayının artacağını və bu günə qədər 255 bayt dəyişən dəyəri həddinə çatacağını düşünmürdük.

Ancaq ümid edirik ki, sayğacın daşması ilə bağlı heç bir problem olmayacaq: iki baytlıq Tam ədəd sayma məsləhətləri üçün daha bir neçə il təmin edəcək və sonra Long-a keçmək mümkün olacaq.

Yeri gəlmişkən, bu silsilə məqalələrin ComputerPress-də görünməsi heç də təsadüfi deyildi: dörd il əvvəl, 1991-ci ildə jurnalın mart sayında ilk nəşrimiz olan "QuickBASIC sizə lazım olan şeydir" məqaləsi də çıxdı. yalnız o zaman yaranan yerli kompüter mətbuatında.

Oxucumuz məktub göndərib və orada aşağıdakı problemdən bəhs edir. Proqramlı şəkildə bir iş kitabındakı cədvəldən xanaların məzmununu digərindəki cədvəllərə köçürməlisiniz. Bunun üçün o, Macros.xls iş kitabına aşağıdakı makronu yazdı:

Sub Macro1() Workbooks.Open Filename:="Mənbə.xls" " kitabını açın Source.xls Cells.Select " aktiv cədvəldəki bütün xanaları seçin Seçim. Kopyalayın " ActiveWindow buferinə köçürün. Bağlayın " aktiv cədvəli bağlayın " indi aktivdir cari iş kitabı cədvəli Macros.xls Range("A1"). Panodan yapışdırmaq üçün ActiveSheet.Paste " başlanğıc mövqeyini seçin Son Alt

Bununla belə, bu makro əmrindən istifadə edərək Source.xls iş kitabı cədvəlindən kopyalamanın nəticəsi həm Excel 97, həm də Excel 2000-də gözləniləndən fərqli idi (paket mühitindəki əmrlər bu əməliyyatı düzgün yerinə yetirir):

Bu məlumatlardan aydın olur ki, kopyalama xətası bir növ regional parametrlərin düzgün istifadə edilməməsi ilə bağlıdır (baxmayaraq ki, iş rusdilli Windows və Office mühitində aparılıb) - Excel 97-də rus və ingilis parametrlərinin qarışıqlığı aşkar.

Beləliklə, RegionalSetting baxımından 12,12 = 1033 (ABŞ) sadəcə simvol sətridir. Və bu halda o, simvol sətri kimi kopyalanır (qeyd edək ki, Excel 97-də Macro1-i işə saldıqdan sonra xana sola düzülüb). Və 5.559 (ABŞ qurğuları üçün) üçlü ayırıcı kimi nöqtəsi olan tam ədədi təmsil edir. Bu nömrəni daxil edərkən rus üçlü ayırıcı istifadə olunur - boşluq. Bənzər, lakin məntiqi izah etmək çətin olan bir şey 5.7777 rəqəmi ilə baş verir.

Source.xls-də dördüncü xananın məzmunu - 5.559 - sola düzülmüş simvol sətridir. Lakin ABŞ qurğuları üçün bu, rus dilində vergüllə dəyişən (və müvafiq olaraq sağa düzülmüş) onluq nöqtəsi olan bir nömrədir. Eyni xəta Excel 2000-də də baş verir.

Səhv mexanizmi aydındır, amma nə etməli? Hüceyrələri necə kopyalamaq olar?

Bizim müraciətimizlə Rusiyadakı texniki dəstək xidməti bu problemi həll etdi və Avropa mərkəzinə müraciət etdikdən sonra aşağıdakı cavabı aldı:

“Dəyişən mətn sətri kimi panoya kopyalanır, bundan sonra orijinal iş kitabı bağlanır və ikinci iş kitabına yapışdırılır. Excel onu istədiyi görünüşə çevirməyə çalışır və səhv edir.

Ancaq orijinalı saxlasanız, hər şey yaxşı olacaq iş dəftəri məlumatların daxil edilməsi tamamlanana qədər açın."

Və həqiqətən, kopyalamaq üçün makronun bu versiyasını istifadə etsəniz, hər şey səhvsiz işləyir:

Sub Macro2() İş kitabları. FaylAdı açın:="c:\Mənbə.xls" Cells.Select Selection.Copy " kitabı aktiv edin Macros.xls Workbooks("Macros.xls").Aktivləşdir Aralığı("A1").Seçin ActiveSheet .Yalışdırın "insert" yalnız indi mənbə iş kitabını bağlayın İş dəftərləri("Mənbə.xls"). Son Altı Bağlayın

Microsoft Dəstəyindən başqa bir ipucu: Zəruri olmadıqda bütün cədvəli köçürməyin - yalnız həqiqətən ehtiyac duyduğunuz diapazondan istifadə edin. Yəni əvəzinə

Cells.Select

bu halda yazmaq daha yaxşıdır:

Aralıq("A1:E2").Seçin

Daxil edilmiş proqram nümunələrini sınaqdan keçirərkən Source.xls faylını C:\ qovluğuna köçürməli və ya makro kodunda fayla başqa yol göstərməlisiniz.

Əgər kifayət qədər uzun hesablama prosedurları ilə proqramlar yaratsanız, bu prosesləri dayandırmaq imkanı vermək çox faydalı ola bilər. Məsələn, formada bir düyməni basın. Bu problemin həlli variantlarından birini nəzərdən keçirək.

Tutaq ki, Process.bas modulunda müəyyən hesablama prosedurunuz var. Onun kəsmə mexanizmini həyata keçirmək ideyası, vəziyyəti prosedur daxilində nəzarət edilən və başqa bir xarici prosedurla dəyişdirilə bilən bəzi bayraqdan (qlobal dəyişən) istifadə etməkdir.

Bu halda Process.bas modulu belə görünə bilər:

Qlobal ProcessFlag% " prosesə nəzarət bayrağı, qlobal dəyişən İctimai Alt Proses(Nəticə%) " Müəyyən prosesin imitasiyası " Nəticə prosesin son bayrağını qaytarır " 1 - özü bitdi, 0 - xarici anormal sonlanma " ProcessFlag = 1 " prosesin başlanğıc bayrağı üçün i& = 1-dən 1000000-ə qədər " Gecikmə vaxtı çox qısa olarsa, dövrün uzunluğunu artırın Əgər ProcessFlag = 0 olarsa, Çıxın " üçün " işarəsini yoxlayın Value# = 100 / 0.3 * 1.5 / 2.3 Növbəti Nəticə = Proses Bayraqının Sonu Alt

İndi gəlin frmInterrupt forması yaradaq, onun üzərinə “Kesmək üçün bura klikləyin” adlı düymə yerləşdirəcəyik. proses Proses". Düymə üçün aşağıdakı proseduru yazacağıq:

Private Sub Command1_Click() ProcessFlag = 0 " təmiz qlobal bayraq Son Sub

Public Sub Main() " müəyyən hesablama prosesinin kəsilmə mexanizminin nümayişi proseduru frmInterrupt.Show 0 " formanı modelsiz rejimdə açın Zəng Prosesi(Nəticə%) " frmInterrupt formasını boşaltın " formanı boşaltın " prosedurun təhlili tamamlama kodu MsgBox " Prosedurun tamamlanmasının nəticəsi = "&Nəticə% Son Alt

Zahirən hər şey düzgün görünür, lakin layihəni icra etdikdə prosesi dayandıra bilməyəcəyimizi görürük. Üstəlik, hətta forma tam çəkilmir. Bənzər bir sualı bir ay əvvəl 246-247-ci məsləhətlərdə müzakirə etdik: fakt budur ki, hesablama dövrü bütün kompüter resurslarını yeyir, digər proqram proseslərinin işləməsinə mane olur. Bu problemi həll etmək üçün digər prosesləri yerinə yetirmək üçün idarəetməni əməliyyat sisteminə ötürən hesablama dövrəsinə DoEvents funksiyasını daxil etmək lazımdır.

Bununla belə, seçim

i = 1-dən 1000000-ə qədər DoEvents "nəzarəti digər proseslərə köçürün Əgər ProcessFlag = 0 olarsa, Çıxın" üçün bayrağı yoxlayın Value# = 100 / 0.3 * 1.5 / 2.3 Sonrakı

həm də çox yaxşı deyil - DoEvents-in icrası çox uzun vaxt aparır. Sadə hesablama nümunəmizdə Proses prosedurunun performansının 1000 dəfə azalacağını görəcəyik (yəni DoEvents-in icra müddəti düsturun faydalı hesablanmasından 1000 dəfə uzundur). Bu cür əlavə yükün qarşısını almaq üçün aşağıdakı kodu yaza bilərsiniz:

i üçün = 1-dən 1000000-ə qədər Əgər i Mod 100000 Sonra "100.000 DoEvents dövrünə bir dəfə yoxlayın" nəzarəti digər proseslərə köçürün Əgər ProcessFlag = 0 Olsa, Çıxış üçün " bayrağını yoxlayın End If Value# = 100 / 0.3 * 1.5 / 2.3 Sonrakı

Bu halda, DoEvents faydalı hesablamaların yalnız 1%-ni tutacaq.

Təəssüf ki, iki paralel prosesi izləmək probleminin bu həlli ən yaxşı görünmür, lakin Windows-un reallığı belədir.

Bir sözlə, məsləhət belədir: proqram zamanı hesablama tapşırıqlarının dayandırılmasını təmin etmək üçün oxşar konstruksiyalar yerləşdirin (lakin çox tez-tez deyil):

DoEvents Əgər ProcessFlag = 0 olarsa, bir şeydən çıxın

İpucu 253. Rəqəmsal imza ilə layihələri saxlamaqla problemi necə həll etmək olar

Office 2000-də bir sıra hallarda istifadəçi layihəni (makrokodu olan sənədi) elektron imza ilə saxlaya bilmədiyi bir vəziyyət yaranır - sənəd yalnız imzasız yazıla bilər. Bu vəziyyətdə, disk sahəsinin olmaması ilə bağlı səhv bir diaqnoz verilir.

Bu halda, düzəldiləcəyinə ümid etdiyimiz bir proqram xətası var. Əslində, o, yalnız kodda daxili sintaksis səhvləri olan layihələrdə görünür. Buna görə də, elektron imza ilə sənədin saxlanmasının mümkünsüzlüyü ilə bağlı oxşar mesajla qarşılaşsanız, imzanı ləğv etməzdən əvvəl kodunuzun funksionallığını yoxlamağı tövsiyə edirik. Çox vaxt səhv dəyişən təsvirinin olmaması və ya xarici obyektə istinadla əlaqələndirilir.

Vəziyyətin mahiyyətini daha yaxşı başa düşmək üçün Word-də bu sadə nümunəni hazırlayın.

Yaradın yeni sənəd və VBA mühitinə keçin. Orada Test1 makrosu yaradın:

Alt Test1() Avar = 1 Son Əgər

Əlbəttə ki, ilk növbədə Seçim Açıq rejimi təyin edilməlidir (məcburi dəyişən elanı).

İndi quraşdırın elektron imza və sənədi saxlamağa çalışın. Çox güman ki, faylı yazmaq üçün kifayət qədər disk sahəsi olmadığını bildirən bir mesaj alacaqsınız.

İcra üçün Test1 makro əmrini işə salın - tərcüməçi sintaksis xətası mesajı göstərəcək (Avar dəyişəni müəyyən edilməyib). Prosedura təsvir əlavə edin:

Dim Avar Tam Ədədi

İndi makro əmri yerinə yetiriləcək (faydalı bir şey etmədən də) və sənəd də heç bir problem olmadan elektron imza ilə saxlanacaq.

İpucu 254. Rus mətnləri üçün kod cədvəlini avtomatik olaraq necə təyin etmək olar

Problem məlumdur: rus dili üçün bir neçə fərqli kod cədvəli istifadə olunur və buna görə də faktiki vəzifə mətnləri bir kodlaşdırmadan digərinə çevirməkdir. Niyə istifadə olunan kod cədvəlini avtomatik aşkarlamalısınız? Burada iki bariz nümunə var:

  1. Veb səhifələri brauzerə yükləyərkən bu lazımdır, mətn faylları- Word-də və ya işləyərkən poçt proqramları(fərqli kodlaşdırma seçimlərini sınamaqdansa bunu etmək daha yaxşıdır).
  2. Bu, fayl kodlarını çevirərkən əlavə nəzarət üçün lazımdır. Məsələn, biz davamlı olaraq HTML səhifələrini Windows-dan KOI8-ə çeviririk (Web serverimiz UNIX-də işləyir), lakin bəzən ehtiyatsızlıq ucbatından ya ikiqat konvertasiya edirik, ya da səhv quraşdırırıq. mənbə kodu, ya da biz faylları tamamilə atlayırıq.

İdeya avtomatik aşkarlama Rus mətnlərinin kodlaşdırılması olduqca açıqdır: müxtəlif ədədi diapazonlarda 128-255 (&h80-&hFF) kodlarının baş vermə tezliyini müəyyən etmək lazımdır. Aydındır ki, bu kodların əsas hissəsi rus hərfləri ilə yazılmışdır (şifrə cədvəlinin yuxarı yarısında bir sıra xüsusi simvollar da var, məsələn, “Xeyr”, açılış və bağlanış sitatları, Müəlliflik hüququ və s.) və böyük hərflərdən çox kiçik hərflər.

Cədvəl CodeTableTest alt proqramından istifadə edərək əldə edilmiş kifayət qədər tipik rusdilli mətn üçün bu cür statistikanın hesablanmasının nəticələrini göstərir (Siyahı 1). Burada aydın görünür kiçik hərflər müxtəlif kod cədvəlləri üçün müxtəlif rəqəmli diapazonlara düşür. Maraqlıdır ki, rus əlifbasının birinci yarısında hərflərin görünmə tezliyi (“a”dan “p”ə qədər) “p”dən “ya”ya qədər olan hərflərin tezliyindən iki dəfə yüksəkdir.

Müvafiq olaraq, 128-255 kodları arasında kiçik rus hərflərinin faizinin verilmiş dəyəri aşmasını şərt kimi qəbul etsək, məsələn, Lfaiz = 0,70, kod cədvəlinin müəyyən edilməsi meyarı belə görünəcəkdir: Windows
tezlik (&hE0-&hFF) > Lfaiz KOI8-R
tezlik (&hC0-&hDF) > Lfaiz DOS
tezlik (&hA0-&hAF + &hE0-&EF) > Lfaiz ISO

tezlik (&hD0-&hEF) > Lfaiz Burada yeganə problem identifikasiyadır müxtəlif kodlaşdırmalar

Rus kiçik hərfləri üçün kod diapazonu demək olar ki, eyni olan Windows və Macintosh. Ancaq burada əlavə yoxlama apara bilərsiniz ki, bu da Windows-da &h80-&h8F diapazonunda praktiki olaraq heç bir kodun istifadə edilməməsinə və "A"-dan "P"-ə (&hC0-&CF) qədər olan böyük hərflərin bir nömrəni təşkil etməsinə əsaslanır. əhəmiyyətli dəyərdir, halbuki Macintosh-da eyni diapazonlar üçün vəziyyət diametrik olaraq əksinədir.

Yuxarıda təsvir edilən alqoritmi həyata keçirən NumberTableTest funksiyası Siyahı 1-də göstərilmişdir. Daha birinə diqqət yetirin mühüm aspekt

Binar üçün №1 LenS = LOF(1) ReDim bytSourceArray(1-dən LenS) Bayt kimi alın #1, bytSourceArray Bağlayın #1

Əgər əvvəlcə simli dəyişən kimi təqdim edilmiş məlumatları çevirmək lazımdırsa, onda aşağıdakı çevrilməni yerinə yetirməlisiniz:

BytSourceArray() = StrConv(SourceString$, vbFromUniCode, &h419)

İpucu 255. Mətn kodlamasını necə təyin etmək olar: başqa bir seçim

Əvvəlki məsləhətdə verilmiş alqoritm mətnin səhv kodlaşdırılması zamanı, yəni mənbə məlumatları artıq kod cədvəllərinin heç birinə uyğun gəlmədikdə işləmir. (Məsələn, Windows-da yazılmış mətn səhvən “DOS-dan hər hansı digərinə” çevrildikdə.) Belə hallarda mətnin bərpası bəzən tamamilə qeyri-mümkün olur, lakin istənilən halda belə bir vəziyyəti müəyyən etmək faydalıdır.

Veb serverdə yerləşdirmək üçün nəzərdə tutulmuş öz HTML səhifələrimizi yaradan zaman biz tez-tez kod dəyişdirmə problemi ilə qarşılaşırıq. Bu fayldakı faktiki kod cədvəlinə nəzarət etmək üçün aşağıdakı texnikadan istifadə edə bilərsiniz. (Biz özümüz serverimizin yerli versiyasına yeniləmələri skan edirik ki, bu cür səhvləri aşkar etmək üçün onları uzaq kompüterə yazmadan əvvəl.)

Hər yeni HTML səhifəsinə “е” istisna olmaqla, rus əlifbasının bütün hərflərini özündə birləşdirən şərh sətri daxil edilir (belə bir xətt avtomatik olaraq sadə səhifə generatorumuz tərəfindən yaradılır):

Əlbəttə ki, istifadə olunan simvolların sayını minimuma endirmək olar, lakin onların tam dəsti mütləq istədiyiniz həlli təmin edəcəkdir.

Kodu yoxlayan TstCode2 yardım proqramı üçün proqram kodu ayrı fayl, Siyahı 2-də göstərilmişdir. Burada əsas prosedur simvol kodunun identifikasiyasını həyata keçirən NumberTableTestKeydir.

Sizin real iş Mətn və HTML fayllarının kod cədvəlini yoxlamaq üçün yuxarıda təsvir edilən iki metodun kombinasiyasından istifadə edən TestCode yardım proqramından (şək. 1) istifadə edirik.

ComputerPress 3" 2000

VBA Excel-də obyekt dəyişəninə bir sıra xanaların təyin edilməsi. Dəyişən diapazonda xanaların ünvanlanması və onlarla işləmək. Aralığın ölçüsünün müəyyən edilməsi. Nümunələr.

Dəyişənə bir sıra xanaların təyin edilməsi

Bir dəyişənə bir sıra xanalar təyin etmək üçün o, kimi elan edilməlidir Variant, Obyekt və ya Aralığı:

myRange1-i Variant kimi sönükləşdirin myRange2-ni Obyekt kimi azaldın myRange3-ü Variant kimi azaldın

Dəyişənin niyə yaradıldığını aydınlaşdırmaq üçün onu belə elan edin Aralığı.

Operatordan istifadə edərək dəyişənə bir sıra xanalar təyin edin Set:

myRange1 təyin edin = Range("B5:E16") Set myRange2 = Range(Cells(3, 4), Cells(26, 18)) Set myRange3 = Seçim

İfadədə Aralıq(Hüceyrə(3, 4), Hüceyrə(26, 18)) Rəqəmlər əvəzinə dəyişənlərdən istifadə edə bilərsiniz.

Dəyişənlərə bir sıra xanalar təyin etmək üçün onunla sonrakı işləmək üçün iş vərəqində diapazonu seçməyə imkan verən daxili dialoq qutusundan istifadə edə bilərsiniz.

Diapazondakı Hüceyrələrin Ünvanlanması

Təyin olunmuş diapazondakı xanalara onların indeksləri və onların kəsişdiyi sətir və sütunların indeksləri ilə daxil olmaq olar.

Təyin edilmiş diapazondakı xanalar soldan sağa və yuxarıdan aşağıya indekslənir, məsələn, 5x5 diapazon üçün:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Sətir və sütunların indeksləşdirilməsi yuxarı sol xanadan başlayır. Bu nümunədəki diapazon 5 sətir və 5 sütundan ibarətdir. 2 sətir və 4 sütunun kəsişməsində 9 indeksli xana var. Siz ona bu şəkildə daxil ola bilərsiniz:

"sətir və sütun indeksləri ilə giriş myRange.Cells(2, 4) "xüceyrə indeksi myRange.Cells(9) ilə giriş

Dəyişən diapazonda siz təkcə fərdi xanalara deyil, həm də dəyişənə təyin edilmiş diapazonun bir hissəsinə (alt aralıq) daxil ola bilərsiniz, məsələn,

təyin edilmiş 5x5 diapazonunun birinci sırasına daxil olmaq:

MyRange.Range("A1:E1") "və ya myRange.Range(Cells(1, 1), Cells(1, 5))

və təyin edilmiş 5x5 diapazonunun birinci sütununa daxil olmaq:

MyRange.Range("A1:A5") "və ya myRange.Range(Cells(1, 1), Cells(5, 1))

Dəyişəndə ​​diapazonla işləmək

Dəyişəndəki diapazonla iş vərəqindəki diapazonla eyni şəkildə işləyə bilərsiniz. Obyektin bütün xassələri və metodları Aralığı dəyişənə təyin edilmiş diapazon üçün də etibarlıdır. Xassə göstərilmədən xanaya daxil olduqda, onun dəyəri standart olaraq qaytarılır. Simlər

MsgBox myRange.Cells(6) MsgBox myRange.Cells(6).Value

ekvivalentdirlər. Hər iki halda, MsgBox məlumat mesajı xananın dəyərini indeks 6-da göstərəcək.

Əhəmiyyətli: yalnız dəyərlərlə işləməyi planlaşdırırsınızsa, dəyişənlərdən istifadə edin, onlarda kod daha sürətli işləyir.

Obyekt dəyişənindəki xanalar diapazonu ilə işləməyin üstünlüyü ondan ibarətdir ki, dəyişənə edilən hər hansı dəyişiklik iş vərəqindəki diapazona (dəyişə təyin olunan) tətbiq edilir.

Misal 1 - dəyərlərlə işləmək

Proseduru kopyalayın proqram modulu və idarə edin.

Alt Test1() "Dim myRange dəyişənini Range kimi elan edin "Hüceyrələr diapazonunu təyin edin myRange = Range("C6:E8") "Birinci sətri doldurun"Birinci xanaya dəyər təyin edin myRange.Cells(1, 1) = 5 "İkinci xanaya dəyər təyin edin myRange.Cells(1, 2) = 10 "Üçüncü xananı myRange.Cells(1, 3) = myRange.Cells(1, 1) ifadəsinin dəyərinə təyin edin " * myRange.Cells(1, 2) "İkinci sıra myRange-i doldurun. Cells(2, 1) = 20 myRange.Cells(2, 2) = 25 myRange.Cells(2, 3) = myRange.Cells(2, 1) _ + myRange.Cells(2, 2) "Üçüncü sıranı doldurun myRange .Cells(3, 1) = "VBA" myRange.Cells(3, 2) = "Excel" myRange.Cells(3, 3) = myRange.Cells(3, 1) _ & " " & myRange.Cells(3 , 2) End Sub

Diqqət yetirin ki, iş vərəqindəki diapazon xanaları diapazon dəyişənindəki xanalarla eyni şəkildə doldurulur, bu da onların bir-biri ilə birbaşa əlaqəli olduğunu sübut edir.

Misal 2 - formatlarla işləmək

Biz eyni “C6:E8” iş vərəqi diapazonu ilə işləməyə davam edirik:

Alt Test2() "Dim myRange dəyişənini Range kimi elan edin "Hüceyrələr diapazonunu təyin edin myRange = Range("C6:E8") "Birinci sətir qalın myRange.Range("A1:C1") ilə vurğulanır.Şrift. Qalın = Doğrudur "İkinci myRange.Range("A2:C2") fonu ilə xətti vurğulayır.Interior.Color = vbGreen "Üçüncü sətirə sərhədləri əlavə et myRange.Range("A3:C3").Borders.LineStyle = True End Sub

Yenə də qeyd edək ki, biz birbaşa iş vərəqinin xanaları ilə işləməsək də, təyin olunmuş diapazondakı bütün format dəyişiklikləri iş vərəqində əks olunub.

Nümunə 3 - dəyişəndən aralığın kopyalanması və yapışdırılması

Dəyişənlərə təyin edilmiş diapazondakı xanaların dəyərləri təyinetmə operatorundan istifadə edərək başqa iş səhifəsi diapazonuna köçürülür.

Metoddan istifadə edərək bütün aralığı dəyərlər və formatlarla kopyalayıb yapışdıra bilərsiniz Kopyalayın, iş vərəqində daxiletmə yerini (xananı) göstərməklə.

Nümunə ilk iki ilə eyni diapazondan istifadə edir, çünki o, artıq dəyərlər və formatlarla doludur.

Sub Test3() "Dim myRange dəyişənini diapazon kimi elan edin"Hüceyrələr diapazonunu təyin edin myRange = Range("C6:E8") "İş vərəqinin hüceyrələrinə" diapazon dəyişəninin xanalarının dəyərlərini təyin edin Range("A1" :C3") = myRange.Value MsgBox " Pause" "Dəyişən diapazonunun kopyalanması "və onu başlanğıc xananı göstərən "iş vərəqinə yapışdırılır myRange.Copy Range("E1") MsgBox "Pause" "Pause" "Bir hissəsini kopyalayıb yapışdırmaq myRange.Range("A2:C2") dəyişəninin "aralığı .Copy Range("E11") End Sub

MsgBox məlumat qutusu əlavə edilmişdir ki, siz onu Excel iş kitabında sınamaq qərarına gəlsəniz, addım-addım işləyən proseduru görə bilərsiniz.

Dəyişən diapazon ölçüsü

Metoddan istifadə edərək diapazon əldə etdikdə və onu diapazon dəyişəninə təyin etdikdə onun ölçüsünü bilmək faydalı ola bilər. Bu aşağıdakı kimi edilə bilər:

Sub Test4() "Dim myRange dəyişənini diapazon kimi elan et "Xüceyrələr diapazonunu təyin et myRange = Application.InputBox("Bir sıra xanalar seçin:", 8) "Sətr və sütunların sayını tapın MsgBox "Sətrlərin sayı = " & myRange.Rows.Count _ & vbNewLine & "Sütunların sayı = " & myRange.Columns.Count End Sub

Proseduru yerinə yetirin, Excel iş vərəqində istənilən aralığı seçin və "OK" düyməsini basın. Məlumat mesajı dəyişənə təyin edilmiş diapazonda sətir və sütunların sayını göstərəcək myRange.

Parametrlər