Whatis.Ru

Информация о компьютерах доступным языком
Назад на сайт

Вы не зашли.


#1 11-06-2014 18:14:18

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

:: Visual Basic для карапузов ::

ВВЕДЕНИЕ

Данный материал не является полноценным учебником VisualBasic, а содержит только необходимый минимум для выработки алгоритмического мышления и начальных навыков программирования. В качестве системы программирования используется VBA. Добавление материалов - только приветствуется!

Для освоения материала, не нужно ничё искать/скачивать - всё у вас уже есть, достаточно запустить MS-WORD/Excel и нажать комбинацию клавиш [ALT+F11]. Правда создать готовый-исполняемый файл *.ехе у вас не получится, но для приобретения навыков VBA вполне хватает.

Название "Visual Basic" говорит само за себя. Уже по слову "Visual" можно догадаться, что здесь реализован визуальный стиль программирования. Вы даже не программируете, а проектируете приложение. Ваша первая задача при этом — создать рабочую среду. Слово "Basic" - Beginners Atlpurpose Symbolic Instruction Code (многоцелевой код символических команд для начинающих).

Создадим простое приложение. Точнее создавать и программировать не придется вообще ничего - VBasic изначально предоставляет готовое приложение. В строке меню жмём [Insert-->UserForm].

Главное окно среды разработки содержит несколько окон. Все окна подчиняются главному окну VBasic:

Окно формы (UserForm1) — главный элемент приложения. Форма представляет собой контейнер для элементов управления. Точки/сетки на форме, только помогают размещению элементов и при работе приложения не видны.

Панель компонентов (ToolBox) - кнопки, поля ввода и др. элементы, которые нужны для создания приложения. Для выбора элемента управления (Control) нужно щёлкнуть на нём и затем с помощью мыши установить в форме его размер и позицию.

Окно свойств (Properties). В этом окне задаются свойства выбранного элемента управления. Окно имеет 2 вкладки, в которых одни-и-теже свойства объектов отсортированны по-алфавиту или по-категориям.

Окно кода. Сразу после запуска "Visual Basic" это окно не отображается. Тем не менее, оно едва-ли не самое важное, т.к. именно в нём вводится программный код. Код разделяется на процедуры и, как правило, непосредственно связан с определенными элементами управления. "Окно кода" вызывается двойным кликом на элементе, для которого необходимо написать код.

Таким образом, в процессе разработки приложения в форму помещаются компоненты, для них устанавливаются нужные свойства и создаются обработчики событий.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#2 11-06-2014 18:15:53

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

СВОЙСТВА, МЕТОДЫ И СОБЫТИЯ

Мы помним, что объекты имеют свои свойства. С помощью свойств можно управлять внешним видом, а также поведением объектов при выполнении приложения. Обычно установка свойств происходит на этапе проектирования с помощью окна свойств.

Для обращения к объекту в приложении, предназначено свойство (Name). Например, кнопка (CommandButton), помещенная на форму первой, получает имя "CommandButton1", вторая - "CommandButton2" и т.д. Объектам лучше задавать более информативные имена, чем имена по умолчанию. Целесообразно присваивать имена, которые дают возможность распознать их тип и назначение. Например: MyForm, cmdExit и т.д.

Внимание! Свойство "Name" играет особую роль. Ошибки при его задании часто приводят к серьезным последствиям. Имя является идентификатором элемента управления, поэтому сначала следует задавать имя элемента, и лишь затем писать для него код события.

Обычно, начинающие программисты путают свойства "Name" и "Caption".
"Name" - это идентификатор объекта, а свойство "Caption" - определяет текст надписи на объекте. Установите с помощью окна свойств следующие значения: "Name" - MyForm, "Caption" - Моя форма. Запустите программу и обратите внимание на верхний-левый угол окна.., там будет красоваться надпись "Моя форма".

Windows — это система, базирующаяся на сообщениях и событиях. Это значит, что каждое действие вызывает событие, которое в виде сообщения передается в приложение. Приложение анализирует сообщение и выполняет соответствующее действие.

Вывод: для выполнения программного кода всегда необходимо событие! Это одно из важнейших правил создания приложений в VBasic. Ни один код не выполняется без события. В программах, управляемых событиями (в отличии от основанных на линейном принципе построения), нет сплошного кода, который выполняется от начала до конца. После запуска программы у пользователя больше нет чётко-определенного пути.

VB предоставляет ряд различных событий. Приложению следует подождать, пока одно из этих событий не наступит, и только потом выполнять код. Вот несколько событий, которые могут обрабатываться большинством элементов управления:

* Click - клик на элементе управления
* MouseDown - нажатие кнопки мыши
* MouseUp - отпускание кнопки мыши
* MouseMove - движение мыши
* KeyPress - возвращает код ASCII нажатой клавиши
* KeyDown - при нажатии клавиши
* KeyUp - при отпускании клавиши

..в листинге программного кода эти события будут выглядеть так:

Пример 1.
Создаём окно и кадаем не него одну кнопку. Чтоб написать код для кнопки, щёлкаем на ней 2 раза и попадаем в "Окно кода". Стираем всё, что там видим и пишем следующее:

' Диалоговое окно "Hello World"
Private Sub CommandButton1_Click()
MsgBox "Привет WHATIS!"
End Sub

Чтоб протестить наше творение, жмём в окне VBasic [F5].
Как видим, здесь указано событие (Click) для кнопки №1. Диалоговое окно вызывается оператором (MsBox), а далее идёт текст мессаги в кавычках.

Если нужно в диалоговом окне расположить текст в несколько строк, то нужно добавить оператор перевода строки - команду (& VbNewLine &):

' Два диалоговых окна. Второе выходит после первого.
Private Sub CommandButton1_Click()
MsgBox "Привет WHATIS!"
MsgBox "Человек должен изучить теорию, а потом набираться практики." & VbNewLine &
"В любви наоборот: теоретиками становятся тогда, когда практика уже закончилась."
End Sub

Как было сказано, в оконных приложениях код выполняется НЕ последовательно, ..каждая строчка программы "ждёт своего часа"! Именно поэтому (в коде выше) вторую мессагу мы увидим только тогда, когда первая отработает, т.е. пока не нажмём кнопку "ОК".


ВИДЫ ПЕРЕМЕННЫХ

Для чего придумали описание переменных, вы задумывались? Не всё так просто как кажется. Это сделано для того, что бы мы могли указать программе каким образом необходимо "думать"! Если у нас переменная содержит какую-то дату, то мы можем это описать, и наш компьютер не будет ломать свою "голову". От того как мы опишем переменную, будет зависеть скорость её выполнения. Переменные бывают:

* глобальными (Public) - действует внутри всего кода
* статическая (Static) - действует внутри одной процедуры
* константа (Const) - переменная, с некоторым значением
* есть ещё (Private) - действует в своём модуле

Теперь посмотрим как можно описать переменную, один из примеров показан ниже:

    Dim R As Byte

Dim - это оператор
R - это переменная
As - это часть нашего синтаксиса
Byte - это тип данных, который и описывает нашу переменную.

Переменные желательно описать в начале кода программы:

    Sub Programms()
        Dim A As Byte
        Dim B As Long
        Dim C As Integer
        Dim D As Byte
   
    'дальше идёт код вашей программы...
    End sub

Посмотрим, какие есть типы переменных, и какие значения им можно присвоить:

Boolean  (логический) | True, False
Byte     (байтовый)   | 0... 255
Integer  (целое)      | -32768.. +32767
Long     (длин.целое) | -2147483648... +2147483647
Single   (плав.точка) | -1,401298*10(-45).. +3,402823*10(38)
Currency (денежный)   | -922337203685477,5808.. +922337203685477,5807
String   (строковый)  | текст (2 млрд.симв). Данные записываются в кавычках.
Date     (дата)       | ..до 31.12.9999г., время от 00:00:00 до 23:59:59
Object   (объект)     | ссылка на объект (указатель)
Variant  (вариант)    | универсальный тип, любые из перечисленных выше

Одним оператором "Dim" можно описать произвольное число переменных, но конструкция "Аs" должна быть указана для каждой из них, иначе переменным без "Аs" будет присвоен тип "Variant". Например:

Dim (A As Byte, B As Integer, C, D As String)

A - переменная байтового типа
B - целого типа
C - универсального типа (т.к. не задана)
D - строкового типа



На описание переменных нужно обратить особое внимание, т.к. большинство ошибок связано именно с некорректным определением переменных.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#3 12-06-2014 00:02:17

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

ОПЕРАТОРЫ ПЕРЕХОДОВ

Переходы в коде позволяют управлять последовательностью выполнения программы. Данные конструкции ещё называют "конструкциями принятия решений". Применение операторов принятия решения позволяет выполнять определенные действия в зависимости от условий, возникающих в программе.

В VBasic, как и во всех языках программирования, существуют управляющие конструкции, предназначенные для управления порядком выполнения команд. Различают два основных типа управляющих операторов:

if
Select Case

Конструкция "if" используется в том случае, когда необходимо, чтобы группа операторов выполнялась при соблюдении определенных условий. Конструкция "Select Case" позволяет на основании анализа значения выполнять какие-либо действия. В свою очередь, управляющие операторы "if" бывают двух видов:

If...Then
If...Then...Else

Конструкция "If...Then" применяется, когда необходимо выполнить определенные действия в зависимости от некоторого условия, а "If...Then...Else" - когда необходимо выполнить разные действия в зависимости от условия.

Рассмотрим эти конструкции более подробно. Создадим форму с одной кнопкой, которая вызовет второе окно с полем ввода текста "InputBox". Короче, пропишем этот код:

  Private Sub CommandButton1_Click()
    InputBox "Как читается наоборот слово УНИТАЗ?", "Отгадай загадку!"
  End Sub

Но данная запись нам только покажет это сообщение, и считать с него данные не получится - нет обработчика события. Для того чтобы распознать вводимые данные и передать их дальше для обработки, данное сообщение можно записать так:

  Private Sub CommandButton1_Click()

    R = InputBox (Environ("Username") & vbNewLine &
    "Как читается наоборот слово УНИТАЗ?", "Отгадай загадку!")
   
    If R = "ЗАТИНУ" Then
    MsgBox "Ответ правильный!"
    Else
    MsgBox "Попробуй ещё раз!"
    End If

  End Sub

При такой записи наша переменная R принимает то значение, которое мы ввели. Теперь его можно обрабатывать так, как нам угодно. Обратите внимание, что в "InputBox" появилась новая строка "Environ("UserName")". Она возвращает нам системную переменную "Имя пользователя", а "Отгадай загадку" - это заголовок окна.

Если у нас есть какое-то число, или данные по умолчанию, и нам необходимо прописать их в "InputBox", то формат записи будет такой:

  Private Sub CommandButton1_Click()
  InputBox ("текст в окне", "заголовок окна", "текст в поле ввода")
  End Sub


Как было сказано выше, VBasic в своём арсенале имеет системную функцию "Environ". Как видно из названия, она лезет в дебри системы и роется там в переменных. Вот что она может возвратить:

* UserName - имя пользователя
* ComputerName - имя компа
* WinDir - путь к папке Windows
* OS - тип системы
* Processor_Architecture - архитектура процессора
* TMP - директория временных файлов
* BLASTER - координаты звуковой карты
* PATH - пути, объявленные в autoexec.bat

'Пример. На форме кнопка и текстовое поле
  Private Sub CommandButton1_Click()
    MsgBox Environ("ComputerName")
    TextBox1.Text = Environ("UserName")
  End Sub


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#4 12-06-2014 11:25:26

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Оператор "Select Case". Многочисленное условие

Оператор "Select Case" - это примерно то же самое, что и условие "If", но с некоторыми отличиями. Если условие "if..Then..Else" (если..То..Иначе) выполняет всего три инструкции, то оператор "Select Case" может выполнять сколько-угодно инструкций. Записывается он следующим образом:

  Select Case R
    Case A
        .XXX.
    Case B
        .YYY.
    Case Else
        .ZZZ.
  End Select

Select - это открытие нашего оператора;
Case R - переменная, для которой будут выполняться инструкции;
Case A - если переменная R совпала с A, то будет выполняться условие .XXX.;
Case B - описываем случай B, при котором будет выполняться условие .YYY.;
Case Else - это тот случай, когда (A, B) не совпала с R. ..выполняется инструкция .ZZZ.;
End Select - закрываем наш оператор;

Случаев "Case" может быть столько, сколько Вы захотите. При этом A и B может принимать сразу несколько значений, например:

  Private Sub CommandButton1()
    Dim x As Integer
         
    x = Fix(Rnd * 150) 'генерируем случайное число "Rnd", и округляем его "Fix".
        MsgBox "Значение Х = " & x & "."
         
  Select Case x
    Case Is <= 10
        MsgBox "т.е. X <= 10"
    Case 11 To 40
        MsgBox "т.е. X <= 40 и > 10"
    Case 41 To 70
        MsgBox "т.е. X <= 70 и > 40"
    Case 71 To 100
        MsgBox "т.е. X <= 100 и > 70"
    Case Else
        MsgBox "X не попадает в диапазон"
  End Select
  End Sub

Данный макрос присваивает Х произвольное/целое значение, и если это значение попадает в один из указвнных диапазонов нам появляется сообщение, в какой диапазон оно попадает. Если-же Х не попадает ни в один диапазон, то нам появляется сообщение о том, что Х не попадает в диапазон.

Или такой пример:

  Private Sub CommandButton1()
    Dim A As Variant
    A = InputBox("Ведите число от 1 до 10", "Ввод данных", "0")
         
    Select Case A
      Case 2, 4, 6, 8, 10
        MsgBox "Число чётное", vbInformation, "Проверка на чётность"
      Case 1, 3, 5, 7, 9
        MsgBox "Число нечётное", vbInformation, "Проверка на нечётность"
      Case Else
        MsgBox "Введены неправильные данные!", vbCritical, "Ошибка ввода"
    End Select
  End Sub

При этом, в одном случае "Case" указано сразу несколько данных через запятую, которые может принять переменная А.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#5 12-06-2014 11:26:29

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Виды информационных сообщений "MsgBox".

Если вы обратили внимание, то в параметрах "MsgBox" появилась новая строка [vbInformation]. Она возвращает вид информационного окна. В VBasic существует множество информационных сообщений, которые можно впихивать куда угодно. Ниже приведены наиболее значимые типы сообщений:

* vbAbortRetryIgnore - кнопки Прервать/Продолжить/Пропустить
* vbApplicationModal - стандартное, с кнопкой ОК
* vbCritical         - критическая ошибка!
* vbExclamation      - восклицание
* vbInformation      - информ.сообщение
* vbMsgBoxHelpButton - стандартное, с OK/Справка
* vbMsgBoxRight      - стандартное, располагает текст справа
* vbMsgBoxRtlReading - отражённое окно влево
* vbOKCancel         - стандартное, с OK/Отмена
* vbRetryCancel      - стандартное, с Продолжить/Отмена
* vbSystemModal      - классическое окно
* vbYesNo            - стандартное, с Да/Нет
* vbYesNoCancel      - стандартное, с Да/Нет/Отмена

Значения кнопок

  1  vbOK      Кнопка Ок
  2  vbCancel  Кнопка Cancel (Отмена)
  3  vbAbort   Кнопка Abort (Прервать)
  4  vbRetry   Кнопка Retry (Повтор)
  5  vbIgnore  Кнопка Ignore (Пропустить)
  6  vbYes     Кнопка Yes (Да)
  7  vbNo      Кнопка No (Нет)

Посмотрим, как можно обработать нажатие кнопок в информационных окнах. Каждый буттон имеет свой порядковый ID-номер (от 1 до 7), поэтому нет нужды описывать его в коде..., достаточно указать ID:

'Пример 1:
  Private Sub CommandButton1()
    Dim a As Byte
    a = MsgBox("Форматировать диск С:\ ?", vbYesNoCancel, "Пример")

    Select Case a
        Case 6
        MsgBox "Началось форматирование диска С:\ ...", vbInformation, "Пример"
        Case 7
        MsgBox "Нет так нет", vbInformation, "Пример"
        Case 2
        MsgBox "Операция отменена", vbInformation, "Пример"
    End Select
  End Sub

'Пример 2: сложение сообщений
  Private Sub CommandButton1()
    Dim a As Byte
    a = MsgBox("Форматировать диск С:\ ?", vbYesNoCancel + vbCritical, "Пример")

    Select Case a
        Case 6
        MsgBox "Началось форматирование диска С:\ ...", vbInformation, "Пример"
        Case 7
        MsgBox "Нет так нет", vbInformation, "Пример"
        Case 2
        MsgBox "Операция отменена", vbInformation, "Пример"
    End Select
  End Sub


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#6 12-06-2014 19:59:45

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Логические операторы

Без логики никуда! Всё программирование - это логика. В VBA (как и в других языках) так-же есть свои логические операторы. Ниже приведена таблица логических операторов, их синтаксис, и описание:

    AND - X And Y  | если X и Y =1, то результат 1., иначе 0
    OR  - X Or Y   | если любой из операторов =1, то результат 1., иначе 0
    NOT - Not X    | если Х=0, то результат 1., иначе 0
    XOR - X Xor Y  | если одно из значений =1, то результат 1., иначе 0
    EQV - X Eqv Y  | если X и Y имеют одинаковые значения, то 1., иначе 0
    IMP - X Imp Y  | если X=1, а Y=0, то результат 0., иначе 1

Теперь рассмотри как они применяются на практике. Это булевая алгебра и её не обманеш..
Напишем маленькую программу, типа "Снайпер" (можно переделать на что-угодно). Расположем на форме один "Label", два "TextBox"a, и один "CommandButton". В свойствах "Label1" (окно Properties) удаляем текст со строки "Caption", т.е. на форме, поле "Label1" должно быть чистым (в него мы будем выводить текущее время).
Форма - готова, осталось написать код..

Естественно, "Если" у нас выражение логическое, то и начинаться оно может с условия "Если". Переходим в "Окно кода" (двойной клик на форме), стираем всё-что-видим и копируем этот макрос:

' Оператор AND (если). Код для формы. Выводим время в "Label1".
  Private Sub UserForm_Initialize()
    Label1 = Date
  End Sub

' Код для буттона. Инициализация переменных..
  Private Sub CommandButton1_Click()
    Dim A As Byte
    Dim B As Byte

' Подкидываем монетки для А и В..   
    A = Rnd ' Rnd - от слова "Random" (произвольный)
    B = Rnd
    TextBox1.Text = A
    TextBox2.Text = B

' Если оба решки - то "Попал", если нет - то "Промазал"..       
    If A = 1 And B = 1 Then
        MsgBox "Попал 1", vbInformation, "Игра *Sniper*"
    Else
        MsgBox "Промазал 0", vbInformation, "Игра *Sniper*"
    End If
  End Sub

..вот такая получилась гейма! Это, конечно, примитив, но если на этот код повесить приличную графику (обмани себя сам!), то юзер и не догадается, что игрухой рулит такой-простой код. Фон основного окна заливается качественной картинкой с руинами какого-нибудь города, поверх которой кладём гифку с плавающей мишенью. Разворачиваем полностью окно, и убираем системное меню (закрыть/свернуть окно). Буттоны и текстовые поля скрываем с поля зрения (режим "Hide" в свойствах). Верхний-левый угол оставляем для даты и времени, предварительно изменив стиль/цвет шрифта. Осталось добавить юзера с ружьём (можно вырезать со скрина Call-of-Duty) и гейма готова!

Так-же, можно вывести на акустику звук выстрела (в папке Call-of-Duty их куча), и вести учёт количества выстрелов для нашего юзера с ружьём. Для учёта выстрелов добавим в левом/нижнем углу ещё один "TextBox", в свойствах которого убрём рамку, зальём красным цветом, и установим режим "AutoSize". Из этого текст-бокса получится красный квадрат, ширину которого мы будем увеличавать с каждым выстрелом (режим-то "AutoSize", и мы пропишем в коде: TextBox.width = +50). Можно катапультировать вояку установить лимит патронов, для чего прописываем: "If shot > 10 Then End". Короче, зависит от фантазии...

В коде выше, мишень у нас состоит из 2-х колец - яблочко и молоко.., но и это исправимо! Не обязательно чтобы в выражении было два входных значения (в данном случае А и В). Их может быть сколько душа пожелает. Например так:

  Private Sub CommandButton1_Click()
    If A = 1 And B = 1 And C = 1  And D = 1 Then
      MsgBox "Попал 1", vbInformation, "Игра *Sniper*"
    End If
  End Sub

Здесь мы видим 4 переменные A,B,C,D (четыре кольца мишени), результат которых возвращает оператор "AND". Остальные логические операторы применяются похожим образом, только условия создаются разные.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#7 12-06-2014 20:00:40

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Простая математика

Давайте посмотрим как вычислить элементарное..
При использовании вычислительной техники нельзя забывать одно правило: - Если на бумаге все формулы пишут обычно в виде "A+B=C", то вычислительная техника такой записи не поймёт. Тут необходимо первым делом указывать переменную, в которой будет храниться конечный результат: "C=A+B". Ещё один важный момент при работе с арифметикой - это описание переменных.

Не будем разводить демагогию, а просто напишем код калькулятора, в котором будут присутствовать основные математические функции.

На форму кидаем 4 кнопки/буттона, и в их свойствах "Caption" пишем "+", "-", "/", "*", соответственно. Получается, что "буттон 1" у нас "+", "буттон 2": "-", и т.д. Чтобы все кнопки были одинакового размера, удобно их копировать: зажал кнопку вместе с [Ctrl] и перетащил копию в нужное место. Порядковый номер она получает автоматом.

Следующим шагом у нас идут "TextBox" (поля ввода): всего их 3 - первое/второе юзерские значение, а третья - вывод результата.., соответственно "TextBox1", "TextBox2", "TextBox3". Осталось написать код..

' обзываем окошко
  Private Sub UserForm_Initialize()
    UserForm1.Caption = "Калькулятор"
  End Sub

' для кнопки сложения
  Private Sub CommandButton1_Click()
    Dim a As Single ' Переменные А и В с плавающей точкой,
    Dim b As Single ' это чтоб считать не только целые числа, но и десятые/сотые
    a = TextBox1.Text
    b = TextBox2.Text
    TextBox3.Text = a + b
  End Sub

' для кнопки вычитания
  Private Sub CommandButton2_Click()
    Dim a As Single
    Dim b As Single
    a = TextBox1.Text
    b = TextBox2.Text
    TextBox3.Text = a - b
  End Sub

' для кнопки деления
  Private Sub CommandButton3_Click()
    Dim a As Single
    Dim b As Single
    a = TextBox1.Text
    b = TextBox2.Text
    TextBox3.Text = a / b
  End Sub

' для кнопки умножения
  Private Sub CommandButton4_Click()
    Dim a As Single
    Dim b As Single
    a = TextBox1.Text
    b = TextBox2.Text
    TextBox3.Text = a * b
  End Sub

..можно продолжить этот код: ..накидать на форму ещё кнопок для вычисления корня, синуса, возведения в квадрат, перевод в др.систему счисления, всякие конверторы и т.д. и т.п. С меня - показать дорожку, а дальше топайте сами. smile3


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#8 14-06-2014 09:53:57

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

РАБОТА С ЦИКЛАМИ

Цикл - это повторяющееся действие какой-либо операции.
Например, нам надо прибавить к одному и тому-же числу значения от 1 до 100. Еcтественно, неудобно будет писать каждую операцию вручную. Вот именно для этого и придумали циклы. Посмотрим какие они бывают:

For...Next       | мы знаем, сколько раз нужно выполнить действие
For Each...Next  | когда требуется перебрать элементы в группе/массиве
Do While...Loop  | будет выполняться, пока условие истинно
Do Until...Loop  | будет выполняться, пока условие ложно


Цикл For...Next - самый распространённый. Записывается в макросе он следующим образом:

  Private Sub CommandButton1_Click()
    For i = 1 to 10 Step 1
    MsgBox "Счетчик: " & i
    Next i
  End Sub

For - объявляет наш цикл;
i - это переменная которая принимает разные значения (равносильно нашему От);
To - это конечное значение переменной (равносильно нашему До);
Step - это шаг цикла. Если шаг равен 1, то "Step" можно не писать;
Next - это конец нашего цикла, он переводит цикл на начало For.

Читается это так: Цикл от 1 до 10 с шагом 1.
То-есть в начале выполнения нашего цикла i = 1, далее происходит вызов окна и значение "Next" переводит переменную i на следующее значение.., в данном случае шаг "Step 1", т.е. следующее значение i будет равняться 2. Как только i достигнет своего десятого значения (т.к. цикл до 10), цикл прекратится выполняться и дальше пойдёт выполнение программного кода, который стоит после цикла.

..ещё пример. Сложим значения от 1 до 100 при помощи цикла. Добавлю, что шаг "Step" может принимать не только положительные значения, но и отрицательные (Step -1) или дробные (Step 1,5) значения:

  Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim r As Integer
       
    For i = 100 To 1 Step -1
    r = r + i
    Next i
       
    MsgBox "Сумма чисел от 1 до 100 равняется " & r, vbInformation, "Сумма"
  End Sub


Цикл For Each...Next применяется, когда требуется перебрать элементы в какой либо группе, коллекции, массиве и т.п. Например перебрать все листы активной книги Excel, все ячейки листа в определённом диапазоне и т.д. Записывается он следующим образом:

    For Each X In Y
      ....
    Next X

For Each - начало нашего цикла;
X - переменная в группе;
In - синтаксис указывающий на объект (равносильно "смотри в..");
Y - непосредственно сам объект;
Next - переводит цикл на начало;

К примеру, посчитаем листы в активной книге Excel (VBasic должен быть запущен через Excel):

  Private Sub CommandButton1_Click()
    Dim i As Object ' переменная типа объект
    Dim r As Integer
   
    For Each i In ActiveWorkbook.Sheets ' ..искать листы в активной книге)
      r = r + 1 ' считаем количество
    Next i
     
    MsgBox "Количество листов в книге = " & r, vbInformation, "Справка"
  End Sub

..или соберём все имена листов:

  Private Sub CommandButton1_Click()
    Dim i As Object
    Dim r As String ' "r" - переменная типа текстовая строка
   
    For Each Shet In ActiveWorkbook.Sheets
      r = i.Name
      s = s & " " & r
    Next Shet

    MsgBox "Листы в книге имеют следующие имена:" & vbNewLine & s, vbInformation, "Справка"
  End Sub

vbNewLine - переносит текст на следующую строку сообщения.
& - отделяет текст от переменных (правило синтаксиса).

Цикл Do While...Loop означает, выполнять действие пока оно истинно:

  Private Sub CommandButton1_Click()
    Dim X As Byte
   
    Do While X < 10
      X = X + 1
      MsgBox "Как только X превысит значение 10 код прекратит выполняться." & _vbNewLine
      & "Сейчас X = " & X
      Loop
  End Sub

При такой записи цикл будет выполняться до тех пор, пока Х истинно, то-есть меньше 10.
Do - это начало нашего цикла;
While - говорит о том, что цикл проверяется на истинность;
X < 10 - это условие истинности, которое мы задали;
Loop - возврощает цикл на его начало;

Ещё один нюанс. Если вы запустили цикл и он оказался бесконечным, то нажмите комбинацию клавиш [Ctrl+Break].


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#9 14-06-2014 09:55:09

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

МАССИВЫ

Массив представляет собой пронумерованный список переменных любого типа. Вместо того, чтобы объявлять переменные, лучше применить массив. Массив объявляется так:

Dim MyArray (2) As Integer ' массив типа "целое число"

Такой массив может хранить 3 целочисленных элемента (отсчёт с нуля); 2 - это верхняя граница массива.
Чтобы присвоить элементам массива значения, пишем такой код:

  Private Sub CommandButton1_Click()
    Dim MyArray(2) As String

    MyArray(0) = "Вася Пупкин"
    MyArray(1) = "Петя Пупкин"
    MyArray(2) = "Лена Пупкина"
' ..а затем эти значения извлекаем:
    TextBox1.Text = MyArray(2)
  End Sub

Этот код покажет нам в текстовом поле, третью строку нашего массива, т.е. Ленку Пупкину.
Но зачем нам пользоваться какими-то массивами, когда можно использовать просто переменную? ..ан нет! Массивы имеют приемущество перед обычной переменной! Они могут быть многомерными, т.е. в каждой строке многомерного массива можно хранить данные, относящиеся к одному объекту: например ФИО, его пол, номер телефона и т.д.

Многомерный массив объявляется так:

  Private Sub CommandButton1_Click()
    Dim MyArray(2, 3) As String ' массив с четырмя разделами
   
    MyArray(0, 0) = "Пупкин Вася"
    MyArray(0, 1) = "Мужчина"
    MyArray(0, 2) = "Директор"
    MyArray(0, 3) = "тел: 123-45-67"

    MyArray(1, 0) = "Пупкин Петя"
    MyArray(1, 1) = "Мужчина"
    MyArray(1, 2) = "Зам.Директора"
    MyArray(1, 3) = "тел: 123-45-68"

    MyArray(2, 0) = "Пупкина Лена"
    MyArray(2, 1) = "Женщина"
    MyArray(2, 2) = "Секретарь"
    MyArray(2, 3) = "тел: 123-45-69"
' ..извлекаем Ленкин номер телефона:
        TextBox1.Text = MyArray(2, 3)
  End Sub

Часто необходимы массивы динамические - те, размер которых можно изменять в ходе выполнения. Динамический массив объявляется следующим образом: "Dim MyArray ()".

Изменить размер массива можно по команде: "ReDim MyArray (6)". Команда "ReDim" не только изменяет размер массива, но и (!)удаляет из него все старые значения. Чтобы старые значения сохранить, используется ключевое слово "Preserve":

ReDim Preserve MyArray (7)

Однако, если новый размер массива меньше, чем кол-во помещенных в него элементов, слово "Preserve" не поможет, и часть данных всё-равно будет потеряна.

Массивы можно создавать и заполнять одновременно, при помощи встроенной функции "Array()":

Dim MyArray () As String
MyArray = Array(Иванов Иван, Мужчина, 123-45-67)

Указывать размер массива необязательно — он будет автоматически настроен в соответствии с кол-вом передаваемых элементов.

Очистить массив можно командой "Erase". Массив фиксированной длины просто очищается, динамический массив раз/инициализируется, и ему придется задавать размер по-новой.

Erase MyArray


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#10 16-06-2014 16:42:50

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

ПРОГРАММНЫЕ МОДУЛИ, ПРОЦЕДУРЫ И ФУНКЦИИ

Программный код хранится в модулях, которые бывают 3-х видов:

* модуль формы
* стандартный модуль
* модуль класса

Простое приложение, состоящее из одной формы, содержит только "модуль формы". По мере усложнения приложения, повторяющиеся функции можно выделить в отдельный программный код, который будет являться общим для всех. Такой программный код называется "стандартным модулем". При использовании в VBasic объектно-ориентированного программирования, создаётся ещё и "модуль классов".

Модули формы имеют расширением *.frm. Из них можно ссылаться на другие формы и объекты данного приложения. Эти модули могут содержать:

* объявления переменных, констант, типов данных
* внешние процедуры, используемые на уровне модуля
* процедуры обработки событий

Стандартные модули хранятся в файлах с расширением *.bas, и могут содержать:

* объявления глобальных/локальных переменных, констант, типов данных
* внешние процедуры и процедуры общего характера

Модули классов - копилка объектов, с разработанными для них свойствами/методами. Они хранятся в файлах с расширением *.els.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#11 16-06-2014 16:43:36

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

ПРОЦЕДУРЫ - это самые важные функциональные блоки. Они позволяют разбивать программный код на небольшие логические блоки, которые, во-первых легче отлаживать, а во-вторых можно использовать при создании других процедур. В VBasic существуют следующие виды процедур:

* Процедура "Sub"
* Процедура "Function"
* Процедура "Event Procedure"

Процедура типа "Sub" (подпрограмма) - универсальная процедура для выполнения каких-либо действий. Она не возвращает никаких значений:

  Sub Farewell()
    MsgBox "Goodbye!"
  End Sub


Процедура типа "Function" (функция) - математическое понятие, отражающяя связь между какими-либо значениями. ..Отличий от "Sub" - два: функция возвращает вызвавшей её программе какое-то значение, и её можно вставлять практически в любое место программного кода. Пример:

  Function Tomorrow() ' функция вывода завтрашнего дня
    Tomorrow = DateAdd("d", 1, Date())
  End Function

'..и пример вызова нужной функции:
  Private Sub CommandButton1_Click() ' вызываем дату
    Dim x
    x = Tomorrow
     MsgBox "Завтра: " x
  End Sub

Здесь мы вызываем функцию по-имени (в данном случае "Tomorrow"). В тексте функции необходимо предусмотреть оператор, который присваивает ей какое-либо значение (у нас строка "Tomorrow = DateAdd(" d", 1, Date())", которая показывает завтрашнее число. Обычно, такие процедуры хранятся в "Стандартных модулях" типа *.bas, но здесь она внутри "Модуля формы" в разделе "General".

Процедуры "Function" (как и переменные) имеют тип, задаваемый с помощью ключевого слова "As". Тип процедуры определяет тип возвращаемого ею значения.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#12 16-06-2014 16:45:48

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

СТАНДАРТНЫЕ ФУНКЦИИ

В VBA имеются сотни встроенных функций. Описать все непредставляется возможным, поэтому перечислим основные:

* Функции для работы с датой и временем
* Функции для работы с числовыми значениями
* Функции для работы со строками
* Прочие функции

Функции для работы с датой и временем
Довольно часто приходится работать с датами, а иногда при выполнении "большой" функции интересно посмотреть сколько времени она выполняется.

Время в VBA описывается оператором Time. Если написать следующий код:

  MsgBox Time, vbInformation, "Текущее время"

..то при его выполнении нам появится сообщение c текущем временем. Если мы хотим присвоить переменной своё время, то это будет выглядеть следующим образом:

  Sub Peremen()
    Dim T1 As Date
    Dim T2 As Date

    T1 = #11:10:12 PM#
    T2 = #11:10:12 AM#
      MsgBox T1 & Chr(13) & _ ' "& Chr(13)" тоже-самое, что "& vbNewLine" (перенос строки)
             T2, vbInformation, "Time"
  End Sub

Как видно из данного примера, для того чтобы присвоить переменным Т1/Т2 некоторое время, то его нужно записывать между "диезами", при этом можно указать формат времени - AM или PM.

Существует несколько форматов записи времени. Всё зависит от того, как описывается оператор "Time".
Напишем ещё один код, но с разным описанием формата времени.

  Private Sub CommandButton1_Click()
    F1 = Format(Time, "Long Time") ' часы/минуты/секунды
    F2 = Format(Time, "Medium Time") ' 12-часовой, часы/минуты
    F3 = Format(Time, "Short Time") ' 24-часой, часы/минуты (00:00)
    F4 = Now ' покажет вместе дату/время
    F5 = Timer ' покажет количество секунд, прошедших с полуночи

  MsgBox "F1 = " & F1 & Chr(13) & _
         "F2 = " & F2 & Chr(13) & _
         "F3 = " & F3 & Chr(13) & _
         "F4 = " & F4 & Chr(13) & _
         "F5 = " & F5, vbInformation, F2
  End Sub

Теперь напишем небольшую программку, которая будет выполняться с некоторой продолжительностью, а мы попробуем вычислить время её выполнения. Выглядеть данная процедура будет следующим образом (VBA запускать из Excel):

  Private Sub CommandButton1_Click()
    Dim x As Date
    Dim Has As Long
    Dim Min As Long
    Dim Sek As Long
    Dim a As Long
    Dim b As Long

    x = Time ' фиксируем в переменную время начала процедуры
    For a = 1 To 150 ' создаём продолжительный цикл
     For b = 1 To 150
      Cells(a, b) = "smile3" ' рисуем смайлики в ячейки Excel
     Next b
    Next a
' ..рассчитываем продолжительность выполнения процедуры
    Has = (Time - x) * 24 'отнимаем от текущего.., зафиксированное время
    Min = (Time - x) * 24 * 60
    Sek = (Time - x) * 24 * 60 * 60

    MsgBox "На выполнение процедуры ушло " & Has & " часов" & Chr(13) & _
           "На выполнение процедуры ушло " & Min & " минут" & Chr(13) & _
           "На выполнение процедуры ушло " & Sek & " секунд", vbInformation, "Time"
  End Sub

После того как мы запустим этот макрос, нам появится сообщение с точно рассчитанным временем на его выполнение.

Функции для работы с числовыми значениями
Ниже приведены только универсальные функции VBA для работы с числовыми значениями.

* Abs() - функция возвращает абсолютное значение переданного ей числа.
Например, Abs(8) и Abs(-8) вернут одно и то же значение "8". Обычно используется, когда нам нужно определить разницу между двумя числами.

* Int(), Fix() и Round() - позволяют по разному округлять числа:
   - Int возвращает ближайшее/меньшее/целое число
   - Fix отбрасывает дробную часть
   - Round округляет до указанного количества знаков после запятой: "MsgBox(Round(4.567, 2))"

* Rnd() - используются для получения случайных значений. Обычно применяется вместе с предыдущими функциями (Int,Fix,Round). Например:

  Private Sub CommandButton1_Click()
    MsgBox Int(Rnd * 1000)
  End Sub


Функции для работы со строками
Работать со строками приходится очень часто, поэтому знать их необходимо "на зубок".
Вот наиболее часто используемые функции:

* Asc() - позволяет вернуть 16-тиричное значение для переданного символа. Например, Asc("D") вернет 68 (см.табл. ASCII). Обычно, она используется вместе с функцией Chr(), которая производит обратную операцию. Например, такой код в Excel позволяет написать в ячейки с A1 по A32 последовательно буквы русского алфавита от A до Я:

  Private Sub CommandButton1_Click()
    Dim n, x As Integer
   
    n = 1
    x = Asc("А")
   
    Do While n <= 32
      ActiveWorkbook.ActiveSheet.Range("A" & n).Value = Chr(x)
      n = n + 1
      x = x + 1
    Loop
  End Sub


* Chr() - очень важная функция! Возвращает символ по его числовому коду. Помимо того, что используется в паре с функцией Asc(), выручает, когда нужно вывести служебный символ. Например, нам нужно напечатать текст "в кавычках". Кавычка - это служебный символ, и попытка использовать строку вида:

TextBox1.Text = ""WHATIS""

..сразу приведет к синтаксической ошибке. А вот-так все будет пучком:

TextBox1.Text = Chr(34) & "WHATIS" & Chr(34)


* InStr() и InStrRev() - одна из самых популярных функций. Позволяет обнаружить в теле строковой переменной последовательность символов и вернуть её позицию. Если последовательность не обнаружена, то возвращается 0.

* Len() - даёт возможность получить число символов в строке. Часто используется при операциях замены.
Создадим форму с "Текст_боксом" и "Комманд_буттоном" и впишем такой код:

  Private Sub CommandButton1_Click()
    Dim x As String
    Dim y As Integer

    x = TextBox1.Text
    y = Len(X)
    MsgBox "В тексте " & y & " символов."
  End Sub


* LCase() и UCase() - переводит строку в нижний/верхний регистры соответственно.

  Private Sub CommandButton1_Click()
    Dim x As String, y As String

    x = TextBox1.Text
    y = LCase(x)
    MsgBox "Текст переведён в нижний регистр: " & Chr(13) & y
  End Sub


* Replace() - меняет в тексте одну последовательность символов, на другую. Например, этот код из всех/маленьких букв "а", сделает большие "А":

  Private Sub CommandButton1_Click()
    TextBox1.Text = Replace(TextBox1.Text, "а", "А")
  End Sub


* StrComp() - логическая функция. Позволяет сравнивать две строки. При совпадении возвращает "0", в противном случае "1". Кидаем на форму два "текст_бокса" и кнопку. Вводим в первое поле один текст, во второе - второй:

  Private Sub CommandButton1_Click()
    Dim x, y, z
    x = TextBox1.Text
    y = TextBox2.Text
    z = StrComp(x, y)' волшебная инструкция

    If z = 0 Then
     MsgBox "Строки совпадают"
    Else
     MsgBox "В тексте есть различия!"
    End If
  End Sub


* StrConv() - преобразует строку в "Unicode" и обратно.

* StrReverse() - размещает символы в обратном порядке. Введите в текстовое поле текст, и получите его отражение. (если введёте: "кобан упал и лапу набок" - эффекта не будет!)

  Private Sub CommandButton1_Click()
    Dim x, y
    x = TextBox1.Text
    y = StrReverse(x)
      MsgBox "Ваш текст наоборот будет: " & Chr(13) & y
  End Sub


Прочие функции

* Environ() - возвращает путь для переменных окружения компьютера. Пишем тупо:

    MsgBox Environ("TEMP")

Доступные команды можно просмотреть, если ввести в командной строке "SET".
Вот что у меня они возвращают (незначительные отсеил):

COMPUTERNAME = NEO
HOMEDRIVE = C:
LOGONSERVER = \\NEO
NUMBER_OF_PROCESSORS = 2
OS = Windows_NT
PROCESSOR_ARCHITECTURE = x86
PROCESSOR_IDENTIFIER = x86 Family 15 Model 4 Stepping 1, GenuineIntel
PROCESSOR_LEVEL = 15
PROCESSOR_REVISION = 0401
SESSIONNAME = Console
SystemDrive = C:
SystemRoot = C:\WINDOWS
TEMP = C:\WINDOWS\Temp
USERDOMAIN = NEO
USERNAME = RUMIT
USERPROFILE = C:\Documents and Settings\RUMIT


* Shell() - запуск внешней программы. Запускаем WORD:

  Private Sub CommandButton1_Click()
    Shell "winword" ' для сторонних программ нужно указывать полный путь
  End Sub


* VarType() - логическая функция. Проверяет тип данных и возвращает их числовой код. Список возвращаемых значений следующий:

0 - нет данных                     9 - объект (Object)
1 - неправильные данные (Null)    10 - ошибка (Error)
2 - целое число (Integer)         11 - логический (Boolean)
3 - длинное целое (Long)          12 - универсальный (Variant)
4 - плав.точка (Single)           13 - база данных
6 - денежный (Currency)           14 - десятичный
7 - дата (Data)                   17 - байтовый (Byte)
8 - строка (String)             8192 - массив

Процедуру проверки данных можно нарисовать так..
Исходя из таблицы выше, мы будем проверять "VarType" на 1,2,3,7,8. При совпадении выходит соответствующее сообщение. Попробуйте поиграть со значением переменной "х" (текстовые строки помещайте в кавычки, дату - в диезы):

  Private Sub CommandButton1_Click()
    Dim x, y As Byte, z As String

    x = #6/16/2014#
    y = VarType(x)
    z = "Вы ввели данные типа: "

    Select Case y ' перебираем значения, которое вернул нам "VarType"
      Case 1  ' если 1, то...
        MsgBox "Неправильные данные!", & vbCritical, "Ошибка"
      Case 2
        MsgBox & z " Целое число"
      Case 3
        MsgBox & z " Длинное-целое"
      Case 7
        MsgBox & z " Дата"
      Case 8
        MsgBox & z " Текстовая строка"
      Case Else
        MsgBox "Введите корректные данные!"
    End Select
  End Sub


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#13 16-06-2014 16:58:46

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

ОБРАБОТКА ОШИБОК

Неотемлемой частью любой программы являются процедуры, которые обрабатывают ошибки.
Допустим, Вы написали программу.. Непросветлённый юзер обязательно тыкнет куда не надо, поэтому Вы должны предусмотреть "защиту от дурака". Советую делать это на начальном этапе проектирования интерфейса, потому как потом может быть уже поздно. Вообщем приступим..

..искусственно создадим ошибку. Самый простой способ - взять любое число и поделить его на ноль. Напишем простенькую программу и на ней будем рассматривать различные способы обхода ошибки.

  Sub primer1()
    a = 10
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")
    c = a / b

    MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"
  End Sub


Способ №1. Перенаправление программы
..это пожалуй самый популярный способ, т.к. при возникновении ошибки лучше указать пользователю где он ошибся и перенаправить на другой путь выполнения программы. Сделать перенаправление можно при помощи команды "GoTo", но сначала нам надо дать программе понять, что мы хотим отследить ошибку - т.е. включить распознование ошибок. Делается это следующим образом. В начало кода программы мы помещаем следующую команду

On Error

..которая говорит о том, что необходимо включить отслеживание ошибок. Команда "GoTo" перенаправит программу на то место, которое мы укажем. На примере нашей программе это можно продемонстрировать так:

  Sub primer1()
    On Error GoTo errors

    a = 10
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")

    c = a / b
      MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"
    GoTo Endprimer

    errors:
      MsgBox "Ошибка! Вводите корректные данные", vbCritical, "Ошибка"

    Endprimer:
  End Sub

При возникновении ошибки, программа с места ошибки перенаправится на метку "errors:" и уже будет продолжать выполнять код с этого места. Если ошибки нет, нам покажется результат и код перенаправится на метку "Endprimer:", т.к. туда нас перенаправил "GoTo".

Способ №2. Настойчивость в исправлении ошибки
Можно сделать так, что в случае возникновения ошибки программа будет требовать от Вас ввести правильное число. Для этого, достаточно исправить метку "errors" (см.код выше) на слеждующую:

    errors:
      MsgBox "Ошибка! Повторите ввод", vbCritical, "Ошибка"
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")
    Resume

Тут, у нас добавилась только одна/новая команда "Resume", которая и будет перенапрявлять программу на место возникновения ошибки.

Способ №3. Предупреждён - значит вооружён
Следующий способ уведомит Вас о произошедшей ошибке и выдаст её номер, а так-же спросит: нужно ли выполнять программу дальше или прекратить выполнение? Выглядеть это будет так:

  Private Sub CommandButton1_Click()
    On Error GoTo errors
       
    a = 10
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")
    c = a / b
        MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"
    GoTo propusk

    errors:
     If Err.Number <> 0 Then
       resultat = MsgBox("При выполнении произошла ошибка №" & Err.Number & vbNewLine
                 & "Продолжить не смотря на ошибку?", _vbYesNo+vbCritical, "Ошибка")
     If resultat = vbYes Then
       Resume Next
     Else
       Exit Sub
     End If
     End If

    propusk:
  End Sub

Тут у нас добавилось ещё одна новая команда "Resume Next", которая говорит, что код необходимо продолжать дальше, не смотря ни на что.

Способ №4. Очистка ошибки
Если Вы написли программу, которая выполняется очень долго и в ней "море ошибок", то вы можете просто очистить эти ошибки и отследить их все, а в конечном сообщении вывести результат об ошибках. Делается это так:

  Private Sub CommandButton1_Click()
    On Error Resume Next
   
    a = 10
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")
    c = a / b
      MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"

    If Err.Number <> 0 Then
      p = Err.Number
      Err.Clear
        MsgBox "Ошибка " & p & " очищена!", vbInformation, "Уведомление"
    End If
  End Sub


Способ №5. Идём напролом
Если Вы "забили" на все ошибки, и не хотите о них слышать, то этот код для Вас:

  Private Sub CommandButton1_Click()
    On Error Resume Next
       
    a = 10
    b = InputBox("Введите число отличное от 0", "Ввод данных", "0")
    c = a / b
        MsgBox "Результат: " & a & "/" & b & "=" & c, vbInformation, "Ответ"
  End Sub


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#14 18-06-2014 18:19:22

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

РАБОТА СО СТАНДАРТНЫМИ ЭЛЕМЕНТАМИ УПРАВЛЕНИЯ

До сих пор, мы тренировались "на кошках"., точнее на "MsgBox, Буттонах и Тект-боксах". На них удобно приводить примеры. Пришло время освоить и остальные объекты.

Стандартными элементами управления (объектами) называются все прибомбасы, находящиеся в "ToolBox".
Вот перечень часто используемых:

* Label         - размещает на форме текст (надписи к полям, заголовки, поясняющую информацию)
* CheckBox      - используется для выбора одного из двух/допустимых значений (флажок)
* OptionButton  - позволяет выбрать одно из нескольких значений (радио/переключатель)
* ComboBox      - cоздает в форме раскрывающийся список
* ListBox       - cоздает в форме обычный список
* Frame         - позволяет группировать объекты по их назначению
* ScrollBar     - полосы прокрутки (и не только..)
* SpinButton    - скрол-бар без полоски


* Label - служит для отображения пояснительной информации для пользователя. Текст, задаваемый в "Label", не может быть изменен пользователем приложения. Но это не значит, что его нельзя изменить программно. Рассмотрим небольшой пример, типа "Пасхальное яйцо!"

Создадим приложение, в котором форма содержит текстовую надпись. На форме только "Label". Кликнув на тексте "лэйбла", мы заменим его новой надписью:

  Sub UserForm_Initialize()
    Label1.Caption = "Резиновую бабу не обманеш!"
    Label1.FontSize = 12
  End Sub

  Private Sub Label1_Click()
    Label1.Caption = "..но надуть можно!"
  End Sub
 
Или такой пример..
Кидаем на форму "TextBox" и "Label". Вводим информацию в текст-бокс, а она дублируется в "лэйбле":

  Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 12
    Label1.FontName = "Impact"
    TextBox1.MultiLine = True
  End Sub

  Private Sub TextBox1_Change()
   Label1.Caption = TextBox1.Text
  End Sub
 

* CheckBox (флажок) - позволяет пользователю дать ответ на поставленный вопрос. Флажки могут использоваться в форме по одному или группами. После установки на форме флажка, его надо как-то описать, чтоб он выполнял какую-то функцию. Сделать это можно следующим образом..

На форме - три флажка, которые будут менять вид формы:

  Sub UserForm_Initialize() ' настраиваем флажки
    CheckBox1.Caption = "  Окрасить форму в красный цвет"
    CheckBox2.Caption = "  Уменьшить зуммер"
    CheckBox3.Caption = "  Изменить стиль окна"
  End Sub

  Private Sub CheckBox1_Click() ' флажок №1 окрашивает форму в красный
    If CheckBox1 = True Then
     UserForm1.BackColor = &HFF&
    Else
     UserForm1.BackColor = &H8000000A ' возвращаем цвет
    End If
  End Sub

  Private Sub CheckBox2_Click() ' флажок №2 меняет зум до 85%
    If CheckBox2 = True Then
     UserForm1.Zoom = 85
    Else
     UserForm1.Zoom = 100 ' возвращаем масштаб
    End If
  End Sub

  Private Sub CheckBox3_Click() ' флажок №3 меняет стиль окна
    If CheckBox3 = True Then
     UserForm1.BorderStyle = 1
    Else
     UserForm1.BorderStyle = 0
    End If
  End Sub

Все эти "фокусы" находятся в свойствах объекта (я брал из свойств UserForm).., можете добавить свои.

* OptionButton - называются переключателями, т.к. располагаемые в группах, они позволяют выбрать одно из нескольких значений. Установка одного переключателя в "True", автоматически сбрасывает другие переключатели в "False". В остальном, функции схожи с "CheckBox" (см.пример выше).

При размещении на форме нескольких групп переключателей, каждая логическая группа должна помещаться в объект-контейнер, например "Frame". В этом случае, необходимо сначала поместить в форму "Frame", а затем разместить на ней переключатели.

  Private Sub OptionButton1_Click()
    If OptionButton1 = True Then
     MsgBox "Активирован переключатель №1"
    End If
  End Sub


* ComboBox - создает раскрывающийся список. Этот тип списка позволяет пользователю выбирать значение из списка. Главное событие для комбинированного списка - "Change" или "Click". Обычно, в обработчике этого события проверяются введённые пользователем значения, которые переносятся в TextBox или ListBox.

Составить список можно через метод "Additem", имеющий следующий синтаксис:

  ComboBox1.AddItem "Текст", index

    ComboBox1 - имя бокса;
    "Текст"   - элемент списка;
    Index     - порядковый номер элемента в списке (отсчёт с нуля);


Например, для формирования списка железа, вам необходимо задать следующую процедуру:

  Sub UserForm_Initialize() ' Составляем список
    ComboBox1.AddItem "Центральный процессор"
    ComboBox1.AddItem "Оперативная память"
    ComboBox1.AddItem "Материнская плата"
    ComboBox1.AddItem "Жёсткий диск"
    ComboBox1.AddItem "Видеокарта"
  End Sub

  Private Sub CommandButton1_Click() ' Удаляем пункт №2
    ComboBox1.RemoveItem 1
  End Sub

  Private Sub CommandButton2_Click() ' Очищаем список
    ComboBox1.Clear
  End Sub

Помимо этого, у "ComboBox" есть два важных свойства: "ListCount" и "Listlndex".
Свойство "ListCount" задаёт количество элементов в списке, а свойство "Listlndex" показывает номер выбранного элемента.

Рассмотрим пример использования свойства "Listindex". Кидаем на форму "ComboBox" и пишем:

  Sub UserForm_Initialize() ' заполняем бокс значениями
    ComboBox1.AddItem "Центральный процессор",0
    ComboBox1.AddItem "Оперативная память",1
    ComboBox1.AddItem "Материнская плата",2
    ComboBox1.AddItem "Жёсткий диск",3
    ComboBox1.AddItem "Видеокарта",4
  End Sub

  Private Sub ComboBox1_Click()
    x = ComboBox1.List(ComboBox1.ListIndex) ' сохраняем выбранный пункт в переменную

    If ComboBox1.ListIndex = 0 Then ' ..юзер выбрал пункт №1 ?
     MsgBox "Центральный процессор - это круто!" ' если да, то мессагу в глаз
    Else
     MsgBox "Вы выбрали: "  & x ' если не первый пункт, то мессага с переменной
    End If
  End Sub


* ListBox - это тот-же "ComboBox", только в виде раскрытого списка. Хотя, есть одно важное отличие: "LisBox" позволяет выбирать из списка сразу несколько значений, чем не может похвастаться "Комбо". Для создания таких списков предназначено свойство "MultiSelect". Оно может принимать следующие значения:

  0 - позволяет выбрать одно значение (используется по-умолчанию)
  1 - множественный выбор кликом мыши (для отмены, кликнуть ещё раз)
  2 - расширенный/множественный (можно выбирать с [Shift] и [Ctrl])


Для обработки множественного выбора нельзя использовать свойство "Listindex", применяемое при работе с выпадающими списками. Выбор нескольких элементов списка фиксируется в свойстве "Selected". Выбранному элементу соответствует значение True, а остальным - False.



Рассмотрим пример использования "ListBox".
Наша цель (раньше была Коммунизм, а сейчас..) создать выпадающий список (ComboBox), выбрав пункт которого мы попадаем во-вложенный список (ListBox), выбрав пункт в котором получим мессагу или ещё-чё.

  Sub UserForm_Initialize() ' создаём выпадающий список
    ComboBox1.AddItem "Пользователи", 0
  End Sub

  Private Sub ComboBox1_Click()  ' по клику, создаём список в ListBox
    If ComboBox1.ListIndex = 0 Then
      ListBox1.Clear
      ListBox1.AddItem "Администратор №1", 0
      ListBox1.AddItem "Администратор №2", 1
      ListBox1.AddItem "Продвинутый Юзверь", 2
      ListBox1.AddItem "Просто Ламо", 3
    End If
  End Sub

  Private Sub ListBox1_Click()  ' смотрим, какой пункт жмёт юзер и выдаём мессагу
    If ListBox1.ListIndex = 0 Then
      MsgBox "Администратор №1: Иванов Иван Иванович"
    End If
    If ListBox1.ListIndex = 1 Then
      MsgBox "Администратор №2: Пупкин Василий"
    End If
    If ListBox1.ListIndex = 2 Then
      MsgBox "Продвинутый юзер: Машенька"
    End If
    If ListBox1.ListIndex = 3 Then
      MsgBox "Просто Ламо: Evil_Demon_666"
    End If
  End Sub

Здесь, событие возвращает мессагу. В идеале - функция должна быть более путная: собрать какую-нить информацию, записать/изменить/отправить данные и т.п.., зависит от фантазии и назначения вашей проги.

* Frame - является контейнером и служит для объединения элементов в группу, после чего помещенными в него объектами можно управлять как единым/целым. Например, элемент управления Frame можно использовать для объединения в группу размещенных на форме и функционально связанных переключателей.

* ScrollBar - так/называемые пОлосы прокрутки. Но элемент "ScrollBar" отличается от полосы прокрутки, т.к. существует самостоятельно и служит для изменения параметра, значение которого может меняться в некотором диапазоне. Пример - регулятор громкости, и т.п. Это довольно мощный инструмент, если знаеш "с чем его едят". Основные свойства элемента "ScrollBar" представлены ниже:

  LargeChange, SmallChange - задают величины, на которые будет смещаться ползунок при щелчке мыши
  Min, Max - задают диапазон вводимых чисел
  Value - целое число, соответствующее положению ползунка на полосе прокрутки

После размещения скрол-бара на форме, необходимо свойствами "Min/Mах" задать требуемый диапазон значений. Свойство "Value" определяет текущее положение бегунка.

     min       value       max
     <|----------|----------|>
    -10          0          10

..или так:

     min                   max
     <|-|-------------------|>
      0 +--value=1         10

Значения данных свойств - типа "Integer" (т.е. от —32768 до +32767).
Для свойства "LargeChange" (шаг) обычно устанавливают значение, равное ~5-10% от "Max".

В освоении работы "скрол-бара", нам поможет следующий пример.
Кидаем на форму фото приятного нам существа и скрол-бар, с помощью которого будем двигать фотку:

  Sub UserForm_Initialize() ' задаём свойства объектов
    Image1.BorderStyle = 0
    Image1.PictureSizeMode = 3
    ScrollBar1.Min = -100
    ScrollBar1.Max = 100
    ScrollBar1.Value = 0
  End Sub
 
  Private Sub ScrollBar1_Change() ' передаём значения Value фотке
    Image1.Left = ScrollBar1.Value
  End Sub


* SpinButton - такой же "скрол-бар" с кнопками.., только без полосы. Все свойства слизаны со "скрол-бара". Можно применить в качестве счётчика. Кинем на форму один "Label" и один "SpinButton":

  Sub UserForm_Initialize()
    Label1.Caption = ""
  End Sub

  Private Sub SpinButton1_Change()
    Label1.Caption = SpinButton1.Value
  End Sub


* TextBox - использутся для ввода/вывода текстовых данных. Вот наиболее важные свойства:

  - "Value" (или Text) определяет исходный текст;
  - "AutoSize" применять не рекомендуется;
  - "ControlSource" является ссылкой на источник текстовых данных для поля;
  - "ControlTipText" задаёт текст всплывающей подсказки.;
  - "Enabled" отключает возможность редактирования (текст в поле станет серым);
  - "Locked" запрещает редактирование. Типичный пример: Лицензионное соглашение;
  - "MaxLength" задаёт максимальную длину значения, которое можно ввести в поле;
  - "MultiLine" даёт возможность использовать в текстовом поле несколько строк;
  - "PasswordChar" указывает, за каким символом будут следовать звёздочки;
  - "ScrollBars" включает горизонтальную/вертикальную полосу прокрутки;
  - "WordWrap" авто/переход на новую строку при достижении границы текстового поля.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#15 18-06-2014 18:21:35

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

РАБОТА С ФАЙЛОВОЙ СИСТЕМОЙ

Как не старайся, но при работе с программой юзеру обязательно взбредёт в голову поработать с каким-нибудь файлом. Именно такой ход событий мы и объсудим в этой главе.

В VBA предусмотрен набор функций для выполнения различных операций с файлами, каталогами, дисками и прочими барахлом. Информация об этих функциях приведена ниже:

* CurDir() - возвращает путь к текущему каталогу;
* Dir() - позволяет искать файл/каталог по указанному пути;
* EOF() - при чтении/записи, эта функция вернет "1", если вы находитесь в конце файла;
* Error() - позволяет вернуть описание ошибки по ее номеру;
* FileAttr() - определяет, как был открыт файл: на чтение или запись;
* FileDateTime() - инфа о последнем обращении к файлу;
* FileLen() - позволяет определить длину указанного файла в байтах;
* GetAttr() - возвращает атрибуты файла (скрытый/архивный/только чтение и т.д.);
* Input() - позволяет считать информацию из открытого файла;
* InputB() - определяет количество байт, которые надо считать из файла;
* Loc() - возвращает число, которое определяет текущее место чтения в открытом файле;
* LOF() - определяет длину открытого файла в байтах.
* Seek() - возвращает информацию о позиции, с которой будет выполняться следующая операция чтения/записи;

Следующий пример покажет работу некоторых*описанных функций.
На форме "TextBox", "Label" и три кнопки. Создайте "Readme.txt" на диске С:\...

  Sub UserForm_Initialize() ' свойства объектов
    TextBox1.MultiLine = True
    TextBox1.ScrollBars = 3
    CommandButton1.Caption = "Читать"
    CommandButton2.Caption = "О файле"
    CommandButton3.Caption = "Очистить"
    Label1.Caption = ""
  End Sub

  Private Sub CommandButton1_Click()
    Dim MyChar

    Open "c:\readme.txt" For Input As #1 ' открыть и читать по одному символу с файла,
     Do While Not EOF(1) ' ..пока EOF не вернёт 1 (т.е. до конца)
      MyChar = MyChar & Input(1, #1)
     Loop
    Close #1 ' закрыть открытый файл
    TextBox1.Text = MyChar
  End Sub

  Private Sub CommandButton2_Click()
    Label1 = FileDateTime("c:\readme.txt") ' показать время последнего обращения к файлу
  End Sub

  Private Sub CommandButton3_Click() ' очистить поля
    TextBox1.Text = Clear
    Label1 = Clear
  End Sub


Стандартные операции с файлами

Допустим у нас есть один файлик с именем 1.txt в папке C:\1\ , и нам нужно скопировать его в C:\2\ .
Тупо пишем следующие:

  Private Sub CommandButton1_Click()
..для копирования файла
    Filecopy "C:\1\1.txt","C:\2\1.txt"
  End Sub

..для удаления файла
    Kill ("C:\1.txt")

..для перемещения файла
    Filecopy "C:\1\1.txt","C:\2\1.txt"
    Kill ("C:\1\1.txt")

..для переименования файла
    Filecopy "C:\1.txt","C:\2.txt"
    Kill ("C:\1.txt")


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#16 20-06-2014 10:11:20

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Типы файлов и работа с окружением

В VBasic существует понятие типа файла, который определяется организационной структурой хранения информации и способом доступа к ней. Принято выделять следующие типы файлов.

* Файлы последовательного доступа - это текстовые файлы.
Такие файлы представляют собой последовательность символов. Структурной единицей содержимого в подобных файлах является строка.

* Файлы произвольного доступа - это структурированные файлы, которые содержат информацию в виде записей. Примером могут служить файлы базы данных.

* Двоичные (бинарные) файлы - это файлы с побайтным доступом.
В принципе, это те-же файлы с последовательным доступом, но информация в них не организована в строки. Особенность данных файлов - работа с байтами или блоками байтов. К таким файлам можно отнести исполняемые *.EXE, файлы прошивок и т.д.

Подобное деление файлов на типы, достаточно условно и определяется особенностями организации файлов и доступа к данным в них. Например, файл с последовательным доступом можно открыть и в режиме двоичного доступа. Если этот файл имеет разделители, то для работы с ним придется написать специальную процедуру обработки разделителей и разбора данных, т.к. двоичный доступ обеспечивает побайтное чтение/запись файла.

Как было сказано выше, работа с каждым из типов файлов имеет свои особенности, однако есть два действия, общие для всех типов файлов - их открытие и закрытие. Функции и операторы, используемые при работе с файлами, приведены ниже. Для удобства, сгруппируем функции и операторы по выполняемому действию:

* Открыть/создать файл  - Open
* Закрыть файл          - Close, Reset
* Параметры вывода      - Format, Spc, Tab, Width #
* Копировать файл       - FileCopy
* Файл инфо             - EOF, FileAttr, FlleDateTime, FileLen, FreeFile, GetAttr, Loc, LOF
* Управление файлами    - Dir, Kill, Lock, Unlock, Name
* Читать файл           - Get #, Input, Input #, Line Input#
* Инфа о размере        - FileLen
* Установить атрибуты   - SetAttr
* Найти позицию в файле - Seek
* Запись данных         - Print #, Put #, Write #

Понятно, что перед тем как записать или прочитать данные из файла, необходимо сначала открыть этот файл.
Открытие файла выполняется оператором "Open"
:

  Open pathName For mode [access] [lock] As [#]fileNumber [Len=recLength]

..где:

pathName - полное имя файла;
mode - режим доступа к файлу (Append, Binary, Input, Output или Random);
access - тип доступа к файлу (Read/Write);
lock - тип разрешения доступа к файлу другим процессам (Lock Read Write);
fileNumber - дескриптор файла. Может иметь значение от 1 до 511;
recLength - размер буфера для данных (до 32 Kb).

При работе оператора "Open" создается специальный счетчик номеров-идентификаторов открытых файлов (дескрипторов) для определения файла, с которым программа работает в текущий момент. VBA может работать максимум с 511-ю файлами одновременно. Если номер открываемого файла нам не известен, его можно узнать с помощью функции "FreeFile", возвращающей последний/свободный номер открываемого файла.

Закрытие файлов выполняется очень просто.
Для этого необходимо использовать оператор "Close", имеющий следующий синтаксис:

  Close [fileNumberLlist]

..где "fileNumberLlist" - список закрываемых файлов, представленных дескрипторами и перечисляемых через запятую: #1,#2,...#511. При этом дескриптор в "Close" должен совпадать с дескриптором в "Open", т.к. если дескриптор не указан, оператор "Close" закрывает все открытые файлы.

Чтение данных из файла последовательного доступа выполняется с помощью функции "Input", которая имеет следующий синтаксис:

  Input(number, #fileNumber)

..где "number" - количество считываемых из файла символов, а "#fileNumber" - дескриптор.
Следует иметь в виду, что "Input" должен знать количество считываемых символов, поэтому для чтения данных из файла необходимо предварительно вычислить его длину с помощью функции "FileLen". Пример приводить не буду, т.к. он висит в предыдущем посте, где мы читали в текст-бокс из файла Readme.txt.

Для записи в файл последовательного доступа применяется оператор "print#" и "write#", со следующим синтаксисом:

  Print #fileNumber, [outputlist]

..где "fileNumber" - дескриптор, а "outputlist" переменная для записи. Оператор "write" имеет аналогичный синтаксис.


Работа с двоичными файлами

Бинарный файл в корне отличается от файлов последовательного и произвольного доступа. Посмотрите на код..
Здесь, в качестве примера двоичного файла я использовал фрагмент прошивки от TV:

    E2P!Lanc      2408йЙАЬЃ       2 <E22222ЪЛ
    —D8ґ™yaKd<OB   
    "€€Yр}Kфѓ@%`§ээtя*******яяяяяяяяяяяяяяяяяя
    ь#ьљ#и%#`(ё*#р,#~1#љ4#°<Ќ+B#-F#^H#«L#­PT#нU#\pw_#©`
    ў#««#яя;яя4Bяя;ьВMяяяяяяяяяяяяяяяяяя

Для меня тема бинарных файлов близка, т.к. сам зарабатываю на булочку с маслом именно радио/ремонтом, поэтому уделю ей чуть-больше внимания.

Из дапма видно, что нет смысла просматривать бинарный файл в чистом виде, его понимает только специальная программа. Двоичный файл не организован в строки, как файл последовательного доступа. Здесь нельзя выделить строки, записи или иную инфо/структуру кроме байтов и блоков байтов.

Двоичный файл открывается только в двух режимах: "Binary" (доступ по номеру байта) и "Random" (произвольный). Для режима Random, запись не имеет строго заданного размера и обычно вычисляется по соответствующему алгоритму или хранится в записях файла. Работа с "бинами" отличается большей свободой выполнения различных действий, чем с файлами последовательного доступа. В отличие от файлов последовательного доступа, "bin" открывается сразу и для чтения, и для записи.

Двоичный файл открывается по-другому, чем файл последовательного доступа. Синтаксис оператора "Open" для двоичного файла выглядит следующим образом:

  Open pathName For Binary As fileNumber

..где "pathName" - полное имя файла; "fileNumber" - дескриптор.

Чтение данных из двоичных файлов выполняется при помощи оператора "Get #":

  Get #fileNumber, [recNumber], varName

..где "fileNumber" - номер файла; "recNuinber" - размер записи в байтах; "varName" - переменная, в которую читаются данные из файла (буфер).

Для записи данных в двоичные файлы служит оператор "put #", с таким синтаксисом:

  Put [#]fileNumber, [recNumber], varName

..где "fileNumber" - дескриптор; "recNumber" - размер записи в байтах; "varName" - переменная, в которой хранятся данные, записываемые в файл.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#17 20-06-2014 10:16:27

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

СИСТЕМА ФАЙЛОВЫХ ОБЪЕКТОВ (FSO)

В систему "FSO" (File System Objects) входит набор классов для объектов. По умолчанию эти объекты отключены и их нет в ToolBox'e, среди буттонов и текст-боксов. Чтобы использовать FSO, необходимо подключить библиотеку "Microsoft Scripting Runtime" в окне References, которое валяется в меню "Tools". Значит идём по адресу:

    Меню->Tools->References->Microsoft Scripting Runtime

В этой библиотеке находятся все классы системы объектов FSO. После того, как вы подключите данную библиотеку, просмотреть свойства классов можно с помощью окна "Object Browser":

    Меню->View->ObjectBrowser ' ..или просто нажать (F2)

В этом окне все классы FSO находятся в библиотеке Scripting, которую можно найти по имени в верхнем раскрывающемся списке. При выборе объекта в левом окне, в правом - отображаются его свойства.

Перечислим основные классы системы и обсудим методику их использования. Основные классы объектов, которые входят в состав FSO, указаны ниже:

- FileSystemObject - базовый класс системы, на основе которого построены все другие классы;
- Drive - класс для работы с физическими устройствами (HDD, CD-ROM, логический диск);
- Folder - класс для работы с папками: создание/удаление/чтение/атрибуты;
- Files - класс для работы с файлами: создание/удаление/копирование/чтение/атрибуты;
- TextStream - специальный класс для работы с текстовыми файлами.

В классе Drive собраны свойства для работы с физическими устройствами системы:

  * AvailableSpace - возвращает значение свободного пространства устройства;
  * DriveLetter - буквенное обозначение устройства;
  * DriveType - тип устройства (Unknown,Removable,Fixed,Network,CD-ROM,RAM-Disk)
  * FileSystem - тип файловой системы (FAT,NTFS,CDFS,RAW);
  * FreeSpace - общее свободное пространство (аналог AvailableSpace);
  * IsReady - указывает готовность к работе: True - готово, False - не готово;
  * Path - путь до устройства, папки, файла;
  * RootFolder - возвращает корневую папку указанного устройства;
  * SerialNumber - возвращает числовой идентификатор тома диска;
  * ShareName - возвращает сетевое имя устройства;
  * TotalSize - общий размер устройства в байтах;
  * VolumeName - возвращает/устанавливает метку тома устройства.

Как было сказано выше, объектов FSO нет в "Тул-баре", ..поэтому их надо создавать самим. Под словом создавать не имеется ввиду визуально,..а имеется ввиду виртуально!
Использование системы FSO состоит из трех этапов:

  1. Создание объекта
  2. Настройка требуемых методов объекта
  3. Настройка доступных свойств объекта

Создать объект можно объявлением переменной типа FSO:

    Dim NewFSO As New FileSystemOb]ect
..или так:
    Set NewFSO = CreateObject("Scripting.FileSystemObject")

В данном случае "Scripting.FileSystemObject" - это библиотека. После этого можно работать со свойствами и методами объекта "NewFSO", как со всеми другими объектами приложения.
Рассмотрим пример (на форме кнопка):

  Sub DiskInfo() ' функция с именем DiskInfo
    Dim x, y, z
    Set x = CreateObject("Scripting.FileSystemObject") ' ..библиотеку в переменную
    Set y = x.GetDrive("C:\") ' объекту в библиотеке указываем на диск C:\
   
    z = "Диск: " & y.DriveLetter & Chr(13) ' юзаем свойства объекта
    z = z & "**************" & Chr(13) & Chr(13)
    z = z & "Метка тома: " & y.VolumeName & Chr(13)
    z = z & "Серийный номер: " & Format(Hex(y.SerialNumber)) & Chr(13)
    z = z & "Файловая система: " & y.FileSystem & Chr(13)
    z = z & "Всего: " & FormatNumber(y.TotalSize / 1048576, 2) & " Mbytes" & Chr(13)
    z = z & "Свободно: " & FormatNumber(y.FreeSpace / 1024, 0) & " Kbytes"
   
    MsgBox z, , " Сведения о разделе диска" ' мессага с нарытой инфой
  End Sub

  Private Sub CommandButton1_Click()
    DiskInfo ' вызываем функцию по имени
  End Sub

Как видите - всё очень просто. FSO - ForEver!!!
Это, конечно, не Win-API (со своими более 800 функциями), но тоже не хило.

Кстати, на серийном номере диска можно построить неплохую оборону для своего софта.
Выводим юзеру "InputBox" с прозьбой ввести пароль, а сами в это время читаем серийник его диска - это и будет паролем. Умножаем считанный серийник на 38,521 (к примеру) и результат переводим в "hex".

Теперь, когда мы знаем алгоритм защиты, нам ничё не стоит написать для него "Crack". (..и прицепить к нему своего любимого трояна....*шутка*). Само-собой, что такой "Crack" будет генерировать пароль только для текущей машины, и если юзер захочет поделиться паролем со своим корешом, то их план потерпит фиаско.
К сожалению, эту идею запатентовать не удастся, т.к. антивирус Касперского опередил нас на лет-так..надцать.


Класс FileSystemObject является базовым для FSO и его методы частично дублируют методы остальных классов, поэтому пропустив Files и Folders перейдём сразу к нему:

  * BuildPath - формирует путь файла
  * Copy File - копирует файл
  * CopyFolder - копирует папку
  * CreateFolder - создает папку
  * CreateTextFile - создает текстовый файл
  * DeleteFile - удаляет файл
  * DeleteFolder - удаляет папку
  * DriveExists - запрашивает существование устройства
  * FileExists - запрашивает существование файла
  * FolderExists - запрашивает существование папки
  * GetAbsolutePathName - возвращает полный путь
  * GetDrive - ссылка на устройство
  * GetExtensionName - возвращает полное имя
  * GetFile - ссылка на файл
  * GetFileName - возвращает имя файла
  * Get Folder - ссылка на папку
  * Get ParentFolderName - возвращает имя родительской папки
  * GetTempName - возвращает случайное имя файла/папки
  * MoveFile - перемещает файл
  * Move Folder - перемещает папку
  * OpenTextFile - открывает текстовый файл

При работе с файлами в FSO, принято делить выполняемые действия на две группы.

  1. Работа на уровне файлов. К этой группе относится создание/удаление и т.п. файлов.
  2. Работа на уровне данных в файлах. Это ввод/добавление/удаление/чтение из файлов.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#18 20-06-2014 10:21:09

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

VBA + WINDOWS API

..ну куда-же нам без виндовых API-функций? Чтоб мы не рылись в дебрях системы и случаем не нагадили там, Большой Билли придумал для нас Win-API. Это готовые процедуры и функции для решения множества задач.

Как правило, большинство API-функций находятся в библиотеках, и всё что нам нужно, это подключить эти библиотеки в свой проект. Львиная доля API находится в системных файлах типа User32, Kernel32, которые уже висят в ОЗУ, поэтому их нужно просто объявить: т.е. оповестить ОС, чтобы она была в курсе, что мы собираемся попользоваться её файликами!

Чтоб освоить Win-API, необходимо скачать справочник по API-функциям. Попросите хорошЕнько "гугл" и будет вам счастье. Вот парочка функций из справочника:

  Функция GetKeyboardType (находится в файле user32.dll)
    Считывает тип клавиатуpы.

  Описание:
    function GetKeyboardType(TypeFlag: Integer): Integer;
  Паpаметpы:
    TypeFlag - 0 (тип клавиатуpы), 1 (подтип клавиатуpы), 2 (число функциональных клавиш - ФК).
  Возвpащаемое значение:
    0 (PC/XT, 10 ФК),           3 (pасшиpенная, 12 ФК),
    1 (Olivetti M24, 12 ФК),    4 (Nokia 1050, 10 ФК),
    2 (AT, 10 ФК),              5 (Nokia 9140, 24 ФК).

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  Функция GetTickCount (находится в файле kernel32.dll)
    Считывает вpемя, пpошедшее с момента запуска системы.

  Описание:
    function GetTickCount: Longint;
  Возвpащаемое значение:
    Пpошедшее вpемя (в миллисекундах).

Остальные функции найдёте в справочнике, а я покажу Вам как пользоваться тем, чё имеем.

Пример показывает время работы ОС с последней загрузки в милисекундах. (1000 милисек. = 1 секунда).
Если хотите получить секунды - разделите на 1000, если минуты - то полученное разделите ещё на 60.

  Private Declare Function GetTickCount Lib "kernel32" () As Long ' вызов API

  Private Sub CommandButton1_Click()
  x = Fix((GetTickCount / 1000) / 60) ' сама функция
    MsgBox "Ваш компьютер работает: " & x & " минут", , "Время работы компьютера"
  End Sub

..или проверим, чё у нас за клава:

  Private Declare Function GetKeyboardType Lib "user32" (x As Integer) As Integer

  Private Sub CommandButton1_Click()
    x = GetKeyboardType(0)
   
    Select Case x ' проверяем, чё возвратил GetKeyboardType
     Case 0  ' если нуль, то...
       MsgBox "Тип клавиатуры: PC/XT, 10 ФК"
     Case 1
       MsgBox "Тип клавиатуры: Olivetti M24, 12 ФК"
     Case 2
       MsgBox "Тип клавиатуры: AT, 10 ФК" ' ФК - это Функциональные Клавиши
     Case 3
       MsgBox "Тип клавиатуры: Расшиpенная, 12 ФК"
     Case 4
       MsgBox "Тип клавиатуры: Nokia 1050, 10 ФК"
     Case 5
       MsgBox "Тип клавиатуры: Nokia 9140, 24 ФК"
     Case Else
       MsgBox "Чёто новенькое (или старенькое). Клавиатура неопределена!"
    End Select
  End Sub

Как видите, почти весь код (помимо проверок) слизан из справочника по API, поэтому если хотите плотно присесть на апи - срочно качайте справочник.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#19 22-06-2014 09:37:30

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

ВСЯКО-РАЗНО...

Подкинем пару-тройку интересных примеров в чемоданчик VBA-шника..

Воспроизвести звук. На форме кнопка:

  Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
  Private Sub CommandButton1_Click()
    Dim res
    res = mciExecute("Play C:\Путь_до_файла") ' замените путь на свой
  End Sub
*******************************************


Определяем ОС:  ХР или 7 ? На форме кнопка:

  Public Function nasDirExists(strPathName As String) As Boolean
    On Error Resume Next
    Dim strDir As String
      strDir = Dir(strPathName, vbDirectory)
    If (Len(strDir) = 0 Or Err = 76) Then
      nasDirExists = False
    Else
      nasDirExists = True
    End If
  End Function
' проверка папки "vss". У хрюши нет такой папки, а у семёрки есть
  Private Sub CommandButton1_Click()
    If nasDirExists(Environ("windir") + "\vss") Then
      MsgBox "Твоя система: Windows 7"
    Else
      MsgBox "Твоя система:  Windows XP"
    End If
  End Sub
*******************************************


Двигаем объект стрелками. На форме картинка.
Код для гейм-мекеров. Пригодится нам, когда займёмся разработкой игр:

  Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyUp Then Image1.Top = Image1.Top - 5
    If KeyCode = vbKeyDown Then Image1.Top = Image1.Top + 5
    If KeyCode = vbKeyLeft Then Image1.Left = Image1.Left - 5
    If KeyCode = vbKeyRight Then Image1.Left = Image1.Left + 5
  End Sub
*******************************************


Сколько оперативной памяти? На форме кнопка:

  Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As TMemoryStatus)
  Private Type TMemoryStatus ' описание API-функции
    dwLength As Long
    dwMemoryLoad As Long
    dwTotalPhys As Long
    dwAvailPhys As Long
    dwTotalPageFile As Long
    dwAvailPageFile As Long
    dwTotalVirtual As Long
    dwAvailVirtual As Long
  End Type
  Dim ms As TMemoryStatus

  Private Sub CommandButton1_Click()
    ms.dwLength = Len(ms)
    Call GlobalMemoryStatus(ms) ' вызываем функцию
     MsgBox "Всего:  " & FormatNumber(ms.dwTotalPhys / 1048576, 2) + " Mb" & vbCr & vbCr _
     & "Свободно:  " & FormatNumber(ms.dwAvailPhys / 1048576, 2) + " Mb" & vbCr _
     & "Используется в % :  " & ms.dwMemoryLoad, , "Объём оперативной памяти"
  End Sub
******************************************


Количество прожитых дней. На форме 3 текст-бокса и кнопка.
В первое поле вводим текущую дату (через тчк), во-второе дату рождения, в третьем получаем разницу в днях:

    Dim dtmDate1 As Date
    Dim dtmdate2 As Date
    Dim dtmDays As Variant

  Private Sub CommandButton1_Click()
    UserForm1.Caption = "Количество прожитых дней"
    dtmDate1 = CDate(TextBox1.Text) ' CDate - означает любой формат даты
    dtmdate2 = CDate(TextBox2.Text)
    dtmDays = dtmDate1 - dtmdate2
    TextBox3.Text = dtmDays ' выводим то, что нам накапало в днях
  End Sub
******************************************


Проверка существования файла. Элементов нет. Функция срабатывает при открытии окна.
Классная штука! Можно применить, например, для защиты софта: кидаеш любой файл на флэшку, и проверяеш его существование. Если файла нет (флэшка не засунута), то прога работать не будет.
Так-же и с CD-дисками.., скинул гейму на хард, а потом проверяеш присутствие файла на CD. Если в приводе нет диска, то игру не запустиш:

  Public Function nasFileExists(FilePath As String) As Boolean
    On Error Resume Next
    Dim feFile 
    Err.Clear 
    feFile = FreeFile 
    FilePath = Replace(FilePath, "\\", "\") 

    Open FilePath For Input As #feFile 
     If Err.Number = 53 Or Err.Number = 76 Then
     nasFileExists = False
    GoTo OK 
     Else
     nasFileExists = True
    End If
  OK: 
    Close #feFile 
    Err.Clear 
  End Function
      
  Private Sub UserForm_Initialize() 
    If nasFileExists("C:\autoexec.bat") Then ' замените путь на свой
     MsgBox "Инициализация выполнена!" & Chr(13) _
     & "Пользователь: " & Environ("UserName"), vbInformation, " Проверка приложения"
    Else
     MsgBox "В программе ошибки. Обратитесь к администратору", vbCritical, "Ошибка"
    End If
  End Sub
******************************************

Функция пытается открыть указанный файл. Если файл не найден, происходит ошибка с кодом 53, а в случае, если путь к файлу не найден (каталог или диск не найден), то происходит ошибка с кодом 76. Оператор "On Error Resume Next" позволяет продолжать работу программы, несмотря на ошибки.

Можно этот код усовершенствовать и проверять не только присутствие файла, но и его размер.., т.к. некоторые умники могут увидеть имя файла на вашей флэхе, и создать себе такой-же. Можно пойти ещё дальше и проверять дату создания, атрибуты и т.п.


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#20 22-06-2014 14:31:18

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

РАБОТА С ОКРУЖЕНИЕМ. БИБЛИОТЕКА "INPOUT32.DLL"

Под термином "окружение" здесь подразумеваются порты ввода/вывода компьютера: а это LPT, COM, USB и др.
В среде программирования VBA мы имеем доступ к каждому из них на программном уровне, только необходимо знать адрес порта. Адреса нам покажет "Everest" в разделе "Ресурсы устройств":

  Порт 0060-0060: клавиатура PS/2
  Порт 0061-0061: Встроенный динамик
  Порт 02F8-02FF: Последовательный порт (COM2)
  Порт 0378-037F: Порт принтера (LPT1)
  Порт 03F8-03FF: Последовательный порт (COM1)

С точки зрения вывода данных, всё равно куда пересылать инфу: необходимо только правильно указать её получателя. В среде Win-98 можно было отправить данные в LPT-порт так:

  Open "LPT 1" For Output As #1 ' открываем порт
    Print #1, "Тестовая страница" ' указываем куда, и что выводить
  Close #1 ' закрываем порт

..но это было давно (и правда). С семейством NT такой фокус не пройдёт! Разработчики NT с целью обеспечения безопасности, запретили прямой доступ к портам из пользовательского режима. Чтобы всё-таки обратиться к порту, необходимо все операции проводить через I/O драйвер, с которым трудно найти общий язык.

Дело в том, что NT имеет другую идеологию работы с аппаратурой. Win (в отличие от DOS) - многозадачна, поэтому, кому-попало менять настройки аппаратуры НИЗЯ, т.к. одна задача - может не знать об изменении настроек другой задачей.

Для управления портами из программ, для Windows NT/XP используется драйвер "inpout32.dll", которого нет в базовом составе операционной системы. Данный драйвер содержит функции обращения к любому порту ввода/вывода процессора. Его необходимо скачать с сети (от чего я вас избавил, прицепив его в скрепке) и подключить к нашему проекту. Этому драйверу придётся везде таскать свою задницу с нами, т.к. если перенести нашу софтину на другой комп, "inpout32.dll" может там не оказаться.

Для того, чтобы подключить данный драйвер к проекту, его нужно просто поместить в папку с нашим проектом, и тогда компилятор сам его найдёт. Ну, наверное, хватит слов.., перейдём к действиям!

Значит номера портов мы знаем.., но будьте осторожны! Не стоит лезть в порты IDE, по вышеизложенной причине. Диск всегда занят, и если мы засунем свой нос в его дела, то это может привести к непредсказуемым последствиям. Я предупредил!!!

К остальным портам можно свободно коннектиться и работать с ними, как с файлами: читать/писать и т.д.
Попробуем навестить "Системный динамик" (бипер), который висит на 61-ом порту. Пнём его, и посмотрим что он нам ответит (на форме 3 кнопки):

  Private Declare Function Inp Lib "inpout32.dll" _ ' библиотека чтения
    Alias "Inp32" (ByVal PortAddress As Integer) As Integer
  Private Declare Sub Out Lib "inpout32.dll" _ ' библиотека записи
    Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

  Sub UserForm_Initialize() ' свойства ботвы
    UserForm1.Caption = "BeepTest v1.00"
    CommandButton1.Caption = "Старт"
    CommandButton2.Caption = "Стоп"
    CommandButton3.Caption = "Чтение"
  End Sub

  Private Sub Commandbutton1_Click()
    Out &H61, 11 ' отправить в 61-ый порт значение 11
  End Sub

  Private Sub CommandButton2_Click()
    Out &H61, 0 ' значение нуль - останавливает биппер
  End Sub

  Private Sub CommandButton3_Click()
    MsgBox (Inp(&H61)), , "Ответ биппера" ' читаем с 61-го порта
  End Sub

При нажатии кнопки "Старт" биппер начинает пищать как потерпевший. Первый раз мне даже пришлось перезагрузить машину, ..пока я не додумался вписать в кнопку "Стоп" значение нуль. Короче, "Стоп" - перекрывает кислород бипперу. Буттон "Чтение", соответственно, что-то читает с 61-го порта (у меня возвращает 32. ХЗ что это такое, может тип устройства или ещё что). При отладке обнаружилось, что для вкл.биппера, посылать в порт нужно именно 11. При другом значении биппер молчит.

В описании библиотек есть строка: (ByVal PortAddress As Integer, ByVal Value As Integer)
Она указывает на типы данных, с которыми мы работаем: значит и "PortAddress" у нас целое число, и данные "Value" целое число.

Если мы захотим вывести в LPT-порт текстовую строку, то нам надо изменить "Value As Integer" на "Value As String" и добавить на форму текстовое поле. Ввод в текстовое поле сохраняется в переменной, и от туда пересылается в LPT (на форме текст-бокс и две кнопки):

  Private Declare Function Inp Lib "inpout32.dll" _ ' библиотека чтения
    Alias "Inp32" (ByVal PortAddress As Integer) As Integer
  Private Declare Sub Out Lib "inpout32.dll" _ ' библиотека записи
    Alias "Out32" (ByVal PortAddress As Integer, ByVal i As String)

  Private Sub Commandbutton1_Click()
    i = TextBox1.Text ' читать из бокса в переменную
    Out &H378, i ' отправить в 378-ой порт текстовое сообщение
  End Sub

  Private Sub CommandButton2_Click()
    MsgBox (Inp(&H378)), , "Чтение данных с порта LPT"
  End Sub

К сожалению, код проверить не могу - нет принтера. Но зато можно будет попробовать прошить/прочитать память 24С08. У меня программатор LPT, но остался на работе. Подождём "Tomorrow"..

..а Вы пока прочитайте данные с порта 60 (клавиатура). Она что-то возвращает, но не могу понять что (вроде это не ASCII)! Попробуйте 1 раз нажать какую-нибудь клавишу и прочитать порт, нажать на другую клавишу - прочитать. Ответы всегда разные. (надеюсь, вы не додумаетесь писать в порт клавиатуры..)


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#21 26-06-2014 18:31:32

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

VBA. РАБОТА В EXCEL

Программировать в EXCEL очень интересно, и надо сказать, очень восстребовано.
Хорошие профессионалы (в вашем лице) нужны любой организации, т.к. преобладающее большинство бухгалтеров, это размалёванные барышни, в лучшем случае знающие EXCEL поверхностно и принятые на работу по-объявлениям. Они, как и прежде, выполняют рутинную работу в ручную и не имеют ни малейшего представления о существовании VBA, который позволит сэкономить время и автоматизировать весь процесс.
Ну это их проблемы, а наши с вами - освоить хотя-бы азы программирования в Microsoft EXCEL.

..значит: книга, лист, строка, столбец, ячейка, адрес, диапазон.
Заметьте, что я разложил составляющие документа EXCEL по-приоритетам, т.е. "книга" имеет приоритет перед "ячейкой" (и всей их братией). Так легче будет запоминать определения:

    * Книга    - WorkBook
    * Лист     - Sheet
    * Строка   - Row
    * Столбец  - Column
    * Ячейка   - Cells
    * Адресс   - Address
    * Диапазон - Range
    * Выбор    - Selection

Начнём с начала, и обсудим сходу все элементы, входящие в состав книги. Вот код:

  Private Sub CommandButton1_Click()
    MsgBox "Имя активной книги: " & ActiveWorkbook.Name
    MsgBox "Имя активного листа: " & ActiveSheet.Name
    MsgBox "Номер активной строки: " & ActiveCell.Row
    MsgBox "Номер активного столбца: " & ActiveCell.Column
    MsgBox "Адрес активной ячейки: " & ActiveCell.Address(0, 0)
    MsgBox "Адрес выделенного диапазона ячеек: " & Selection.Address(0, 0)
  End Sub

Как видите, адреса указываются с параметрами: (0, 0). Если параметр будет упущен, то адрес будет иметь формат "$A$1", т.е. абсолютное значение. Если указать параметр, то формат будет радовать глаз - "А1", т.е. покажет относительное значение.


Работа с книгой "WorkBook"

До этого момента мы имели дело с формой, на которой располагали элементы управления, юзали их свойства, определяли функции и т.д. Работа с книгой подразумевает чуть-другое направление: здесь мы должны работать не с формой, а с книгой и листом, которые (как и форма) имеют свои свойства.

Запустив VBasic, посмотрите в проводник проекта (окно "Project"), ..там перечислены активные элементы книги: "Лист1, Лист2, Лист3, Эта книга". Щёлкаем 2 раза на "Эта книга" и попадаем в "Окно кода" книги, в котором сверху висят два "ComboBox". В левом выбираем "WorkBook", а в правом можно выбрать для него процедуры. Перечислим наиболее значимые процедуры:

    * Open           - срабатывает при открытии книги
    * BeforeClose    - перед закрытием книги
    * BeforeSave     - перед сохранением книги
    * NewSheet       - при создании нового листа
    * SheetCalculate - при пересчётах формул
    * SheetChange    - при выборе листа

Приведём несколько примеров..

Открытие и закрытие книги "Open/BeforeClose"
Данный код выведет мессагу при открытии книги:

  Private Sub Workbook_Open()
    MsgBox "Книга успешно открыта!"
  End Sub

..здесь выскакивает просто сообщение. В идеале, функция может автоматом менять даты (если есть таковые в документе), придавать нужный вид.., т.е. менять всё то, с чего начинается работа с книгой.

Данная процедура может послужить неплохой альтернативой к "шпионажу", например узнать кто (если есть сеть) и когда открывал в ваше отсутствие документ. Добавьте в книгу лист и обзовите его "Spy" (шпион). Выделите столбец "С" и в свойствах задайте формат "Дата", а для столбца "D" формат "Время". В ячейку "В3" пишем нуль.

Осталось написать код, который (при каждом откр/закр книги) будет скидывать на лист "Spy": имя пользователя, дату и время открытия/закрытия файла:

  Private Sub Workbook_Open()
    x = Application.UserName ' задаём переменные
    y = Date
    Z = Time
    Sheets("Spy").Select ' переходим на лист "Spy"
     Range("A1") = "Время открытия" ' записываем инфу в ячейки
     Range("B1") = x
     Range("C1") = y
     Range("D1") = Z
     Range("A3") = "Открыто"
     Range("B3") = Cells(3, 2) + 1 ' счётчик открытия книги
    Sheets(1).Select ' прыжок на лист №1 (чтоб не мазолить глаза)
      MsgBox "Книга успешно открыта!"
  End Sub
 
  Private Sub Workbook_BeforeClose(Cancel As Boolean)
    x = Application.UserName ' тоже-самое, только при закрытии листа
    y = Date
    Z = Time
    Sheets("Spy").Select
     Range("A2") = "Время закрытия"
     Range("B2") = x
     Range("C2") = y
     Range("D2") = Z
    Sheets(1).Select
  End Sub


Стандартные операции с книгой (создать/сохранить, открыть/закрыть)
Для создания всего-нового (книги/листа или чего-другого), есть команда "Add". Но после того как книгу создали, её надо сохранить, чтоб включилась функция автосохранения, поэтому сразу сохраняем её в нужном месте:

    Workbooks.Add.SaveAs "c:\Моя книга.xlsx"
' можно сразу установить пароль
    Workbooks.Add.SaveAs "c:\Моя книга.xlsx", , "whatis"

Здесь, мы создаём новую книгу "Моя книга" с паролем "whatis".
Если Вы работаете с уже сохранённой книгой, и Вы просто хотите сохранить её в другом месте, то пишем так:

    ThisWorkbook.SaveAs Filename:="C:\Моя книга.xlsx"
' для сохранения в том-же самом месте
    ThisWorkbook.Save


Для того, чтоб открыть/закрыть книгу применяются соответствующие операторы "Open/Close".
..нужно просто указать путь открываемого файла:

    Workbooks.Open "c:\Моя книга.xlsx"
' перед закрытием - сохраняем книгу
    ThisWorkbook.Save
    ThisWorkbook.Close

Чтоб вызвать виндовое окно открытия файлов, можно использовать оператор "GetOpenFilename", который позволяет применить фильтр расширений - "xls" и "xlsx":

  Private Sub CommandButton1_Click()
    x = Application.GetOpenFilename("Files (*.xls), *.xls,Files (*.xlsx), *.xlsx")
    If x <> False Then
     Workbooks.Open x
    End If
  End Sub


Работа с ячейкой "Cells"
Ячейка в VBA адресуется как: Cells(1, 2), где "1" и "2" - строка и столбец соответственно.
Например, нам нужно записать по адресу "В1" некоторое число. Запись будет выглядеть так:

' запись на текущий лист
    Cells(1, 2) = 85
' текст заключается в кавычки
    Cells(1, 3) = "Whatis.ru"
' чтение с ячейки текущего листа
    x = Cells(1, 3)
    MsgBox x
' запись на конкретный лист
    Worksheets("Лист2").Cells(1, 1) = 123


Работа с диапазоном ячеек "Range"
Диапазон ячеек описывается "Range( )". При этом в скобках может находиться не обязательно диапазон ячеек, а можно описать и одну ячейку. При такой записи, произойдёт выделение только одной ячейки А1:

' выделение одной ячейки
    Range("A1").Select
' выделение диапазона ячеек
    Range("A1:B3").Select

Если произвести следующую запись, то единица будет находиться во всём указанном диапазоне.
Аналогичная ситуация и во втором случае: слово "Whatis" будет написано во всех ячейках диапазона:

  Private Sub CommandButton1_Click()
    Range("A1:B3") = 1
    Range("A4:B6") = "Whatis"
  End Sub

' или выделить одновременно несколько диапазонов
    Range("A1:A4,C1:C3").Select
    Range("A1:A3,C1:C3,E2:E5").Select
' выделение диапазона на произвольном листе
    Worksheets("Лист3").Range("A1:B3") = "Whatis"


Событие изменения ячейки Worksheet_SelectionChange
Существует много событиев на листе, которые можно интересно использовать. Одно из них изменение ячейки. Сделаем программу-тест, которая будет проверять условие: в ячейке "A1" вопрос, в "В1" ответ, в "С1" результат. Как только юзер изменит ячейку "В1" (нажмёт "Enter"), макрос сработает:

' код для книги
  Private Sub Workbook_Open()
     Range("A1") = "Бог войны"
  End Sub
' код для листа №1
  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Cells(1, 2) = "Зевс" Then
       Cells(1, 3) = "Да"
    Else
       Cells(1, 3) = "Нет"
    End If
  End Sub


Событие листа Worksheet_Activate/Calculate
Рассмотрим события, которые происходят при активации/деактивации листов, а так-же при пересчёте формул.
Первые два события возникают, когда вы переходите на лист или покидаете его:

' переход на лист
  Private Sub Worksheet_Activate()
    MsgBox "Вы перешли на следующий лист"
  End Sub
' уход с листа
  Private Sub Worksheet_Deactivate()
    MsgBox "Приходите ещё.."
  End Sub

' сработает при расчёте формулы
  Private Sub Worksheet_Calculate()
    MsgBox "Калькуляция успешно выполнена!"
  End Sub


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#22 28-06-2014 12:27:04

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

Маленькая программа в большом EXCEL'e

Макросы - довольно опасная штука, чтоб позволять юзеру запускать их на своей машине. Примеры выше - прекрастно это демонстрируют.. Недобросовестные личности могут так по-хозяйничать на вашей тачке, что мало не покажется. Но мы с вами идём обратным путём, и придерживаемся мнения - чем больше знаеш, тем крепче спиш!

Давайте создадим "доброкачественное" приложение, чтоб показать возможности программирования в среде EXCEL. Пусть это будет программа, типа "Прайс-лист", которой обычно пользуются в магазинах и торговых предприятиях. Имеем тип товара, его наименование и стоимость. Выбрав из нескольких/выпадающих списков наименование товаров, получаем общую их стоимость. Форма должна быть оформлена примерно так:

    +---------------------------------------------------+
    |  PriceList v1.00                               X  |
    +---------------------------------------------------+
    |        +--------------------------+---+           |
    | HDD    |       ComboBox1          | V |   0.00 $  |
    |        +--------------------------+---+           |
    |        +--------------------------+---+           |
    | DVD-RW |       ComboBox2          | V |   0.00 $  |
    |        +--------------------------+---+           |
    |                                                   |
    |                                 Итого:  000.00 $  |
    |                                                   |
    |          +-----------+   +-----------+            |
    |          |   Тест    |   | Посчитать |            |
    |          +-----------+   +-----------+            |
    +---------------------------------------------------+

Сразу проясним все нюансы и обозначим задачи:

    * Книга EXCEL содержит столько листов, сколько у нас типов товара (в моём случае 2: HDD, DVD-RW). Вы должны добавить ещё. Обзываю первый лист в "HDD", второй в "DVD". Далее, заполняю лист HDD. В ячейку "А1" загоняю имя первой железяки, а в "В1" её стоимость; в "А2" следущее имя, в "В2" стоимость; и т.д:

    Samsung SP1203N - 120Gb; 40,00 (в баксах)
    Seagate ST340015A - 80Gb; 26,60
..заполняем, покуда хватит товара (длинна столбца не фиксирована)
    WesternDigital 43AA - 4Gb; 1,20

Формат данных столбца "В" должен быть денежный. Проделываю тоже-самое с листом "DVD". Заполнив все необходимые ячейки листов, переходим к следующему пункту..

    * Нужно написать код, который заполнит наши комбо-боксы информацией, считанной с листов EXCEL. Есть много вариантов, но самый оригинальный - это применить цикл! Именно поэтому я указал, что при заполнении листов "Длинна столбца не фиксирована". Прочитали строку - перешли на следующую, и так, ..пока не достигнем пустой строки. Вот код:

    Dim i ' переменная для номера строки
    i = 1 ' указываем, что начинать с первой
    Do While Cells(i, 1) <> "" ' читаем строки, пока не попадётся пустая..
     ComboBox1.AddItem Cells(i, 1) ' заполняем комбо-бокс считанной строкой
    i = i + 1 ' переход на следущую строку
    Loop ' мотаем цикл

В предыдущем посте говорилось, что ячейка адресуется "Cells(1, 1)", где первая цифра это строка, а вторая столбец. В коде выше, мы присвоили строке переменную "i", которую с каждым разом увеличиваем на единицу. Заметьте, что столбец у нас всегда первый, т.к. во-втором у нас цена. Второй столбец мы будем выводить в "Label", поэтому пока его не трогаем.

    * Значит, значения столбцов "А" мы передали в соответствующие комбо-боксы, теперь нужно привязать выбор юзера в комбо-боксе, к столбцу "В" и вывести значение в "Label". Не буду распинаться, а просто напишу исходник нашей программы с комментариями:

''''''''''''''''''''''''''''''''''''''''''''
Dim objSheet1 As Excel.Worksheet  'переменные для листов
Dim objSheet2 As Excel.Worksheet
Dim Words1 As New Collection 'массив для столбца "В"
Dim Words2 As New Collection
Dim money1 As Currency 'все лейблы - в денежный формат
Dim money2 As Currency
Dim summa As Currency
'процедура заполнения комбо-бокс, с именем "AddList"
  Sub AddList()
    Dim i1%
    i1 = 1
    Do While objSheet1.Cells(i1, 1) <> "" 'для первого листа
        ComboBox1.AddItem objSheet1.Cells(i1, 1)
        Words1.Add objSheet1.Cells(i1, 2), objSheet1.Cells(i1, 1)
        i1 = i1 + 1
    Loop
''''''''''''''''''''''''''''''''''''''''''''
    Dim i2%
    i2 = 1
    Do While objSheet2.Cells(i2, 1) <> "" 'для второго листа
        ComboBox2.AddItem objSheet2.Cells(i2, 1)
        Words2.Add objSheet2.Cells(i2, 2), objSheet2.Cells(i2, 1)
        i2 = i2 + 1
    Loop
  End Sub 

''''''''''''''''''''начальная инициализация формы
  Private Sub UserForm_Initialize()
    UserForm1.Caption = " PriceList v1.00"
    CommandButton1.Caption = "Тест"
    CommandButton2.Caption = "Посчитать"
    ComboBox1.Enabled = False 'отключаем боксы
    ComboBox2.Enabled = False
    money1 = 0 'всю капусту по-нулям
    money2 = 0
  End Sub

''''''''''''''''''''''код для кнопки "Тест"
  Private Sub CommandButton1_Click()
    Set objSheet1 = Worksheets(1) 'листы обозначаем как "objSheet"
    Set objSheet2 = Worksheets(2)

  AddList 'вызов процедуры. заполняем боксы инфой
    ComboBox1.Enabled = True 'включаем боксы
    ComboBox2.Enabled = True
      MsgBox "Проверка базы данных успешно выполнена!", , "PriceList v1.00"
    CommandButton1.Enabled = False 'затеняем кнопку "Тест"
  End Sub

'кнопка "Посчитать" 
  Private Sub CommandButton2_Click()
    Suma = money1 + money2
    Label3.Caption = "Сумма: " & Suma & " $"
  End Sub
'''''''''''''''''''выводим цены в лейблы
  Private Sub ComboBox1_Click()
   On Error Resume Next
    money1 = Words1(ComboBox1.List(ComboBox1.ListIndex))
    Label1 = money1
  End Sub

  Private Sub ComboBox2_Click()
   On Error Resume Next
    money2 = Words2(ComboBox2.List(ComboBox2.ListIndex))
    Label2 = money2
  End Sub
''''''''''''''''''''''''''''''''''''''''''''

Вот-такая получилась программка. При запуске жмём кнопку "Тест", которая заполнит все боксы, активизирует нужные элементы управления и оповестит нас о благополучном завершении операции. По окончании процедуры, кнопка "Тест" отключается, чтоб не провоцировать ошибку при повторном нажатии.

Как добавить ещё боксов, надеюсь разберётесь. Если возникнут трудности, пишите..


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен

#23 19-09-2014 15:00:41

Garik
Mr. President!
Откуда: Москва
Зарегистрирован: 18-07-2006
Сообщений: 723
Вебсайт

Re: :: Visual Basic для карапузов ::

Создал раздел Программирование и разместил там материал со ссылками с кратким описанием на все статьи топика.
Вирусы под наркозом буду делать аналогично smile3

Неактивен

#24 20-06-2015 19:56:02

123ksn
Гость

Re: :: Visual Basic для карапузов ::

Rumit написал:

ВВЕДЕНИЕ

содержит только необходимый минимум для выработки алгоритмического мышления и начальных навыков программирования. В качестве системы программирования используется VBA.

Даже зарегистрировался, что бы сказать Вам ОГРОМНОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!
Вы рассказали просто о сложном. С нуля. Такое нынче редко встретишь. У Вас явно талант рассказчика и чувство меры.
Я нашел Вашу информацию пытаясь написать код для чтения информации из внешнего устройства через USB-COM -преобразователь в Excel. Неплохо это изложено здесь http://www.kernelchip.ru/articles/KA011.php и здесь http://www.vr-online.ru/blog/upravlenie … -port-8475 Но у меня такое чувство, что эти примеры "кастрированные". Явно не хватает какой-то информации. Я пытаюсь подключиться к USB-COM -преобразователю на СОМ26. То подключусь, то получу ругательство, что подключиться нельзя. Пытаюсь передавать информацию -ничего не возвращается. Это я к тому, что примеры может и рабочие, но минимальные, без защиты от дурака и "критерийной" информации для новичка. Может я не к тому порту подключаюсь MSComm1.CommPort = Val(TextBox4.Value) или ячейка с адресом содержит не тот тип данных(26 -должно быть число или строка?).  В общем был бы признателен за рабочий пример для дурака с максимумом выводимой информации, например:
1)вы ввели не цифры, а буквы
2)такого порта в системе нет
3)порт уже открыт(занят)  другой программой.....
4)порт вами уже открыт
5)порт не может быть открыт потому.....
6)порт не может быть закрыт потому.....
7)В порт отправлен код....
8)Портом принят код...

#25 22-06-2015 17:37:02

Rumit
Мастер
Откуда: Из матки
Зарегистрирован: 18-01-2008
Сообщений: 993
Вебсайт

Re: :: Visual Basic для карапузов ::

1. Я нашел Вашу информацию пытаясь написать код для чтения информации из внешнего устройства через USB-COM -преобразователь в Excel.

..какое именно устройство? По-какому протоколу идёт обмен?

2. Я пытаюсь подключиться к USB-COM - преобразователю на СОМ26. То подключусь, то получу ругательство, что подключиться нельзя. Пытаюсь передавать информацию - ничего не возвращается.

..чтоб проверить состояние порта, достаточно замкуть выводы Rx и Tx на выходе-COM (пины 2 и 3). Если линия доступна, то получиш "Эхо" (т.е. в окне терминала, все символы будут дублироваться).

3. В общем, был бы признателен за рабочий пример для дурака с макс.выводимой информацей:

..насколько мне известно, спецификация COM не обрабатывает ошибки, не поддерживает буферизацию и гибкого управления портом. Именно поэтому и применяются внешнии файлы типа "MSComm32". Правда можно обрабатывать ошибки вслепую, по-алгоритму программы, но это не-то...

Какой терминал сейчас используеш?
Попробуй виндовый (Программы->Стандартные->Связь->HuperTerminal). Настрой на него свой девайс и сможеш протестировать..

А вообще, кроме VBA какие-нить языки ещё знаеш? Могу набросать тебе консольную программку на ассемблере, только не протестированную, т.к. не имею внешнего устройства. Только объясни, для чего использовать собрался - лампочками моргать, управлять каким-нить устройством, или читать/писать данные из/в память и.т.д


Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

http://ne-kurim.ru/ncounter/134735-4.png

Неактивен


Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Рейтинг@Mail.ru