Зараз обговорюють

"Тобто є ряд завдань, які взагалі без рекурсії не наважуються."  - це як розуміти? Перефразуй, будь ласка. 

виправив, йшлося про те що деякі завдання можна вирішити лише при використанні рекурсії

Спасибі дуже корисна стаття

А ще щось планується подібного найближчим часом?


Дякую за підтримку, радий що Вам сподобалось!

Так маю вже майже дороблений проект по управлінні Audio файлом, на заміну стандартним клавішам управління HTML5, але ще не встиг відтестувати програвання файлів з інтернету, поки лише локально працює

Надіюсь найближчим часом дороблю й закину

Рахунки

webmoneyeur - E385818210641
usd - Z304643423050
uah - U354026817492
rub - R301704373231easypay80002677bitcoin1F5HRGroUtEQW9HBNbeew8iKh5KQ8vJxzw

Зворотній зв'язок

Для покращення роботи сайту надсилайте свої зауваження:
mailЗауваження
mailПропозиція

Статистика

UkrNET - поисково-информационный ресурс

VBA : UserForm практичне використання

В дані статті попробуємо розібрати як практично застосовуються елементи UserForms

Опис завдання

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

- Студент (аналог ПІБ)

- Група

- Курс

- Спеціальність

- Факультет

- Навчальний заклад

- Середній бал

- Характеристика

- Зображення

необхідно відобразити список студентів із можливістю фільтрувати дані:

сторінка 1

- Навчальний заклад

- Факультет

- Спеціальність

- Курс

- Група

- Список студентів

сторінка 2

- Загальна інформація яка буде містити (Студент, Спеціальність, Курс)

- Середній бал

- Характеристика

- Зображення

Інформація отримуватиметься із аркуша "List" в нашій робочій книзі

Створення/розмітка форми

Щоб відобразити інформацію на 2 сторінках використаємо елемент MultiPage і створимо 2 вкладки:

- Список студентів (наша сторінка 1)

- Картка студента (наша сторінка 2)

Список студентів

Усі дані які необхідно фільтрувати заповнимо у ComboBox для можливості вибору випадаючим списком, а для відображення списку ListBox, як результат отримаємо форму наступного вигляду:

також додано кнопку очистити фільтри (для зручності)

Картка студента

Для виведення описової інформації про студента створимо окремі TextBox по одну сторону, а по-другу додамо зображення студента, як результат отримаємо форму наступного вигляду:

також додано перемикач (SpinButton1) для можливості проходження по усіх елементах списку, без повернення на сторінку "Список студентів"

Написання коду для форми

Так як частина даних буде використовуватись при роботі із різними елементами нам будуть необхідні глобальні змінні рівня модуля які будуть зберігати в собі отримані дані по завершенні процедури

Private dataStudent() As Variant
Private cbxFull As Boolean
Private addList As Boolean
Private maxRow As Integer
Private Worksheet As Object 

dataStudent - буде отримувати масив студентів із аркуша "List" для подальшого використання в межах форми

cbxFull - дана змінна потрібна для контролю заповнення фільтрів на сторінці "Список студентів" (фільтри будемо заповняти лише один раз)

addList - потрібна для того щоб не виконувати код події lbxStydentList_Change в момент коли список буде очищатись і наповнюватись новими даними

maxRow - кількість записів на аркуші "List"

Worksheet - для спрощення посилання на робочу книгу і аркуш "List"

Private Sub UserForm_Initialize()
    Set Worksheet = ThisWorkbook.Sheets("List") 'заповняємо змінну для подальшого використання'
    On Error Resume Next 'для відключення можливої помилки при очищенні фільтрів (у випадку якщо немає встановлених фільтрів)'
    Worksheet.ShowAllData 'очистити фільтри на робочому аркуші'
    If Worksheet.Range("A2") <> "" Then maxRow = Worksheet.Range("A1").End(xlDown).Row Else maxRow = 2 'визначаємо максимальний рядок, якщо немає даних тоді максимальним рядком буде 2-й'
    Call getData 'процедура яка буде вибирати дані з аркуша і передавати їх для заповнення форми (далі розглянемо її код в деталях)'
End Sub 

Отже розглянемо роботу процедури getData

Private Sub getData()
Dim i As Integer, j As Integer, newMaxRow As Integer, arrRow As Integer
    Erase dataStudent 'очищуємо масив даних, щоб наповнити його новими даними (так як процедура виконується не одноразово, а після її завершення потрібен заповнений масив)'
    For i = 2 To maxRow
        If Not Worksheet.Rows(i).EntireRow.Hidden Then 'перевірка чи не прихований рядок, так як дані фільтруються на аркуші потрібно їх ідентифікувати, щоб потрапляли лише необхідні'
            newMaxRow = newMaxRow + 1 'обраховуємо к-ть видимих рядків'
        End If
    Next i
    If newMaxRow = 0 Then newMaxRow = maxRow - 1 'к-ть елементів які попадають у список студентів: усі чи відфільтровані'
    addList = True 'оголошуємо змінну для уникнення помилки виконання коду для lbxStydentList_Change (тому що зміна SpinButton1 викликає зміну індексу списку)'
        Me.SpinButton1.Max = newMaxRow - 1
    addList = False
    ReDim dataStudent(1 To newMaxRow, 1 To 9) 'переоголошуємо масив задаючи йому вказані розміри'
    For i = 2 To maxRow
        If Not Worksheet.Rows(i).EntireRow.Hidden Then 'перевірка чи не прихований рядок, так як дані фільтруються на аркуші потрібно їх ідентифікувати, щоб потрапляли лише необхідні'
            arrRow = arrRow + 1
            For j = 1 To 9
                dataStudent(arrRow, j) = Worksheet.Cells(i, j) 'заповняємо значення по стовпцях'
            Next j
            If cbxFull <> True Then
				'значення потрапляє на перевірку дублів і у випадку якщо його немає у списку то додається у відвідний елемент'
                Call checkDuplicate(dataStudent(arrRow, 2), "cbxGrup")
                Call checkDuplicate(dataStudent(arrRow, 3), "cbxKurs")
                Call checkDuplicate(dataStudent(arrRow, 4), "cbxSpecialnist")
                Call checkDuplicate(dataStudent(arrRow, 5), "cbxFacultet")
                Call checkDuplicate(dataStudent(arrRow, 6), "cbxZaklad")
            End If
        End If
    Next i
    cbxFull = True 'блокуємо повторне заповнення фільтрів'
    Call AddItemInList 'процедура для заповнення списку студентів із наповненого масиву'
End Sub 
Private Function checkDuplicate(checkString As Variant, control As String)
Dim i As Integer, duplicate As Boolean
    If Me.Controls(control).ListCount > 0 Then
        For i = 0 To Me.Controls(control).ListCount - 1
            If CStr(checkString) = Me.Controls(control).List(i) Then duplicate = True: Exit For 'значення яке перевіряємо конвертуємо в String так як усі дані списки повертаються як дані String, для коректного порівняння значень'
        Next i
    End If
    If duplicate <> True Then Me.Controls(control).AddItem checkString 'якщо перевірене значення немає дублікатів тоді додаємо в випадаючий список'
End Function 
Private Sub AddItemInList()
Dim i As Integer
    addList = True 'оголошуємо змінну для уникнення помилки виконання коду для lbxStydentList_Change'
        Me.lbxStydentList.Clear
        For i = 1 To UBound(dataStudent()) 'через різні фільтри масив може мати різну кількість даних, тож і йдемо від 1 до верхньої межі'
            Me.lbxStydentList.AddItem dataStudent(i, 1) 'додати елемент в список'
        Next i
    addList = False
End Sub 

При виборі значень із ComboBox необхідно буде фільтрувати дані на аркуші, тож пропишемо наступне

Private Sub cbxZaklad_Change()
    If Me.cbxZaklad.Value <> "" Then Worksheet.Range("$A$1:$I$" & maxRow).AutoFilter Field:=6, Criteria1:=Me.cbxZaklad.Value:     Call getData 'якщо випадаючий список не пустий відфільтрувати потрібні дані та основини список студентів'
End Sub
Private Sub cbxFacultet_Change()
    If Me.cbxFacultet.Value <> "" Then Worksheet.Range("$A$1:$I$" & maxRow).AutoFilter Field:=5, Criteria1:=Me.cbxFacultet.Value:     Call getData
End Sub
Private Sub cbxSpecialnist_Change()
    If Me.cbxSpecialnist.Value <> "" Then Worksheet.Range("$A$1:$I$" & maxRow).AutoFilter Field:=4, Criteria1:=Me.cbxSpecialnist.Value:  Call getData
End Sub
Private Sub cbxKurs_Change()
    If Me.cbxKurs.Value <> "" Then Worksheet.Range("$A$1:$I$" & maxRow).AutoFilter Field:=3, Criteria1:=Me.cbxKurs.Value:      Call getData
End Sub
Private Sub cbxGrup_Change()
    If Me.cbxGrup.Value <> "" Then Worksheet.Range("$A$1:$I$" & maxRow).AutoFilter Field:=2, Criteria1:=Me.cbxGrup.Value:      Call getData
End Sub 

Код клавіші очищення фільтрів:

Private Sub cbClear_Click()
    Me.cbxZaklad.Value = ""
    Me.cbxFacultet.Value = ""
    Me.cbxSpecialnist.Value = ""
    Me.cbxGrup.Value = ""
    Me.cbxKurs.Value = ""
    On Error Resume Next
    Worksheet.ShowAllData
    Call getData
End Sub 

При подвійному клацанні на елементів списку студентів будемо відкривати картку студента:

Private Sub lbxStydentList_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Me.MultiPage1.Value = 1
End Sub 

При зміні значення списку студентів буде заповнятись картка студента (якщо в стиску не обрано студентів картка буде пустою, або останньою яку переглядалось):

Private Sub lbxStydentList_Change()
    If addList <> True Then 'не виконувати код якщо список було очищено і він зараз наповняється'
        Me.SpinButton1.Value = Me.lbxStydentList.ListIndex 'для синхронізації SpinButton1 із списком студентів призначаємо їм однакові значення номера обраного значення списку'
		'заповнюємо наші TextBox інформацією із масиву, ListIndex + 1 тому що в нашому масиві дані починаються з 1, а елементи списку з 0'
        Me.tbGeneral.Value = "ПІБ " & dataStudent(Me.lbxStydentList.ListIndex + 1, 1) & ", " & dataStudent(Me.lbxStydentList.ListIndex + 1, 4) & ", " & dataStudent(Me.lbxStydentList.ListIndex + 1, 3) & " курс"
        Me.tbProgress.Value = "Середній бал - " & dataStudent(Me.lbxStydentList.ListIndex + 1, 7)
        Me.tbCharacteristic.Value = dataStudent(Me.lbxStydentList.ListIndex + 1, 8)
        Me.imgStudent.Picture = LoadPicture(ThisWorkbook.Path & "\Img\" & dataStudent(Me.lbxStydentList.ListIndex + 1, 9)) 'завантажуємо зображення студента із теки'
    End If
End Sub 

При зміні значення SpinButton1 необхідно його також в зворотню сторону синхронізувати із списком студентів

Private Sub SpinButton1_Change()
    addList = True
    Me.lbxStydentList.ListIndex = Me.SpinButton1.Value
    addList = False
End Sub 

В результаті отримаємо

Файли доступні за посиланням

Завантажити з Завантажити з


view371like0dislike0 avatard_l4w clock 2016-12-14 04:05

Коментарі:



Для даної статті відсутні коментарі

Про нас

"Programmers World" розроблено з метою полегшення в освоєнні навичок програмування, та поширення матеріалів з сфери ІТ Українською мовою.

Кожен бажаючий може безкоштовно користуватися ресурсами сайту, щоб:

- Вивчати теоретичні аспекти мов програмування

- Переглядати практичне застосування теорії при виконанні різних міні проектів з відкритим кодом

- Розміщати свої завдання на форумі для допомоги в їх реалізації, або готового коду який може бути корисний іншим користувачам

- Спілкуватись з іншими користувачами та обмінюватись досвідом

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

Сайт

Зареєстровані користувачі можуть скористатися системою діалогів, в профілі користувача, для отримання потрібної інформації. Написати!

Також Ви можете використати форми відправки Зауважень та Пропозицій.


Електронна пошта

Ви можете звертатись на нашу поштову скриньку site.programmersworld@gmail.com

www.000webhost.com