Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Оптимизация проектных решений оснований и фундаментов с помощью Microsoft Excel и Visual Basic for Applications (примеры расчета). Методические указан

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
5. Текстовые поля в левой нижней рамке. Верхнее текстовое поле
предназначено для ввода ширины или диаметра подошвы, а нижнее – для ввода длины подошвы фундамента. Свойство Name верхнего текстового поля устанавливаем в значение ShirinaBox. Справа от него расположен элемент управления Label, свойство Caption которого содержит название текстового поля, отображаемое на экране. Значение Label свойства Caption изменяем на «ширина или диаметр подошвы». Аналогично изменяем свойства Name и Caption для второго текстового поля, установив их в значения DlinaBox и «длина подошвы».
6. Правая верхняя рамка (рис. 4). Она предназначена только для
обозначения типа вводимых данных. Значение Frame свойства Caption изменяем на «давление на основание».
7. Текстовое поле в правой верхней рамке. Свойство Name
устанавливаем в значение DavlenBox, а значение Label свойства Caption названия текстового поля изменяем на «дополнительное уплотняющее давление на основание».
8. В двух оставшихся рамках (рис. 4) значения Frame свойства Caption изменяем соответственно на «глубина определения напряжений» и «шаг определения напряжений». В текстовых полях свойства Name устанавливаем соответственно в значения GlubinaBox и ShagBox. Значения Label свойства Caption названия текстовых полей изменяем также соответственно на «3 и более ширины или диаметра подошвы фундамента» и «не более 0,4 ширины или диаметра подошвы фундамента».
9. Левая командная кнопка (рис. 4). Значение CommandButton свойства Name изменяем на OKButton, а свойство Caption устанавливаем в значение OK. Свойство Default устанавливаем в значение True, а свойство Cancel - в значение False.
10. Правая командная кнопка (рис. 4). Устанавливаем свойству Name значение CancelButton, а свойству Caption – Отмена. Свойство Cancel изменяем на True, а свойство Default – на False.
Если в процессе ввода данных пользователю будет удобнее
перемещаться в диалоговом окне между элементами управления с помощью клавищи <Tab>, то необходимо определить в форме порядок активизации элементов управления. Для этого используются свойства TabIndex и TabStop. Свойство TabStop может принимать всего два значения: True и False, принимаемый по умолчанию. Элемент управления со свойством TabStop, установленный в значение False, не учитывается при задании порядка активизации.
21
Рис. 5. Вид пользовательской формы.
Свойство TabIndex может принимать целочисленные значения от 0
и более. С его помощью можно указать любой порядок активизации удобный пользователю. Для этого следует изменить значение свойства TabIndex каждого элемента управления за исключением подписи.
После завершения разработки формы и установления порядка активизации элементов управления можно протестировать ее. Для этого необходимо выбрать форму и щелкнуть на кнопке с изображением синего треугольника (или Run→Run Sub/User Form). В результате отобразится пользовательская форма, в которой порядок активизации можно проверить с помощью клавищи <Tab>. Чтобы вернуться к режиму разработки формы следует щелкнуть на кнопке закрытия формы (х), а командные кнопки пока еще не работают.
Пользовательская форма (рис. 5) пока не выполняет никаких
полезных действий, так как элементы управления еще не связаны с соответствующими обработчиками событий, но она уже имеет рабочий вид и при необходимости ее можно откорректировать.
4. Некоторые свойства и методы диапозонов.
Большая часть операций в Excel связана с управлением диапазонами,
например, выделение, копирование, форматирование диапазонов, добавление формул и значений в диапазоны и т.д. Поэтому необходимо уметь выполнять эти операции в коде VBA, т.е. уметь описывать методы реализации подобных операций средствами VBA. Всю необходимую информацию по этим и другим вопросам с подробным описанием и многочисленными примерами можно найти в окне Object Browser
22
редактора VBE. Здесь же представлены только некоторые свойства и методы объекта Range, например:
Cells – возвращает ссылку на объект Range и используется для
обращения к определенной ячейке;
Column – возвращает номер первого столбца в диапазоне, где
столбец А имеет номер 1, столбец В – номер 2 и т.д.;
End – принимает один аргумент, определяющий направление выделения, и представлен встроенной константой xlDown, xlUp, xlToRight или xlToLeft. При использовании свойства End не обязательно знать размер диапазона, так как код описывает действительный диапазон;
Row – возвращает номер первой строки в диапазоне;
Font – возвращает ссылку на шрифт, используемый для представления данных диапазона;
Formula – возвращает формулу в виде строки;
FormulaRlCl – возвращает формулу диапазона в виде строки в формате RlCl;
Interior – возвращает ссылку на заливку ячейки;
Name – возвращает имя диапазона (если оно указывалось ранее);
NumberFormat – возвращает код числового формата в виде строки для указанного диапазона;
Offset – возвращает ссылку относительно диапазона, представляемого единственной ячейкой;
Value – возвращает значение ячейки, представляемого текстом, числом или результатом вычисления формулы;
Clear – удаляет все содержимое диапазона вместе с форматированием;
ClearContents – удаляет содержимое диапазона с сохранением форматирования;
Copy – копирует диапазон;
Select – выделяет диапазон;
Sort – сортирует диапазон.
При обращении к диапазону после ключевого слова Range указывается адрес в двойных кавычках. Адресом может быть ячейка, строка, столбец, диапазон, состоящий из нескольких строк и столбцов, название диапазона. Например, Range(“D5”), Range(“F15”), Range(“D5:H5”), Range(“D5:D15”), Range(“D5:H15”), Range(“Таблица”).
При обращении к свойству Cells, который указывается после слова Range, можно использовать один или два аргумента. Если диапазон содержит один столбец или одну строку, то используется один аргумент. Если диапазон имеет прямоугольную форму, то используется два аргумента, например
23
оператор Range(“D5:D15”).Cells(5) ссылается на пятую ячейку в
диапазоне D5:D15, т.е. на ячейку D9;
оператор Range(“D5:H15”).Cells(5,4) ссылается на ячейку в пятой
строке и четвертом столбце диапазона D5:H15, т.е. на ячейку G9.
При обращении к свойству Offset используется два аргумента.
Первый аргумент задает смещение по строкам, а второй – по столбцам. Аргументы могут принимать положительные и отрицательные значения и значение 0. Положительное смещение используется для перемещения вниз и вправо по диапазону, а отрицательное – вверх и влево, например
- оператор Range(“D7”).Offset(3,4) указывает на ячейку H10;
- оператор Range(“D7”).Offset(6,0) указывает на ячейку D13;
- оператор Range(“D7”).Offset(-5,-3) указывает на ячейку A2.
С помощью конструкции With и свойства Offset можно выделить
требуемый диапазон, например диапазон E9:H14
With Range(“B7”) Range(.Offset(2,3), .Offset(7,6)).Select End With
При неизвестном размере выделяемого диапазона используется
свойство End, например
With Range(“B7”) Range(.Cells(2,3), .End(xlDown) .End(xlToRight)).Select End With
Первый аргумент .Cells(2,3) определяет ячейку, с которой начинается выделение диапазона. Это ячейка D8. Второй аргумент .End(xlDown) .End(xlToRight) указывает на нижний правый угол диапазона.
Порядок использования остальных свойств и методов объекта Range можно узнать в окне Object Browser редактора VBE, изучив примеры, приведенные для каждого свойства и метода.
5. Условные операторы и циклы.
Язык программирования VBA, как и все языки программирования, обладает логическими конструкциями для управления ходом выполнения программы.
Конструкция If используется в тех случаях, когда необходимо выполнить один из нескольких вариантов решения задачи, каждый из которых выполняется в соответствии со своим кодом. В качестве условия перехода к одному из вариантов используется любое логическое выражение, которое может быть истинным или ложным. В практике программирования применяются следующие варианты конструкции If:
If-Then – однострочная конструкция, занимающая всего одну строку и не требующая применения оператора End If. Она состоит из одного условия и одного оператора. Если условие истинно, то оператор,
24
введенный после ключевого слова Then, выполняется, а если ложно – то не выполняется, например
If KlasZdan = 1 Then KoofNad = 1,2. If-Then-Else-End If – многострочная конструкция, состоящая из
одного условия и нескольких операторов. Если условие истинно, то выполняется оператор, введенный после ключевого слова Then, а если ложно – то выполняется оператор, введенный после ключевого слова Else, например
If VidGrunta = “связный” Then
SigmaAh = Gamma*Glubina*Lamda – SigmaCh
Else
SigmaAh = Gamma*Glubina*Lamda
End If If-Then-ElseIf-Then-Else-End If – многострочная конструкция,
состоящая из нескольких условий и нескольких операторов. В данной конструкции допускается использование любого количества ключевых слов ElseIf, а оператор Else не обязательный. После ключевого слова If и каждого ElseIf вводится свое условие, а после каждого ключевого слова Then вводится также свой оператор. Выполняется тот оператор, для которого условие истинно, а остальные операторы не выполняются, например
If FormaPodosh = “прямоугольная” Then
PloshPodosh = Shirina*Dlina
ElseIf FormaPodosh = “квадратная” Then
PloshPodosh = Shirina^2
ElseIf FormaPodosh = “ленточная” Then
PloshPodosh = Shirina*1,0
ElseIf FormaPodosh = “круглая” Then
PloshPodosh = Pi*Diametr^2/4
End If
Вложенные операторы If – многоступенчатая конструкция,
состоящая из нескольких, приведенных выше конструкций, например
If условие 1 Then If условие 1(1) Then Оператор 1(1) ElseIf условие 1(2) Then Оператор 1(2) Else Оператор 1(3) End If
ElseIf условие 2 Then
25
If условие 2(1) Then Оператор 2(1) Else Оператор 2(2) End If
End If
Если условие 2(1) истинно, то выполнится оператор 2(1), а остальные
операторы не будут выполняться.
Конструкция If с составными условиями, например
If условие 1 And (условие 2 Or условие 3) Then
Оператор 1
ElseIf условие 4 And условие 5 And (условие 6 Or условие 7) Then
Оператор 2
End If
В этом примере оператор 2 выполнится в том случае если условия 4,
5 и одно из условий 6 или 7 будут истинными.
Конструкция Case, как правило, используется в тех случаях, когда конструкция If из-за присутствия нескольких блоков ElseIf становится сложной. Она начинается с ключевого слова Select Case и переменной, вводимой сразу после ключевого слова и по отношению к которой выполняются разные варианты действий. Далее несколько блоков Case со значениями и операторами, не обязательный блок Case Else и в конце оператор End Select, например
Select Case Переменная Case Значение 1 Оператор 1 Case Значение 2 Оператор 2 Case Else Оператор 3 End Select
В данном примере оператор 3 выполнится только в том случае, если
переменная не будет соответствовать значениям 1 и 2, оператор 2 – если переменная соответствует значению 2, а остальные операторы не будут выполняться.
В структуре цикла For-Next используются ключевые слова For, To, Step и Next. Цикл всегда начинается с ключевого слова For, и завершается словом Next. В цикле обязательно должна присутствовать переменная­счетчик. По умолчанию счетчик увеличивается на единицу и ключевое слово Step можно не указывать. Если в цикле шаг выполнения операций отличен от единицы, то Step необходимо указывать. Тело цикла
26
выполняет определенные действия заданное количество раз с выбранным инкрементом приращения, например
For i = 1 To 10 Step 0,1 Операторы Next
Здесь выполнение операторов, находящихся в теле цикла, производится с шагом 0,1 до тех пор, пока переменная i не станет равным 10.
В некоторых случаях, когда введенное в тело цикла условие выполнился, и нет необходимости дальнейшего его продолжения, возникает необходимость преждевременного выхода из цикла. Для этого используется оператор Exit For, например
For i = 1 To 100 Step Shag If SigmaPz < 0,2*SigmaQz Then Exit For
Операторы
Next
В этом примере действия над операторами, введенными в тело цикла, выполняется не заданное количество раз, а до тех пор, пока условие в конструкции If ложно. Как только условие становится истинным, происходит немедленное завершение цикла с помощью оператора Exit
For.
Когда операторы, введенные в тело цикла, зависят от двух и больше циклически изменяющихся параметров создаются вложенные циклы со своими счетчиками. Один счетчик используется для пошагового изменения первого параметра, а второй – для второго параметра, например
For i = 1 To 4 For j = 1 To 10 Step 0,5
Операторы Next j Next i
Здесь в операторе Next указана имя переменной-счетчика, которая является не обязательной. При использовании нескольких вложенных циклов удобнее указывать переменную и тем самым определить, к какому оператору For относится оператор Next.
Цикл For-Next используется, как правило, для выполнения
фиксированного количества действий. Если заранее не известно число необходимых действий над операторами, то можно воспользоваться циклом Do-Loop, который имеет четыре различных варианта:
Do Until-Loop – в котором операторы тела цикла выполняются, пока
условие, вводимое после ключевого слова Until, остается ложным.
27
Do While-Loop – в котором операторы тела цикла выполняются, пока
условие, вводимое после ключевого слова While, остается истинным.
Do-Loop Until – в котором при проверке условия, вводимого после ключевого слова Until, принимается решение о повторном выполнении тела цикла.
Do-Loop While – в котором также как и в третьем варианте при проверке условия, вводимого после ключевого слова While, принимается решение о повторном выполнении тела цикла.
В первых двух вариантах операторы в теле цикла могут не выполняться ни разу, а во вторых двух вариантах тела циклов выполняются как минимум один раз, например
1) цикл Do-Loop Until из приложения расчета осадки Do ExpString = "Вертикальное напряжение от собственного веса" _ & "грунта на уровне подошвы " & i & "-го элементарного слоя" _ & " и модуль деформации " & i & "-го элементарного слоя" InputsForm.Show Range("E" & i + 7 & "") = ModulDeform Range("F" & i + 7 & "") = SobstvVesZ Call Raschet2 i = i + 1 Loop Until Range("H" & i + 6 & "") <= Range("G" & i + 6 & "")
2) цикл Do While-Loop из приложения расчета осадки во времени Do While Range("D" & i + 6 & "") <= 0.999 * Range("F6") With Range("A7") .DataSeries Rowcol:=xlColumns, Step:=1, Stop:=i .Offset(1, 1).Copy Range(.Offset(1, 1), .Offset(i, 1)) Range(.Offset(0, 3), .Offset(0, 3)).Copy Range(.Offset(1, 3), .Offset(i,
3)) Range(.Offset(1, 1), .Offset(1, 2)).Copy Range(.Offset(2, 1), .Offset(i,
2)) End With i = i + 1 Loop
Цикл Do-Loop не обладает встроенным счетчиком и при не верном
условии завершении цикла существует опасность возникновения бесконечного цикла, из которого программа не сможет выйти сама. Для завершения бесконечного цикла следует воспользоваться комбинацией клавиш <Ctrl+Break>, которая позволяет прекратить выполнение программы и сохранить выполненную работу. Кроме того, как и в случае
28
цикла For-Next, в цикле Do-Loop существует возможность преждевременного завершения тела цикла оператором Exit Do.
6. Код обработки событий для пользовательской формы.
Последовательность создания кода обработки событий для
пользовательской формы рассмотрим на примере формы (PrimerForm.xls), созданной в параграфе 3 (рис. 5). Для этого необходимо из файла PrimerForm.xls запустить редактор VBE, переключиться на форму и на панели инструментов Standart выполнить команду View→Code (Вид→Код). Команда View→Object позволяет переключиться в режим разработки формы. В форме присутствуют три обработчика событий: UserForm_Initialize, OKButton_Click и CancelButton_Click. Первый обработчик определяет внешний вид формы при открытии, а остальные обеспечивают реакцию на щелчок пользователя на командных кнопках OK и Отмена.
При открытии пользовательской формы она должна иметь
следующий вид: переключатель прямоугольной формы подошвы фундамента – выставлен, а остальные текстовые поля - пустые. Для этого в процедуру обработки события UserForm_Initialize необходимо ввести следующий код:
PryamFund.Value = True или PryamFund = True
Оба варианта равнозначны, но второй вариант более приемлем, так
как он короче. Для очистки поля ввода данных в процедуру также следует ввести коды:
ShirinaBox.Value = "" или ShirinaBox = "" DlinaBox.Value = "" или DlinaBox = "" DavlenBox.Value = "" или DavlenBox = "" GlubinaBox.Value = "" или GlubinaBox = "" ShagBox.Value = "" или ShagBox = ""
Таким образом, полный код процедуры обработки события
UserForm_Initialize с форматированием данных, вводимых в текстовые поля, имеет следующий окончательный вид:
Private Sub UserForm_Initialize() PryamFund = True ShirinaBox = Format(Shirina, "0.00") DlinaBox = Format(Dlina, "0.00") DavlenBox = Format(Davlen, "0.00") GlubinaBox = Format(Glubina, "0.00") ShagBox = Format(Shag, "0.00")
ShirinaBox = "" DlinaBox = "" DavlenBox = ""
29
GlubinaBox = "" ShagBox = ""
End Sub
Для сохранения введенных пользователем данных и есть основное
назначение процедуры OKButton_Click. Такие данные, как правило, заносятся в глобальные переменные, определяемые областью действия Public и используемые в программе в коде процедур и в коде обработчиков событий. Значения этим переменным назначаются в коде обработчиков событий, после чего они запрашиваются и используются в коде модуля.
Если при вводе данных совершена ошибка, то для ее обнаружения в
VBA используется функция IsNumeric, которая анализирует, является ли значение числовым, например
With ShirinaBox If .Value = “” Or Not IsNumeric(.Value) Then
MsgBox “Введено не числовое значение ширины подошвы” .SetFocus Exit Sub End If End With
Такая проверка очень удобна при вводе нескольких данных, так как при не правильном вводе выводится сообщение об ошибке и на форме активизируется тот элемент управления, куда были введены ошибочные данные. Программа завершается при помощи оператора Exit Sub, а форма не выгружается и предоставляется возможность пользователю исправить ошибку.
В рассматриваемом примере (PrimerForm.xls) используется глобальная переменная FormaPodosh, которая в зависимости от формы подошвы фундамента принимает значения от 1 до 4, например, число 1 соответствует прямоугольной форме, а число 4 – круглой форме. Для установления активизированного переключателя используется конструкция If-Then-ElseIf-Then-Else-End If. Если, например, переключатель ленточной формы подошвы фундамента выставлен, то переменная FormaPodosh принимает значение 2 и в дальнейшем программа выполняет расчеты только для ленточного фундамента, не касаясь остальных форм подошвы.
Введенные пользователем в текстовые поля формы данные заносятся в глобальные переменные: Shirina, Dlina, Davlenie, Glubina и Shag, где они сохраняются и также запрашиваются и используются в коде модуля.
В конце процедуры OKButton_Click обязательно нужно ввести оператор выгрузки формы Unload Me. Если в код процедуры не ввести
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]