Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 След.
Поиск по части значения
 
JeyCi, я с Вашей помощью и помощью форума только-только пытаюсь освоить словари, но по крайней мере дальнейшее использование данных, полученных словарем, мне более-менее понятно (в плане необходимости и синтакиса строк кода), а предложение использовать ADO (т.е. как я понял фактически варианта базы данных) для меня слишком сложно и непонятно, а тупо копировать код не хочется :cry:. И к тому же предложеный код, как я писал, почему-то не запускался с кнопки (запускаясь при этом из VBA)
Поиск по части значения
 
Да здравствует форум и его профи!
Все теперь работает.
Остались ма-а-ленкие вопросы, можно сказать шлифовка. Код теперь выглядит так:  
Код
Private ListSourсe()

 Private Sub UserForm_Initialize()
    Application.ScreenUpdating = False
        Dim LastRow_p As Long, i As Long, j As Long, iMassiv As Variant
            LastRow_p = Sheets("Приход").Cells(Rows.Count, [Tovar_prihoda].Column).End(xlUp).Row
            iMassiv = Range(Sheets("Приход").Cells(2, 8), Sheets("Приход").Cells(LastRow_p, 8))
            
            With CreateObject("Scripting.Dictionary")
                For i = 1 To UBound(iMassiv)
                    .Item(iMassiv(i, 1)) = 1
                Next
                    ListSourсe = .Keys 'выгрузка результата
            End With

            For i = 0 To UBound(ListSourсe)
                For j = 0 To UBound(ListSourсe) - 1 - i
                    If ListSourсe(j) > ListSourсe(j + 1) Then
                        Tmp = ListSourсe(j)
                        ListSourсe(j) = ListSourсe(j + 1)
                        ListSourсe(j + 1) = Tmp
                    End If
                Next j
            Next i
                Me.ListBox1.List = ListSourсe

    Application.ScreenUpdating = False
End Sub
 
 
Private Sub Find_position_Change()
    Me.ListBox1.Clear
    For i = 0 To UBound(ListSourсe)
        If ListSourсe(i) Like "*" & Find_position.Text & "*" Then ListBox1.AddItem ListSourсe(i)
    Next
End Sub
а вопросы такие:
1. как правильно и грамотно следует объявить переменную Tmp?
2. есть ли недочеты в части кода сортировки и, если есть, что надо поправить? Заранее спасибо за отклики
 
Поиск по части значения
 
Проверив предложение Андрея, получилось следующее (большая просьба не использовать тяжелые тапки :) за весьма возможные ляпы и ошибки в синтаксисе). Код теперь выглядит так:
Код
Private ListSourсe

Private Sub UserForm_Initialize()
    Application.ScreenUpdating = False
        Dim LastRow_p As Long, i As Long, x As Long, iMassiv As Variant
            LastRow_p = Sheets("Приход").Cells(Rows.Count, [Tovar_prihoda].Column).End(xlUp).Row
            iMassiv = Range(Sheets("Приход").Cells(2, 8), Sheets("Приход").Cells(LastRow_p, 8))
            
            With CreateObject("Scripting.Dictionary")
                For i = 1 To UBound(iMassiv)
                    .Item(iMassiv(i, 1)) = 1
                Next
                    ListSourсe = .Keys 'выгрузка результата
            End With
            
'            ListSourse.Sort
            x = 0
            With Me.ListBox1
            .Clear
                For i = 1 To UBound(ListSourсe)
                .AddItem ""
                .List(x, 0) = ListSourсe(i)
                x = x + 1
                Next
            End With
    Application.ScreenUpdating = False
End Sub

Private Sub Find_position_Change()    
    For i = 0 To UBound(ListSourсe)
        If ListSourсe(i) Like Find_position.Text & "*" Then ListBox1.AddItem ListSourсe(i)
    Next
End Sub


Частично получилось, т.е. в листбокс данные попадают и фильтруются по изменению текстбокса. НО я не понял как организовать сортировку этих данные по алфавиту, покажите пожалуйста.
Поиск по части значения
 
Уважаемые профи, ну покажите пожалуйста как решить этот вопрос. Уж больно хочется до конца доделать файл и передать пользователю
Поиск по части значения
 
Андрей, честное слово, я понимаю, что это небольшой перебор по наглости, но.. , учитывая мои первые шаги по использованию словаря, не могли ли бы Вы показать как вышеописанное будет выглядеть в коде?  Вы пишете о получении уникальных значений. Я так понимаю, что за это отвечают строки:
Код
With CreateObject("Scripting.Dictionary")
                For i = 1 To UBound(iMassiv)
                    .Item(iMassiv(i, 1)) = 1
                Next
...
а вот дальше как реализовывать ваше предложение? Если нетрудно, покажите пожалуйста.
Поиск по части значения
 
Спасибо Андрей VG за Ваш вариант. Скажите, пожалуйста, а на основании словаря нельзя соорудить подобное? Не подумайте, что критикую Ваш проект, но просто я и словари только-только начинаю осваивать, а Вы еще более новую и непонятную для меня фишку предлагаете ... 8-0. (тупо скопировать в реальный файл конечно можно, но хотелось бы хотя бы немного понимать для чего нужна та или иная строка кода.

P.S. И еще, странно конечно но обе формы (и Ваша и моя старая) почему-то не запускаются с кнопки, хотя команды на это на листе прописаны, при этом из VBA по F5 формы стартуют и работает правильно
Изменено: Алексей - 19.01.2016 19:24:15
Поиск по части значения
 
Мне просто кажется, что из 2-х вариантов один из которых использует дополнительный лист, а другой нет, второй более грамотный с точки зрения эргономики работы VBA. ИМХО
Поиск по части значения
 
Цитата
Sanja написал: Выгружать массив
Спасибо Sanja за предложение, но ведь именно от использования "лишнего" листа я и пытаюсь избавиться. Текущий вариант работает полностью правильно, а мне бы хотелось заменить его на более грамотный с использованием словаря
Поиск по части значения
 
Никак пока не получается, в примерах почему-то всегда в качестве диапазона для поиска указывается диапазон на листе, а ведь у меня массив уже сформирован, ведь его надо будет как-то запоминать, правильно? Ведь в работающем варианте фильтр работает и в обратную сторону (я имею ввиду что, если введя несколько букв и получив отфильтрованный список из например 5 позиций, мы уберем последнюю букву, то получим результат более грубого фильтрования)  
Поиск по части значения
 
Признаю ошибку при оформлении названия темы, действительно, надо было наоборот, простите. Но вопроса это не снимает ;)
Поиск по части значения
 
К сожалению этот пример не для моего очень скромного уровня знаний и умений, увы :cry: . Да и сортировка, повторюсь, не главное, фильтрация более нужна
Поиск по части значения
 
Уважаемые профи форума. Подскажите как можно доработать мое творение. Ситуация такая. На листе имеется форма FindPasteForm, предназначенная для поиска/вставки информации. Источником данных для листбокса этой формы является указанный диапазон на скрытом листе. Данные на этот скрытый лист попадают при активации листа Приход, в результате работы простейшего макроса:
Код
Private Sub Worksheet_Activate()
    Dim LastRow_p As Long
        LastRow_p = Sheets("Приход").Cells(Rows.Count, [Tovar_prihoda].Column).End(xlUp).Row
            Sheets("Приход").Range(Cells(2, 8, Cells(LastRow_p, 8).Copy Sheets("Список").Range("A1") 
        With Sheets("Список")
            .Range("A1").CurrentRegion.RemoveDuplicates Columns:=1 
            .Sort.SetRange Range("A1").CurrentRegion 'определение диапазона
            .Sort.Apply 'сортировка
        End With
End Sub
И еще на FindPasteForm имеется возможность по вводу в текстбокс первых букв слова, производить фильтрацию данных в листбоксе.
Я попытался избавиться от скрытого листа и, соответственно, макроса копирования информации, использовав для этого словарь:
Код
Private Sub UserForm_Initialize()
    Application.ScreenUpdating = False
        Dim LastRow_p As Long, i As Long, iMassiv As Variant
            LastRow_p = Sheets("Приход").Cells(Rows.Count, [Tovar_prihoda].Column).End(xlUp).Row 
            iMassiv = Range(Sheets("Приход").Cells(2, 8, Sheets("Приход").Cells(LastRow_p, 8)
            
            With CreateObject("Scripting.Dictionary")
                For i = 1 To UBound(iMassiv)
                    .Item(iMassiv(i, 1)) = 1
                Next
                    Me.ListBox1.List = .Keys 
            End With
    Application.ScreenUpdating = False
End Sub
Данные в Listbox1 оказываются правильные, НО далее начинаются вопросы. Во-первых, как организовать сортировку этих данных по алфавиту? И во-вторых, как организовать фильтрацию данных по вводу букв в текстбокс? (по аналогии с работающим кодом формы FindPasteForm). Второе более важно (очень сильно пользователю облегчает ввод данных возможность такой фильтрации). Заранее спасибо всем откликнувшимся.
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Извините KL за мою туповатость :oops: , мне еще же и место нужно было найти для Вашей подсказки и понять что нужно подставлять
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Уважаемый Hugo, подскажите пожалуйста. А разве в моей конструкциях: Month([A1] & "." & Year([B1])) & Year([B1]) Then или Month(Me.Mes.Value & "." & Year(Date)) & Me.God Then используются не стандартные функции VBA? Мне всегда казалось, что самые стандартные.
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Спасибо kalbasiatka за Ваш вариант. Буду изучать.
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
А ларчик просто открывался, как выяснилось :) . Просто вместо строки
Код
[A11].Resize(UBound(a, 1), UBound(a, 2)).Value = a
следует написать:
Код
Data.List = a
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Цитата
JeyCi написал: попробуйте... без меня
Жаль, что сегодня мы не смогли понять друг друга, но все равно спасибо за отклик
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
JeyCi, когда я упоминал Вашу помощь в написании моего кода, я имел ввиду ту его часть, которая формирует массив. По поводу оптимальности моего алгоритма - давайте попробуем вынести это за скобки. Сейчас мой код формирует массив и может выгрузить его на лист. Как выгружать этот массив на лист Вы показали ранее. Если нетрудно, покажите как поместить этот массив в listbox, именно поместить и все (по крайней мере я надеюсь :oops: )
Изменено: Алексей - 17.01.2016 13:59:41
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
kalbasiatka, возможно мы пока не поняли друг друга. Сейчас данные для listbox  на форме правильно формируются на основе данных из 15 столбца листа Приход, представляющие собой уникальные сцепки из соответствующих данных (номера реестра, даты, номера документа и поставщика). Все отбирается верно, я просто хочу избавиться от этапа формирования этих уникальных данных из сцепленных значений и формировать массив с помощью словаря. И это у меня получается - на листе Тест (можете убедиться). У меня не получается просто поместить полученный массив в listbox. А что касается дальнейшего использования данных из listbox, то тут совсем просто: пользователь отмечает необходимые, указывает кол-во и по нажатию кнопки получает нужные реестры (этого механизма сейчас нет в коде, пришлось вырезать из-за ограничений файла по объему, но в реальном файле это все реализовано)
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
JeyCi, вообще-то мой код основан на Вашей помощи, которую Вы оказали раннее в другой теме. По поводу невычисления - странно, у меня на листе Тест все вычисляется как надо. В ячейке А1 находится название месяца в В1 - год (сделано так по аналогии с формой). Затем отбор по принципу: если номер месяца & год = номеру месяца & год в дате документа, то данные отбираются. Такой отбор (месяц & год) сделан с целью возможности отбора и по варианту месяц & год и только по году. Еще раз повторюсь, сейчас правильно вычисленные данные и в правильной последовательности выгружаются на лист Тест. Вопрос в том как эти вычисленные данные поместить в listbox.
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Цитата
JayBhagavan написал: попробуйте транспорировать содержимое
JayBhagavan, а зачем? Данные в listbox мне нужны именно в таком виде в котором они (данные) сейчас выгружаются на лист. В те же 4 столбца listbox, как и сейчас.
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Что-то пока не выходит никак, listbox остается пустым.
Цитата
KL написал:
нет времени разбираться в коде,
Я конечно могу ошибаться, но мне кажется проблема не должна быть в коде. Повторюсь, сейчас код правильно вычисляет необходимые данные (и в данный момент может выгрузить эти вычисленные данные на лист). Вопрос лишь  в том, как эти данные поместить в listbox на форме
Данные из словаря в Listbox, Поместить данные, рассчитанные с помощью словаря, в Listbox
 
Уважаемые профи форума. С Вашей помощью я смог немного освоить использование словаря, НО вылез следующий вопрос. Сейчас для формирования данных для listbox, находящегося на UserForm6, используется столбец 15 на листе "Приход". Данные в этот столбец попадают в результате работы макроса (также предложенного на этом уважаемом мною форуме :)). Я попытался исключить этап работы этого макроса и сэкономить время ;). На листе "Тест" по нажатию кнопки срабатывает макрос:    
Код
Application.ScreenUpdating = False
        Dim i As Long, j As Long, a As Variant, k As Variant, x As Variant
                
            With CreateObject("Scripting.Dictionary")
                .CompareMode = 1 'если в массиве только числа, то можно без этой строки
                            
                x = Sheets("Приход").Range("B2:N" & Sheets("Приход").Cells(Rows.Count, 8.End(xlUp).Row).Value 'данные в массив

                For i = 1 To UBound(x)
                    If Month(CDate(x(i, 4))) & Year(CDate(x(i, 4))) = Month([A1] & "." & Year([B1])) & Year([B1]) Then 
                        .Item(x(i, 1) & "|" & x(i, 3) & "|" & x(i, 6) & "|" & x(i, 5)) = .Item(x(i, 1) & "|" & x(i, 3) & "|" & x(i, 6) & "|" & x(i, 5)) + x(i, 13)
                    End If
                Next i
                      
                ReDim a(1 To .Count, 1 To 5)
                For Each k In .keys
                    j = j + 1
                    a(j, 1) = Format(Split(k, "|")(0), "П-0000")
                    a(j, 2) = Format(Split(k, "|")(1), "dd.mm.yyyy")
                    a(j, 3) = Split(k, "|")(2)
                    a(j, 4) = Split(k, "|")(3)
                    a(j, 5) = Format(Split(.Item(k), "-")(0), "0.00")
                Next k
                [A11].Resize(UBound(a, 1), UBound(a, 2)).Value = a 'выгрузка результата
            End With
    Application.ScreenUpdating = True
который с помощью словаря правильно и быстро отбирает данные. Как эти полученные данные выгрузить на лист, мне было показано, когда я поднимал тему формирования массивов, и это у меня получается. А вот как поместить эти данные в Listbox я пока не знаю. Будьте добры, покажите как это сделать на примере моей формы (учитывая, что параметр Month([A1] & "." & Year([B1])) & Year([B1]) Then для формы будет выглядеть как Month(Me.Mes.Value & "." & Year(Date)) & Me.God Then. Заранее спасибо всем откликнувшимся.
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Спасибо Hugo, С.М. за Ваши варианты. Буду примерять к реальной задаче.
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Мотя, ситуация в реале намного проще. Повторюсь, задача сейчас имеет формульное решение (используются разные разделители и вышеназванные функции), если я решу переделать формульный вариант на VBA, то благодаря помощи форума в том числе и Вашей, надеюсь смогу это сделать. Просто встретив, по ходу решения предыдущих задач функцию Split и восхитившись краткостью кода при ее применении в сравнении с громоздкостью формул, я решил попробовать найти аналог Split в формулах. В ходе поисков натолкнулся на функцию пользователя из Примеров. Функция очень понравилась своей лаконичностью, но для моей задачи она подходила не полностью. Вот и поднял я эту тему, предполагая, модернизация это реальное дело для профи. Я писал еще в самом первом посте о том, что если модернизация нереальна или очень затруднена, то ничего страшного, просто останется все как есть. Интересовала именно возможность модернизации функции с предполагаемым использованием ее как я описал в посте №11
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Спасибо за Ваш вариант, но с диапазоном и он не хочет работать :(
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Уважаемый Hugo, Вы правы, должно было бы январь и февраль, (просто описАлся :oops:). Вы упомянули про свою функцию, если она не секретная, не могли ли бы Вы ее выложить?
Изменено: Алексей - 13.01.2016 17:55:44
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Результат, в прилагаемом в посте №5 файле, хотелось бы следующий. Выделяем диапазон, скажем D1:D3, вставляем в него формулу массива, использующую модернизированную функцию и в 2 из 3 ячеек получаем ответ январь (2 из 3, т.к. условие выполняется в 2 из 3 ячейках указанного диапазона А1:А3.
Цитата
Hugo написал: почему не написать другую удобную UDF
Потому что, воспользовавшись подсказками с форума и прилагаемым кодом по формированию и выгрузке массива, адаптировать этот код к своей задаче я смогу, а вот написать удобную UDF - увы нет
Изменено: Алексей - 13.01.2016 19:05:43
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Уважаемые форумчане, не могли ли бы Вы использовать для проверки мой файл из поста №5. Там ситуация максимально приближенная к оригинальной задаче, сразу и видно будет получилось или нет. Повторюсь, сейчас решение стандартными формулами имеется, вариант с "чистым" VBA смогу сваять и сам, благо помощь на форуме уже оказана, хотелось бы использовать именно модернизированную функцию с возможностью указания диапазона.
Делим "слипшийся" текст в массиве на части, модернизировать функцию пользователя
 
Что касается названия, то может быть "Делим слипшийся текст в массиве на части"? А по-поводу необходимости, изложу лично свою точку зрения. При работе приходится сцеплять данные в ячейках для отбора уникальных (например имеется 100 строк поставки (дата, номер поставки, поставщик и пр) от одного поставщика и 250 строк от второго. В отчет разумеется должны попасть только 2 строки с данными по поставкам. Сцепляем вышеуказанные данные, сравниваем их на уникальность и, готово). Но полученные уникальные склеенные строки необходимо расцепить. Можно использовать различные разделители и функции ЛЕВСИМВ, ПСТР, ПРАВСИМВ, сталкиваясь с большой длиной формулы и необходимостью использовать символы-разделители, заведомо не встречающиеся в данных пользователя (при этом можно и ошибиться, вдруг поставщик использует в номере документа знак тильды). А можно было бы, при успешной модернизации функции пользователя, использовать 1 символ-разделитель и гораздо более короткую и понятную формулу типа "если 3 порядковый номер вложения равен чему-то, то ...". Разумеется, вышеописанную задачу можно решить целиком на VBA, но ведь и это не панацея, в любом случае для пользователя код много сложнее указания нужного диапазона и др. необходимых данных. Да и структура файла может изменится, добавит/удалит пользователь несколько строк/столбцов (по незнанию) и код сработает некорректно или вообще не сработает. Поэтому по моему личному мнению, использование МОДЕРНИЗИРОВАННОЙ (при реальности этого) функции поможет в таких или похожих случаях.  
Страницы: 1 2 3 4 5 6 7 8 9 След.
Наверх