Дата: 02 Фев 2020
02.02.2020
С проблематиката Макроси се занимавам още от самото им появяване, някъде 1995-1997 г. Идеята и начинът за постигането и да се автоматизират рутинни компютърни операции, ми се струваше много привлекателна. Мнението ми и досега остава същото. Нещо повече. Автоматизирането на офис приложенията и особено съвместното им използване /Word и Excel, Corel и Excel, Access и Word, Autocad и Excel/ изглеждат все по-важни и необходими. С тази микро - статия поставям началото на своите компютърни мемоари. Оставям темата отворена за предложения и обсъждания.
Спомням си това не много добре, но някъде 1997 г. бях създал един макрос, който при отваряне на документ на Word ми съобщаваше, че до 31.12.2019 год. остават някъде към 8400 дни. Това ми се струваше първоначално страшно много. Към днешна дата, 02.02.2020 виждам, че това изобщо не е така. Изследвайки и развивайки темата за макросите реших да разпечатам всички тези дни така, че на един ред да излизат датата, деня от седмицата, ако е неделя или събота буквите да са bold, червени. Простата аритметика показва, че ако на една страница има 50 реда, то числата от 8400 до 1 и съответните им дати ще заемат 168 стр.
За макроси въобще не е възможно да се пише. Това е така, защото те имат смисъл и са възможни само в конкретна среда. Примерно такава среда е Word.
За много хора работата с Word е синоним на компютърна грамотност. Това е така и не е така, защото повечето от тях използват към 3% от възможностите на продукта.
В днешно време компютърната грамотност не е достатъчна. Говорим вече за компютърни умения.
Един конкретен пример: Искате да разпечатате числата от 1 до 1000 на хартия в колонка.
Първо избирате инструмент - може да e Word, Excel, Access, CorelDraw и т.н.
Ние се спираме на Word.
Трябва да подчертая, че както не е възможно лекарят да постави диагноза, която не знае, че съществува, така Не възможно да се автоматизира дейност, която не може да извършите без автоматизация.
За написването на числата от 8400 и съответните дати във Word би трябвало да положим немалко усилия, ако го правим по традиционния машинопис, дори да огъваме главиатурата от усърдие.
С макрос нещата изглеждат така:
Sub WRITE_NUMBERS_1_8400()
'
' WRITE_NUMBERS_1_8400 Macro
'
'
Selection.TypeText Text:="1."
Selection.TypeParagraph
Selection.TypeText Text:="2."
Selection.TypeParagraph
Selection.TypeText Text:="3."
Selection.TypeParagraph
Selection.TypeText Text:="4."
Selection.TypeParagraph
Selection.TypeText Text:="5."
End Sub
Ползата от стартирането на горния макрос не е голяма, тъй като той ще отпечата само числата от 1 до 5. Но начинът му на създаване чрез запис е епохален. С малко модификации ще постигнем отпечатване на числата от 1 до 8400 и дори ще намалим броя на редовете в макроса.
Следващият макрос е преработен горен макрос и разпечатва числата до 200. Смяната на 200 на 8400 ще отпечата числата до 8400, но на компютъра ще му трябва известно време. Доста по-малко, отколкото на ръка.
Sub WRITE_NUMBERS_2_8400_1()
For x = 1 To 200
Selection.TypeText Text:=x & "."
Selection.TypeParagraph
Next
End Sub
Колко време ще му трябва можем да разберем с хронометър в ръка или като добавим още два програмни реда. Първият в началото записва датата и часа на стартиране на макроса, а последният ред записва същата информация, но при спиране на изпълнението, т.е. след отпечатване на въпросните 8400 реда
Sub WRITE_NUMBERS_3_8400_1()
Selection.TypeText Text:=Date & " " & Time
Selection.TypeParagraph
For x = 1 To 200
Selection.TypeText Text:=x & "."
Selection.TypeParagraph
Next
Selection.TypeText Text:=Date & " " & Time
End Sub
Резултатът вече е:
2.2.2020 г. 15:43:02
1.
2.
.
.
198.
199.
200.
2.2.2020 г. 15:43:02
Но пак не е съвсем удобно. Защото трябва от едното време да се вади другото, за да се види разликата.
Следва нова промяна, където в time_start се записва времето на стартиране на макроса, в time_end - времето на край на работата му, а в time_total - разликата в двете времена.
Sub WRITE_NUMBERS_3_8400_1()
time_start = Time
Selection.TypeText Text:=Date & " " & Time
Selection.TypeParagraph
For x = 1 To 200
Selection.TypeText Text:=x & "."
Selection.TypeParagraph
Next
Selection.TypeText Text:=Date & " " & Time
time_end = Time
time_total = time_end - time_start
Selection.TypeParagraph
Selection.TypeText Text:=time_total
End Sub
Но резултатът е малко неочакван. Обърнете внимание на последния ред - някакво число.
199.
200.
2.2.2020 г. 16:27:33
1,15740740740389E-05
Това налага малко главоблъсканица, тъй като компютърът обработва времевите данни по по-особен начин. Няма да навлизам в детайли тук, а когато му дойде времето, ако изобщо дойде такова.
Sub WRITE_NUMBERS_5_8400_1()
time_start = Time
Selection.TypeText Text:=Date & " " & time_start
Selection.TypeParagraph
For x = 1 To 8400
Selection.TypeText Text:=x & "."
Selection.TypeParagraph
Next
time_end = Time
Selection.TypeText Text:="Start=" & Date & " " & time_start
Selection.TypeParagraph
Selection.TypeText Text:="End=" & Date & " " & time_end
time_total = time_end - time_start
Selection.TypeParagraph
Selection.TypeText Text:="Time=" & Round(time_total / 0.0000115741)
End Sub
Резултатът:
1.
2.
3.
.
.
8398.
8399.
8400.
Start=2.2.2020 г. 23:32:23
End=2.2.2020 г. 23:32:46
Time=23
И т.н. и т.н. правим промени докато се постигне възможно най-добрият програмен код, който удовлетворява потребностите ни. Усъвършенстването може да е безкрайно. Записването на макроси е все едно малко дете да се учи да говори. Първо то се запознава с предметите от околния свят и техните свойства. След това започва да произнася отделни думи, най-често първо съществителни. После включва и глаголи, започва да произнася първите изречения. После съставя малки разкази. После ги увеличава. А след това може да напише "Война и мир".
Изобщо малката автоматизация е в основата на голямата.
Обикновено първите вълнения при писане на макроси са когато при кликване на мишката въпху някой направен от нас бутон се случи нещо, примерно да излезе съобщение "Здравейте?"
Следващото вълнение е, когато можем да разполагаме бутони и текстови полета направо в документа. Съответно можем да натискаме директно бутони, разположени върху страницата на Word.
Има няколко фундаментални принципа при писане на макроси.
1. Трябва да знаем какво искаме
2. Не трябва да искаме повече, отколкото знаем
3. Ако искаме повече, отколкото знаем, най-добре е да потърсим консултативна помощ
4. При писането на макроси трябва да правим хипотези. Когато хипотезите и плановете ни започнат да работят според очакванията, то това означава, че сме навлезли в материята
5. Доброто познаване на обектите, техните качества и методи са предпоставка да можем да правим нормални макро-изречения. И тогава речта ни няма да звучи като "Вода. Пий." А ще бъде нещо като "Моля, дай ми да пия вода!" или нещо такова. Все пак без етапа на "Вода. Пий" не може да се мине.
До скоро!