Консультация № 178647
26.05.2010, 01:16
0.00 руб.
0 7 1
Дан список, состоящий из названий книг, фамилий авторов, издательства и года изданий. Упорядочить список по издательствам. Вывод на экран сформировать в виде таблицы. Для ввода данных использовать форму и элементы управления.

1.В работе необходимо выполнить алгоритмические задачи с использованием базовых типов данных и основных операторов языка программирования VBA.
2. Задачи прислать в виде файлов Word либо Excel, с кодом программы, выполненном в среде VBA соответствующего компонента Office.
3. В программах обязательно наличие комментариев, поясняющих основные алгоритмические шаги.

Обсуждение

Неизвестный
28.05.2010, 19:20
общий
Ананьев Рудольф Олегович:
Вывод куда? в документ? Т.е. если я делаю это в Excel, то в качестве вывода должна быть таблица на каком-либо листе?
Неизвестный
28.05.2010, 20:19
общий
Измалков Эдуард Леонидович:
можно прямо в окно формы. на ваше усмотрение)
Неизвестный
28.05.2010, 20:24
общий
Ананьев Рудольф Олегович:
В том и дело, что проще это сделать в лист. Плюс еще вопрос.
А можно сделать так - данные из формы сразу записываются в таблицу, а при закрытии формы сортируются по издательству?
Неизвестный
28.05.2010, 20:28
общий
Измалков Эдуард Леонидович:
можно ) жестких ограничений нет, главное что бы работало )
Неизвестный
28.05.2010, 21:35
общий
Ананьев Рудольф Олегович:
https://rfpro.ru/upload/2531
попробуйте, будут вопросы-предложения, пишите. Если удовлетворит, оформлю ответом
Неизвестный
28.05.2010, 21:43
общий
Измалков Эдуард Леонидович:
хорошо, можно оформить. не забудьте про код программы )
Неизвестный
28.05.2010, 23:41
общий
это ответ
Здравствуйте, Ананьев Рудольф Олегович.
Приведено решение для Excel. Данные из формы заносятся в определенный лист в книге, затем полученная таблица сортируется по наименованию издательства.
Для начала Вам нужно будет создать форму, которая будет использоваться для ввода, и разместить на ней следующие элементы:
4 поля InputBox c именами: Ввод_названия_книги, Ввод_автора, Ввод_издательства, Ввод_года_выпуска и 2 кнопки, одна для сохранения с именем Кнопка_записи, другая для выхода с именем Кнопка_выхода. Плюс еще можно добавить подписи (поля Label) для каждого поля ввода текста.
Затем в код этой формы вставить следующий код
Код:
Const Имя_листа As String = "Список книг" ' название листа для ввода данных

Private Sub UserForm_Activate()
' при запуске формы нужно создать лист, куда будут сохраняться данные. Название листа указано в константе "Имя_листа"
' если лист уже существует, то его удалить

Application.ScreenUpdating = False ' не выводить ничего на экран, пока активна форма

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets ' цикл для перебора всех листов в текущем документе
If ws.Name = Имя_листа Then ' лист уже существует
Application.DisplayAlerts = False ' Отключение запроса на удаление листа, содержащего данные
ws.Delete ' удаление листа
Application.DisplayAlerts = True ' включение предупреждений
Exit For ' выход из цикла
End If
Next ws ' следующий лист
Set ws = ThisWorkbook.Worksheets.Add(before:=ThisWorkbook.Sheets(1)) ' создание нового листа перед первым листом
ws.Name = Имя_листа ' присвоение ему нужного названия
' заголовки таблицы
ws.Cells(1, 1).Value = "Название книги"
ws.Cells(1, 2).Value = "Автор книги"
ws.Cells(1, 3).Value = "Издательство"
ws.Cells(1, 4).Value = "Год выпуска"

Set ws = Nothing ' освобождение памяти
End Sub

Private Sub UserForm_Terminate()
' при закрытии формы сделать сортировку введенных данных
With ThisWorkbook.Worksheets(Имя_листа).UsedRange ' дальнейшие действия будут выполняться над заполненным диапазоном
' сортировка по третьему полю в порядке возрастания, первая строка - заголовки, регистр не учитывать
.Sort key1:=Columns(3), order1:=xlAscending, Header:=xlYes, MatchCase:=False
.Columns.AutoFit ' автоматическая ширина столбцов по содержимому
End With
Application.ScreenUpdating = True ' включение отображения изменений на листе
End Sub

Private Sub Кнопка_выхода_Click()
Unload Me ' выгрузка формы
End Sub

Private Sub Кнопка_записи_Click()
' Проверка на заполнение всех полей
If Trim(Me.Ввод_названия_книги.Value) = "" Then ' проверка на заполнение поля ввода названия, для этого убираются крайние пробелы, если они есть
MsgBox "Не введено название книги!", vbOKOnly + vbExclamation, "Внимание" ' сообщение с одной кнопкой "ОК" и значком предупреждения
Me.Ввод_названия_книги.SetFocus ' перемещение курсора в нужное поле
ElseIf Trim(Me.Ввод_автора.Value) = "" Then ' проверка на заполнение поля ввода автора, для этого убираются крайние пробелы, если они есть
MsgBox "Не указан автор книги!", vbOKOnly + vbExclamation, "Внимание" ' сообщение с одной кнопкой "ОК" и значком предупреждения
Me.Ввод_автора.SetFocus ' перемещение курсора в нужное поле
ElseIf Trim(Me.Ввод_издательства.Value) = "" Then ' проверка на заполнение поля ввода издательства, для этого убираются крайние пробелы, если они есть
MsgBox "Не указано издательство, выпустившее книгу!", vbOKOnly + vbExclamation, "Внимание" ' сообщение с одной кнопкой "ОК" и значком предупреждения
Me.Ввод_издательства.SetFocus ' перемещение курсора в нужное поле
ElseIf Trim(Me.Ввод_года_выпуска.Value) = "" Then ' проверка на заполнение поля ввода года выпуска, для этого убираются крайние пробелы, если они есть
MsgBox "Не указан год выпуска книги!", vbOKOnly + vbExclamation, "Внимание" ' сообщение с одной кнопкой "ОК" и значком предупреждения
Me.Ввод_года_выпуска.SetFocus ' перемещение курсора в нужное поле
ElseIf Len(Trim(Me.Ввод_года_выпуска)) > 4 Then ' в качестве года выпуска не может быть указано более 4 цифр
MsgBox "Неправильно введен год выпуска - год не может содержать более 4 цифр", vbOKOnly + vbCritical, "Ошибка" ' сообщение с одной кнопкой "ОК" и значком ошибки
Me.Ввод_года_выпуска.SetFocus ' перемещение курсора в нужное поле
ElseIf Not IsNumeric(Me.Ввод_года_выпуска) Then ' в поле ввода года введено не число
MsgBox "В качестве года выпуска должно быть указано число", vbOKOnly + vbInformation, "Внимание" ' сообщение с одной кнопкой "ОК" и значком информации
Me.Ввод_года_выпуска.SetFocus ' перемещение курсора в нужное поле
ElseIf CInt(Me.Ввод_года_выпуска) > Year(Now) Then ' введен год больше текущего
MsgBox "Год, указанный в качестве года выпуска еще не наступил", vbOKOnly + vbInformation, "Ошибка" ' сообщение с одной кнопкой "ОК" и значком ошибки
Me.Ввод_года_выпуска.SetFocus ' перемещение курсора в нужное поле
Else
Dim i As Integer
With ThisWorkbook.Worksheets(Имя_листа) ' with используется для того, чтобы внутри этого блока можно было обращаться к нужному листу без его явного указания
i = .UsedRange.Rows.Count + 1 ' количество строк на текущий момент плюс одна, чтобы указывать на первую чистую строку
.Cells(i, 1).Value = Me.Ввод_названия_книги.Value ' первый столбец - название книги
.Cells(i, 2).Value = Me.Ввод_автора.Value ' второй столбец - автор
.Cells(i, 3).Value = Me.Ввод_издательства.Value ' третий столбец - издательство
.Cells(i, 4).Value = Me.Ввод_года_выпуска.Value ' четвертый столбец - год выпуска книги
End With
' очистка значений полей ввода
Me.Ввод_автора.Value = ""
Me.Ввод_года_выпуска.Value = ""
Me.Ввод_издательства.Value = ""
Me.Ввод_названия_книги.Value = ""

Me.Ввод_названия_книги.SetFocus ' перемещение указателя в поле ввода названия книги
End If
End Sub

5
спасибо
Форма ответа