Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 09:37   #1
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию Список с макросом

Помогите пожалуйста!
Нужно добавить в макрос функцию поиска по первым буквам. Чтобы я начал набирать фамилию, а она сортировалась в списке. Потом после выбора фамилии она добавлялась в ячейку. Список будет большой.Макрос у меня в колонке H, а мне нужно еще в колонки J , R , V . Помогите пожалуйста, уже неделю сижу и ничего не получается.
Вложения
Тип файла: rar Производительность бригады.rar (26.2 Кб, 7 просмотров)
and150382 вне форума Ответить с цитированием
Старый 22.10.2012, 12:23   #2
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

вот одна из моих разработок:

на листе форма заполняется анкета, напротив некот ячеек, например, фамилия - выскакивает окно списка, в котором реализован необходимый вам алгоритм. его можно реализовать и для списка проверки данных с некот ограничениями.

на листе справочники - источники для списков.

попробуйте разобраться, хотя это и не совсем просто - писалось не для образовательных целей, комментариев нету.
Вложения
Тип файла: zip Шаблон для анкет(6.6).xlsm.zip (371.9 Кб, 29 просмотров)
slan вне форума Ответить с цитированием
Старый 22.10.2012, 12:47   #3
slan
Форумчанин
 
Аватар для slan
 
Регистрация: 30.01.2008
Сообщений: 314
По умолчанию

ps
при выделении ячейки запускается программа получения списка с листа справочники:

Код:
Function getlist(s$) As Boolean
    On Error Resume Next
    Dim n&
    With Sheets("Справочники")
        n = Application.Match(Replace(s, "__англ__", ""), .Rows(1), 0)
        If n = 0 Then Exit Function
        lst = .Range(.Cells(2, n), .Cells(65000, n).End(xlUp))
        
    End With
    If lst(0) <> "" Then getlist = True
End Function
загружается нужный исходник списка в глобально объявленный массив lst

при наборе букв в листбоксе, список начинает фильтроваться:

Код:
Sub filt(cb As MSForms.ComboBox)
    s = cb.Text
    If s = "" Then Exit Sub
    Dim w, x, n&, ar, nf&
    ar = Split(Application.Trim(s), " ")
    ReDim rez(1 To UBound(lst))
    For Each w In lst
        nf = -1
        For Each x In ar
            If InStr(1, UCase(w), UCase(x)) > 0 Then
                nf = nf + 1
            End If
        Next
        If nf = UBound(ar) Then
            n = n + 1
            rez(n) = w
        End If
    Next
    If n > 0 Then
        ReDim Preserve rez(1 To n)
    Else
        ReDim rez(1 To 1)
        rez(1) = ""
    End If
    prog = True
    With cb
        .List = rez
        .DropDown
    End With
    prog = False
End Sub
фильтрованный список переписывается в массив rez( и затем передается в листбокс). . здесь реализован алгоритм поиска набора ключевых слов, разделенных пробелами - из списка выбираются значения, содержащие хотя бы одно из ключевых слов( не слов в буквальном понятии, а набора знаков - например, может быть одна буква или пара, а через пробел еще пара, это уже другое "ключевое слово"). легко можно изменить на поиск содержащих все ключевые слова одновременно или не содержащих, а начинающихся на нужную комбинацию..

при очень больших списках можно с каждой набранной буквой фильровать не с исходного массива lst? а уже отфильтрованный rez, который будет становиться все короче и короче. при огромных списках я их индексировал и начинал фильтровать только начиная с ввода не мене 3х символов..

Последний раз редактировалось slan; 22.10.2012 в 12:53.
slan вне форума Ответить с цитированием
Старый 22.10.2012, 14:45   #4
and150382
Форумчанин
 
Регистрация: 19.10.2012
Сообщений: 217
По умолчанию

В необходимые столбцы добавил. А вот как сделать поиск незнаю.
Вот что у меня получилось


Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long, i As Integer
Dim counter As Integer, MyName As String, NameRange As String

If Target.Cells.Count > 1 Then Exit Sub
If Target.Column = "8" Then
If IsEmpty(Target) Then Exit Sub
counter = Len(Target)
MyName = Left(Target, counter)
For i = 1 To Range("People").Count
NameRange = Left(Range("People").Cells(i), counter)
If LCase(NameRange) = LCase(MyName) Then
Application.EnableEvents = False
Application.EnableEvents = True
Exit For
End If
Next
If WorksheetFunction.CountIf(Range("Pe ople"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("People").Cells(Range("People ").Rows.Count + 1, 1) = Target
Range("People").Resize(Range("Peopl e").Rows.Count + 1).Name = "People"
Range("People").Sort Key1:=Range("AD12"), _
Order1:=xlAscending, Header:=xlNo
Else
Target = ""
End If
End If
End If

If Target.Column = "10" Then
If IsEmpty(Target) Then Exit Sub
counter = Len(Target)
MyName = Left(Target, counter)
For i = 1 To Range("People").Count
NameRange = Left(Range("People").Cells(i), counter)
If LCase(NameRange) = LCase(MyName) Then
Application.EnableEvents = False
Application.EnableEvents = True
Exit For
End If
Next
If WorksheetFunction.CountIf(Range("Pe ople"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("People").Cells(Range("People ").Rows.Count + 1, 1) = Target
Range("People").Resize(Range("Peopl e").Rows.Count + 1).Name = "People"
Range("People").Sort Key1:=Range("AD12"), _
Order1:=xlAscending, Header:=xlNo
Else
Target = ""
End If
End If
End If

If Target.Column = "18" Then
If IsEmpty(Target) Then Exit Sub
counter = Len(Target)
MyName = Left(Target, counter)
For i = 1 To Range("People").Count
NameRange = Left(Range("People").Cells(i), counter)
If LCase(NameRange) = LCase(MyName) Then
Application.EnableEvents = False
Application.EnableEvents = True
Exit For
End If
Next
If WorksheetFunction.CountIf(Range("Pe ople"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("People").Cells(Range("People ").Rows.Count + 1, 1) = Target
Range("People").Resize(Range("Peopl e").Rows.Count + 1).Name = "People"
Range("People").Sort Key1:=Range("AD12"), _
Order1:=xlAscending, Header:=xlNo
Else
Target = ""
End If
End If
End If

If Target.Column = "22" Then
If IsEmpty(Target) Then Exit Sub
counter = Len(Target)
MyName = Left(Target, counter)
For i = 1 To Range("People").Count
NameRange = Left(Range("People").Cells(i), counter)
If LCase(NameRange) = LCase(MyName) Then
Application.EnableEvents = False
Application.EnableEvents = True
Exit For
End If
Next
If WorksheetFunction.CountIf(Range("Pe ople"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("People").Cells(Range("People ").Rows.Count + 1, 1) = Target
Range("People").Resize(Range("Peopl e").Rows.Count + 1).Name = "People"
Range("People").Sort Key1:=Range("AD12"), _
Order1:=xlAscending, Header:=xlNo
Else
Target = ""
End If
End If
End If
End Sub

Может кто знает?
and150382 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать односвязный список и вывести его на экран. Из этого списка создать новый список по указанному ниже правилу и новый список San111 Паскаль, Turbo Pascal, PascalABC.NET 1 15.05.2012 22:08
открытие нескольких книг одним макросом и закрытие книг другим макросом kursant95 Microsoft Office Excel 6 27.01.2011 16:54
Список с заглавным звеном, из текстового файла получить список из записей и по нему уже сделать задание Zigfried Помощь студентам 2 04.10.2010 20:29
Раскрывающийся список значений, макросом. Flangini Microsoft Office Excel 13 22.06.2009 17:01
Данные-проверка-список (список на другом листе) Inbox Microsoft Office Excel 7 26.12.2008 01:43