Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Создание формы UserForm в процессе выполнения макроса - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Создание формы UserForm в процессе выполнения макроса
Sashagor1982 Дата: Понедельник, 25.08.2014, 23:28 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте уважаемые форумчане. Необходима помощь в решении следующей задачи, в приложенном файле список, при нажатии на кнопку отправить открывается форма UserForm созданная с помощью редактора, необходимо:
1. Что бы форма UserForm создавалась в процессе выполнения макроса, т.е. изначально шаблон не был создан в редакторе.
2. Имела динамические границы, т.е. заполнялась в зависимости от того, если в столбце F в примере стоит "пв".

Есть ли возможность решения таких задач? Заранее спасибо.
[moder]А где в файле макросы и форма?
К сообщению приложен файл: 3071323.xls (90.5 Kb)


Сообщение отредактировал Sashagor1982 - Понедельник, 25.08.2014, 23:33
 
Ответить
СообщениеЗдравствуйте уважаемые форумчане. Необходима помощь в решении следующей задачи, в приложенном файле список, при нажатии на кнопку отправить открывается форма UserForm созданная с помощью редактора, необходимо:
1. Что бы форма UserForm создавалась в процессе выполнения макроса, т.е. изначально шаблон не был создан в редакторе.
2. Имела динамические границы, т.е. заполнялась в зависимости от того, если в столбце F в примере стоит "пв".

Есть ли возможность решения таких задач? Заранее спасибо.
[moder]А где в файле макросы и форма?

Автор - Sashagor1982
Дата добавления - 25.08.2014 в 23:28
nilem Дата: Понедельник, 25.08.2014, 23:46 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может, проще листбокс использовать?


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениеможет, проще листбокс использовать?

Автор - nilem
Дата добавления - 25.08.2014 в 23:46
Sashagor1982 Дата: Вторник, 26.08.2014, 00:02 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Если есть проще решение, то подскажите.
 
Ответить
СообщениеЕсли есть проще решение, то подскажите.

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 00:02
nilem Дата: Вторник, 26.08.2014, 00:24 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
вот, например
К сообщению приложен файл: 3071323-1.zip (24.2 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
Сообщениевот, например

Автор - nilem
Дата добавления - 26.08.2014 в 00:24
Sashagor1982 Дата: Вторник, 26.08.2014, 11:55 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Спасибо один из вариантов решения, можно поподробнее рассказать как заполняется форма?
 
Ответить
СообщениеСпасибо один из вариантов решения, можно поподробнее рассказать как заполняется форма?

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 11:55
Sashagor1982 Дата: Вторник, 26.08.2014, 12:01 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Если не трудно можно кратко объяснить как работает код?
[vba]
Код
Private Sub UserForm_Initialize()
Dim x, i&, s
x = Range("A5:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value
With ActiveSheet
     If .FilterMode Then .ShowAllData
End With
For i = 1 To UBound(x)
     If x(i, 6) = "пв" Then s = s & "~" & x(i, 1)
Next i
If Len(s) Then Me.ListBox1.List = Split(Mid(s, 2), "~")
End Sub
[/vba]
 
Ответить
СообщениеЕсли не трудно можно кратко объяснить как работает код?
[vba]
Код
Private Sub UserForm_Initialize()
Dim x, i&, s
x = Range("A5:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value
With ActiveSheet
     If .FilterMode Then .ShowAllData
End With
For i = 1 To UBound(x)
     If x(i, 6) = "пв" Then s = s & "~" & x(i, 1)
Next i
If Len(s) Then Me.ListBox1.List = Split(Mid(s, 2), "~")
End Sub
[/vba]

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 12:01
Hugo Дата: Вторник, 26.08.2014, 12:28 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Так будет без возможных повторов, и правильнее - первым делом нужно снять фильтры!
[vba]
Код
Private Sub UserForm_Initialize()
      Dim x, i&

      With ActiveSheet
          If .FilterMode Then .ShowAllData
      End With

      x = Range("A5:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value

      With CreateObject("scripting.dictionary"): .comparemode = 1
          For i = 1 To UBound(x)
              If x(i, 6) = "пв" Then .Item(x(i, 1)) = 0&
          Next i
          If .Count Then Me.ListBox1.List = .keys
      End With

End Sub
[/vba]


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТак будет без возможных повторов, и правильнее - первым делом нужно снять фильтры!
[vba]
Код
Private Sub UserForm_Initialize()
      Dim x, i&

      With ActiveSheet
          If .FilterMode Then .ShowAllData
      End With

      x = Range("A5:F" & Cells(Rows.Count, 1).End(xlUp).Row).Value

      With CreateObject("scripting.dictionary"): .comparemode = 1
          For i = 1 To UBound(x)
              If x(i, 6) = "пв" Then .Item(x(i, 1)) = 0&
          Next i
          If .Count Then Me.ListBox1.List = .keys
      End With

End Sub
[/vba]

Автор - Hugo
Дата добавления - 26.08.2014 в 12:28
nilem Дата: Вторник, 26.08.2014, 15:34 | Сообщение № 8
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
...и правильнее - первым делом нужно снять фильтры!

да, это я просмотрел. Упс :)


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
...и правильнее - первым делом нужно снять фильтры!

да, это я просмотрел. Упс :)

Автор - nilem
Дата добавления - 26.08.2014 в 15:34
Sashagor1982 Дата: Вторник, 26.08.2014, 18:04 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Еще небольшой вопрос, как доработать код, что бы у тех у кого поставлены галочки в столбце F вместо "пв" ставилось например "о"?
 
Ответить
СообщениеЕще небольшой вопрос, как доработать код, что бы у тех у кого поставлены галочки в столбце F вместо "пв" ставилось например "о"?

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 18:04
RAN Дата: Вторник, 26.08.2014, 18:20 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Никак.
Для этого другой код писать нужно.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНикак.
Для этого другой код писать нужно.

Автор - RAN
Дата добавления - 26.08.2014 в 18:20
Hugo Дата: Вторник, 26.08.2014, 18:49 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Можно словарь сделать публичным и запоминать вместо нуля номер строки. Затем обрабатываем галочки - извлекаем из словаря номер строки, по номеру в ячейку пишем что угодно.
К сообщению приложен файл: 3071323-2.xls (63.5 Kb)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеМожно словарь сделать публичным и запоминать вместо нуля номер строки. Затем обрабатываем галочки - извлекаем из словаря номер строки, по номеру в ячейку пишем что угодно.

Автор - Hugo
Дата добавления - 26.08.2014 в 18:49
Gustav Дата: Вторник, 26.08.2014, 18:58 | Сообщение № 12
Группа: Админы
Ранг: Участник клуба
Сообщений: 2867
Репутация: 1208 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Что бы форма создавалась в процессе выполнения макроса, т.е. изначально шаблон не был создан в редакторе

В порядке эксперимента решил тоже поучаствовать. К цитируемому подошёл в буквальном смысле - до начала работы макроса формы в файле не существует. Решение - на базе старого доброго Dialog Sheet, который хоть уже и не появляется в предлагаемом списке типов при объявлении переменных, но тихо продолжает обитать внутри Excel. Фишка (хотя и сомнительная) в том, что форма диалога генерируется на лету, для этого создается скрытый лист диалога, который после использования списка уничтожается. В качестве дополнительного бонуса подаю список на выбор в отсортированном виде. Обратите также внимание, что всё действие ограничено одной единственной процедурой.

К сообщению приложен файл: 3071323_ds.zip (29.7 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Вторник, 26.08.2014, 19:51
 
Ответить
Сообщение
Что бы форма создавалась в процессе выполнения макроса, т.е. изначально шаблон не был создан в редакторе

В порядке эксперимента решил тоже поучаствовать. К цитируемому подошёл в буквальном смысле - до начала работы макроса формы в файле не существует. Решение - на базе старого доброго Dialog Sheet, который хоть уже и не появляется в предлагаемом списке типов при объявлении переменных, но тихо продолжает обитать внутри Excel. Фишка (хотя и сомнительная) в том, что форма диалога генерируется на лету, для этого создается скрытый лист диалога, который после использования списка уничтожается. В качестве дополнительного бонуса подаю список на выбор в отсортированном виде. Обратите также внимание, что всё действие ограничено одной единственной процедурой.


Автор - Gustav
Дата добавления - 26.08.2014 в 18:58
Hugo Дата: Вторник, 26.08.2014, 19:12 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Gustav, классно, но тоже сперва нужно снять фильтры...


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеGustav, классно, но тоже сперва нужно снять фильтры...

Автор - Hugo
Дата добавления - 26.08.2014 в 19:12
Gustav Дата: Вторник, 26.08.2014, 19:23 | Сообщение № 14
Группа: Админы
Ранг: Участник клуба
Сообщений: 2867
Репутация: 1208 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Gustav, классно, но тоже сперва нужно снять фильтры...

Hugo, Игорь, так я там, вроде, снимаю, в смысле снимаете вы с nilem, а я у вас передираю :)
А так любопытно, согласись, при не сильно навороченных выборах/отметках/вводах может быть полезно. Одно меня смущает - нет ли какого-нибудь небесконечного предела при операции создании/удалении листа. Помнится, что-то такое есть при создании копии листа, типа не более 8 тысяч раз с хвостиком, что ли...

P.S. Наконец понял эти великие слова про фильтр: сначала надо ShowAllData и только потом Rows.Count с End(xlUp). Меняю под спойлером, а в файле уже лениво, гы-гы.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Вторник, 26.08.2014, 19:50
 
Ответить
Сообщение
Gustav, классно, но тоже сперва нужно снять фильтры...

Hugo, Игорь, так я там, вроде, снимаю, в смысле снимаете вы с nilem, а я у вас передираю :)
А так любопытно, согласись, при не сильно навороченных выборах/отметках/вводах может быть полезно. Одно меня смущает - нет ли какого-нибудь небесконечного предела при операции создании/удалении листа. Помнится, что-то такое есть при создании копии листа, типа не более 8 тысяч раз с хвостиком, что ли...

P.S. Наконец понял эти великие слова про фильтр: сначала надо ShowAllData и только потом Rows.Count с End(xlUp). Меняю под спойлером, а в файле уже лениво, гы-гы.

Автор - Gustav
Дата добавления - 26.08.2014 в 19:23
Sashagor1982 Дата: Вторник, 26.08.2014, 20:51 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Gustav, а Ваш код можно каким либо образом доработать, что б у выбранных товарищей в столбце F вместо "пв" появлялось "о"?
 
Ответить
СообщениеGustav, а Ваш код можно каким либо образом доработать, что б у выбранных товарищей в столбце F вместо "пв" появлялось "о"?

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 20:51
Hugo Дата: Вторник, 26.08.2014, 21:33 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Ну в крайнем случае можно и туда словарь подключить, как я сделал, ну или просто обойтись поиском по диапазону.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНу в крайнем случае можно и туда словарь подключить, как я сделал, ну или просто обойтись поиском по диапазону.

Автор - Hugo
Дата добавления - 26.08.2014 в 21:33
nilem Дата: Вторник, 26.08.2014, 22:29 | Сообщение № 17
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
...что б у выбранных товарищей в столбце F вместо "пв" появлялось "о"

попробуйте так:
[vba]
Код
Private Sub CommandButton1_Click()    'Ok button
Dim i&
If ListBox1.ListIndex = -1 Then MsgBox "Nothing", 64: Exit Sub
With ListBox1
     For i = 0 To .ListCount - 1
         If .Selected(i) Then Cells(.List(i, 1), 6) = "î"
     Next i
End With
Unload Me
End Sub
[/vba]
в файле - зеленая кнопка
с Dialog Sheet - интересная вещь.
К сообщению приложен файл: DialogSheet.zip (31.7 Kb)


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение
...что б у выбранных товарищей в столбце F вместо "пв" появлялось "о"

попробуйте так:
[vba]
Код
Private Sub CommandButton1_Click()    'Ok button
Dim i&
If ListBox1.ListIndex = -1 Then MsgBox "Nothing", 64: Exit Sub
With ListBox1
     For i = 0 To .ListCount - 1
         If .Selected(i) Then Cells(.List(i, 1), 6) = "î"
     Next i
End With
Unload Me
End Sub
[/vba]
в файле - зеленая кнопка
с Dialog Sheet - интересная вещь.

Автор - nilem
Дата добавления - 26.08.2014 в 22:29
Sashagor1982 Дата: Вторник, 26.08.2014, 23:23 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
nilem, объясните пожалуйста чуть код, где надо заменить что бы окно заполнялось допустим только фамилия и имя?
 
Ответить
Сообщениеnilem, объясните пожалуйста чуть код, где надо заменить что бы окно заполнялось допустим только фамилия и имя?

Автор - Sashagor1982
Дата добавления - 26.08.2014 в 23:23
nilem Дата: Среда, 27.08.2014, 09:06 | Сообщение № 19
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Все дело в массиве Х в Private Sub UserForm_Initialize()
вот здесь
[vba]
Код
With ActiveSheet
     If .FilterMode Then .ShowAllData
     x = .Range("A5:F" & .Cells(Rows.Count, 1).End(xlUp).Row).Value
End With
[/vba]
мы переносим в массив Х значения из диапазона ячеек A5:F57 (нижняяя граница определяется динамически)

а в этом цикле заполняем выходной массив y (который потом станет списком для Листбокса):
[vba]
Код
For i = 1 To UBound(x)
     If x(i, 6) = "пв" Then
         k = k + 1
         y(1, k) = x(i, 1)
         y(2, k) = i + 4
     End If
Next i
[/vba]
смотрим строчку y(1, k) = x(i, 1), где
x(i, 1) - это элемент массива на пересечении i-той строки и 1-го солбца (там, где ФИО полностью)
если нужна только фамилия, то это будет x(i, 2); если только отчество, то x(i, 4)


Яндекс.Деньги 4100159601573
 
Ответить
СообщениеВсе дело в массиве Х в Private Sub UserForm_Initialize()
вот здесь
[vba]
Код
With ActiveSheet
     If .FilterMode Then .ShowAllData
     x = .Range("A5:F" & .Cells(Rows.Count, 1).End(xlUp).Row).Value
End With
[/vba]
мы переносим в массив Х значения из диапазона ячеек A5:F57 (нижняяя граница определяется динамически)

а в этом цикле заполняем выходной массив y (который потом станет списком для Листбокса):
[vba]
Код
For i = 1 To UBound(x)
     If x(i, 6) = "пв" Then
         k = k + 1
         y(1, k) = x(i, 1)
         y(2, k) = i + 4
     End If
Next i
[/vba]
смотрим строчку y(1, k) = x(i, 1), где
x(i, 1) - это элемент массива на пересечении i-той строки и 1-го солбца (там, где ФИО полностью)
если нужна только фамилия, то это будет x(i, 2); если только отчество, то x(i, 4)

Автор - nilem
Дата добавления - 27.08.2014 в 09:06
Sashagor1982 Дата: Среда, 27.08.2014, 10:27 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 288
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Спасибо, отличная программа hands
 
Ответить
СообщениеСпасибо, отличная программа hands

Автор - Sashagor1982
Дата добавления - 27.08.2014 в 10:27
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!