Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 27 След.
Фильтрация в словаре
 
bedvit, Ваш вариант правильно фильтрует именно для отсутствия признака, спасибо за алгоритм. НО в моей задаче в любом случае предполагается проверка и формирование массивов для всех 3 вариантов отбора данных и пришлось бы писать отдельный код для проверок по наличию признаков, а я пытаюсь минимизировать объем кода (повторюсь, чисто для самообразования, никто за "лишние" строки по рукам не бьет)
Фильтрация в словаре
 
Спасибо за советы. А у меня самого вот какое решение придумалось. Ранее 3 отдельных массива для последующей выгрузки я планировал получить так:
Код
                    For f = 0 To UBound(Array("|", "|ОК", "|В"))
                        ReDim Arr_data(1 To dicData.Count, 1 To 4)
                            For Each k In Filter(dicData.keys, Array("|", "|ОК", "|В")(f), , 1)
                                If Split(k, "|")(2) = "" Then
                                    j = j + 1
                                    Arr_data(j, 1) = Array("касса", "оплата картой", "возврат")(f) 'признак
                                    Arr_data(j, 2) = Split(k, "|")(1) 'дата расхода
                                    Arr_data(j, 3) = Array("", "", "номер")(f)
                                    Arr_data(j, 4) = dicData.Item(k) 'сумма
                                    Count_dok = Count_dok + 1
                                End If
                            Next k
                                Range(адрес).Resize(UBound(Arr_data, 1), 4).Value = Arr_data
                                j = Empty
                     next f
А позже догадался что 4 строку кода можно тоже сделать многовариантной в зависимости от значения элемента массива:
Код
If Split(k, "|")(2) = Array("", "ОК", "В")(f) Then
По крайней мере эта проблема решается вроде правильно. Двигаюсь дальше :D
R Dmitry, Ваш вариант интересен, но получается, что для моей задачи мне придется формировать 3 отдельных массива ReDim Arr_data1, ReDim Arr_data2...с отдельными переменными для номеров строк этих массивов? Это наверное будет объёмнее моего предполагаемого варианта, но я проверю.
Фильтрация в словаре
 
Доброго времени суток, уважаемые форумчане. Скажу сразу, вопрос больше теоретический, так как готовое решение уже есть, но хочется узнать можно ли решить это иначе. Итак, ситуация: имеется словарь dicData, в ключах которого находится информация типа:
"Яшин О.Р.|03.03.2021|"
"Шестаков Н.В.|05.03.2021|"
"Шестаков Н.В.|05.03.2021|ОК"
"Андреев А.Э.|29.03.2021|В"
Поясню, в конце ключа может быть признак (В или ОК) или не быть ничего и это тоже является признаком для последующего отбора. Для выборки из словаря необходимой информации, пытаюсь применить фильтр:
Код
For Each k In Filter(dicData.keys,  "|ОК", , 1)
...
Для вариантов с признаком понятно: "|ОК" или "|В", а вот можно ли указать для фильтра именно отсутствие признака? Если использовать "|", то фильтр фактически не работает, ведь такой символ есть в каждом ключе (можно конечно проверить ниже в коде If Split(k, "|")(2) = "" Then, но тогда это будет работать только для отсутствия признака, а я пытаюсь "сваять" универсальный вариант с минимумом строк (чисто для самообразования). Сейчас это решается тройным прогоном по массиву данных с советующим условием (нет признака или указан определенный).
P.S. Заранее спасибо всем откликнувшимся
Изменено: OlegO - 15.05.2021 20:20:31
Изменение цвета фона для большого кол-ва ячеек
 
Спасибо большое, Ігор Гончаренко. Ваш вариант оказался для меня более понятным. Варианты от Jack Famous наверно для более серьезных задач и таких же серьезных знаний VBA. Я тоже уже приступил к варианту с циклом, но Ваш код гораздо понятнее и лаконичней моей попытки :oops: Еще раз спасибо.
Изменение цвета фона для большого кол-ва ячеек
 
Спасибо за ссылку, БМВ, завтра буду посмотреть (у меня уже ночь)
Изменение цвета фона для большого кол-ва ячеек
 
Доброго времени суток, уважаемые форумчане. Не могу разобраться с проблемой , помогите, если можно. Итак, по ходу выполнения кода, переменная  cell_close принимает значение типа  "E62,E61,E13,E15,E7,E48,E10..." Таких адресов ячеек в реальном файле сейчас пару тысяч, а будет еще больше. Далее вышеперечисленные ячейки должны закраситься:
Код
Range(cell_close).Interior.Color = 255
НО тут и вылезает проблема. Когда тестил код, таких ячеек было с 10 и все работало правильно, а вот в реальном файле, код начинает ругаться: method range of object worksheet failed В прилагаемом файле переменная содержит 64 адреса и код не работает, стоит уменьшить до 61 и код срабатывает как надо. Я, так понял, превысил какое-то ограничение на кол-во адресов ячеек? Можно ли это как то обойти, если конечно дело в этом? В реальном файле, повторюсь, таких адресов будет несколько тысяч
P.S. Заранее спасибо всем откликнувшимся
Изменено: OlegO - 12.05.2021 20:30:14
Поля страницы при использовании .PrintForm
 
Доброго времени суток, уважаемые форумчане. Подскажите, пожалуйста, можно ли решить данный вопрос. Итак, имеется UserForm, которую необходимо распечатать. Делаю я это через .PrintForm. Все работает, НО форма имеет скорее альбомную ориентацию и поэтому печатается на листе совершенно без полей. Отсюда вопрос: можно ли и как, если можно, указать что лист для печати требуется сориентировать как альбомный (ведь мы не указываем на каком листе это делать, это же некий "виртуальный" лист?), ну и указать параметры полей этого листа. Как это сделать? В прилагаемом файле PDF пример печати формы на виртуальном принтере.

P.S. Заранее спасибо всем откликнувшимся
Печать колонтитулов через VBA
 
Доброго времени суток, уважаемые форумчане. Подскажите, пожалуйста, ответ на небольшой вопрос. Итак, ситуация: необходимо в колонтитул листа вывести информацию (сумму по странице) . Для теста (код выведен на кнопку) я попытался сделать это так:
Код
    Dim HPB As HPageBreak, rngHPB As Range, sum_page As Double, i As Long, j As Long
        If ActiveSheet.Name = "Остатки на складе" Then 'обязательно условие - указание имени листа, иначе VBA пытается выполнить код на др. листах
            With Sheets("Остатки на складе")
'                If .HPageBreaks.Count > 0 Then
                    Set rngHPB = .HPageBreaks(.HPageBreaks.Count).Location
                    i = 8
                    
                    For Each HPB In ActiveSheet.HPageBreaks
                        j = j + 1
                        Set rngHPB = HPB.Location
                        sum_page = Application.Sum(.Range(.Cells(i, 9), .Cells(HPB.Location.Row - 1, 9)))
                        If sum_page > 0 Then
                            i = HPB.Location.Row
                            .PageSetup.RightFooter = Join(Array("Итого по стр. ", j, Space(1), Format(sum_page, "0.00")))
                            .PrintOut From:=j, To:=j, Copies:=1, Collate:=True
                        Else: Exit Sub
                        End If
                    Next HPB
'                End If
            End With
        End If
Может и не совсем оптимально придумал (критика и оптимизация кода приветствуются ;) ), но код работает. НО когда я попытался перенести его в событие Workbook_BeforePrint(Cancel As Boolean), то ничего не вышло, точнее вышло да не так: печатаются все 19 из требуемых (в данном примере) 4 страниц и сумма в колонтитулах ставится одинаковая для всех страниц (по 4 странице). Почему так получается и что надо изменить в коде, чтобы исправить эту ошибку?
Заранее спасибо всем откликнувшимся
Поиск номера позиции элемента, заданного по маске, в массиве
 
Спасибо, Ігор Гончаренко большое. Работает правильно, теперь самое главное научиться самому формировать такие шаблоны
Поиск номера позиции элемента, заданного по маске, в массиве
 
Уважаемые гуру, дык мне то как написать шаблон, чтобы работало правильно?

RAN, пробелы в конце помогли и скорее всего этого будет достаточно, спасибо, но для варианта "дизельное топливо" ответ будет неверен (для обратной последовательности правильно), а если и до начала слова поставить пробел, тогда не пройдет 3 вариант примера
Поиск номера позиции элемента, заданного по маске, в массиве
 
Спасибо и вам, Евгений, но я как раз и пытаюсь (чисто для опыта) избежать цикла. Хотелось бы уточнить вот что: используя регулярные выражения, предложенные Kuzmich, я столкнулся с такой закавыкой. Для проверки кода создадим массив и проверим его значения:
Код
Arr = Array("Бензин АИ-92", "бензиновый очиститель", "Газ углеводородный СПБТ", "керогаз")
Set reFuel = CreateObject("VBScript.RegExp"): reFuel.Global = True: reFuel.ignorecase = True
    reFuel.Pattern = "бензин|топливо|газ" 'шаблон
    For i = 0 To UBound(Arr)
        If reFuel.test(Arr(i)) Then MsgBox "ДА" & " " & Arr(i)
    Next i
Если запустить этот код, то положительный ответ будет для всех 4 слов, входящих в массив, а должен быть только для 1 и 3. Как следует задать шаблон, чтобы (в данном случае) положительный ответ был для любого выражения, содержащего слова: "бензин" ,"топливо" или "газ" в сочетании с любыми другими словами или словом и отрицательный ответ для вариантов типа "керогаз" или "топливный элемент"?
Заранее спасибо за помощь.
Поиск номера позиции элемента, заданного по маске, в массиве
 
Еще раз спасибо за Ваш вариант
Поиск номера позиции элемента, заданного по маске, в массиве
 
Спасибо, Kuzmich. Это регулярные выражения называется, да? А если мне не в функции пользователя надо, а просто в коде,  то по аналогии со словарем надо будет задать имя и указать параметры:?
Поиск номера позиции элемента, заданного по маске, в массиве
 
Доброго времени суток, уважаемые форумчане. Снова обращаюсь в вам за АЛЬТЕРНАТИВНЫМ решением задачи для самообразования. Итак ситуация: имеется массив данных: Arr_fuel = Array("бензин", "топливо", "газ"). Требуется проверить содержимое активной ячейки на совпадение с элементами массива, при этом содержимое ячейки может иметь вид "Газ углеводородный СПБТ", но главное слово здесь это газ, проверять на совпадения нужно по маске и такой вариант должен считаться как совладение. При этом для дальнейших расчетов требуется запомнить номер элемента найденного совпадения в массиве. Сейчас все это РАБОТАЕТ так:
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Arr_fuel = Array("бензин", "топливо", "газ")
    For j = 0 To UBound(Arr_fuel)
        If UCase(ActiveCell.Value) Like UCase("*" & Arr_fuel(j) & "*") Then Exit For
    Next j
                    
    If j <= UBound(Arr_fuel) Then
        x = Range("A1:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
                            
        For i = 1 To UBound(x)
            If UCase(x(i, 1)) Like UCase("*" & Arr_fuel(j) & "*") Then MsgBox "ДА  " & Arr_fuel(j)
        Next i
    Else: MsgBox "НЕТ"
    End If
End Sub
А вопрос у меня такой: можно ли найти значение j БЕЗ использования цикла. Повторюсь, рабочее решение у меня есть, просто хотелось бы узнать о возможности альтернативного решения, чисто для опыта. Если такого решения нет, ничего страшного, нет так нет.
Заранее спасибо всем откликнувшимся
Определить в какой диапазон попадает дата
 
И еще раз огромное спасибо, БМВ, теперь увидел какой тип данных VBA был нужен
Определить в какой диапазон попадает дата
 
Вынужден вновь поднять вопрос, т.к. вылезла проблема. Вариант от БМВ работает полностью правильно, если для сравнения указывать ячейку (E2). Но когда в коде я пытаюсь использовать для этого значение массива x(i.1) = 01.01.2021 (для примера):
Код
dt = "01.01.2021"
MsgBox Application.VLookup(dt, Range("A3:C" & Cells(Rows.Count, 1).End(xlUp).Row), 3, True)
перестает работать, пишет про несовпадение типов 8-0 . И в CDate и в CStr и в DateValue пробовал "обертывать" значение dt, ничего не помогает. Что я делаю не так и как это поправить?
Определить в какой диапазон попадает дата
 
Спасибо за помощь еще раз
Определить в какой диапазон попадает дата
 
Спасибо, БМВ, про ВПР даже не вспомнил. Думал, что при строгом варианте функция и будет искать искомое число, а она получается как то не так ищет?
Определить в какой диапазон попадает дата
 
Доброго времени суток, уважаемые форумчане. Подскажите, пожалуйста, есть ли АЛЬТЕРНАТИВНОЕ решение данной задачи. Итак, имеется массив с датами и соответствующими вариантами ответов:
Дата введенияНомер приказаВариант
25.10.2020 зимняя
01.03.2021 летняя
20.10.2021 зимняя
01.04.2022 летняя
требуется определить в какой диапазон попадает искомая дата (например 01.01.2021) и выдать соответствующий результат. Решаю я это сейчас циклом:
Код
    WS = Range("A2:C" & Cells(Rows.Count, 1).End(xlUp).Row).Value
        For i = UBound(WS) To 1 Step -1
            If WS(i, 1) <= [E2] Then
                MsgBox WS(i, 3): Exit For
            End If
        Next i
Все работает, считает правильно, но возник вопрос или даже скорее "хотелка", можно ли получить тот же результат НЕ ПРИМЕНЯЯ цикл? Просто эти данные нужны при наполнении словаря и "каждоразовый" цикл выглядит немного некрасиво. Повторюсь, готовое рабочее решение есть, хотелось бы знать есть ли другое.
Заранее спасибо всем откликнувшимся
Повторное использование строк кода
 
Да, я так и понял. Смог я доделать и этот вариант, но вот вариант с GoTo на мой сугубо личный взгляд, получился более "читабельный", хотя спасибо, за показанный способ с функциями хотелось бы сказать не меньшее.
Повторное использование строк кода
 
До меня пока вот что дошло, все что мы запишем в скобках после имени функции, те аргументы она и сможет использовать, правильно?
Повторное использование строк кода
 
Доброго времени суток, уважаемые гуру. Решил все-таки попробовать добить возможный вариант с функциями, вариант с GoTo, кстати получился (потребовалось всего 3 перехода), а вот с вариантом от Игоря пока неудача. Объясните, пожалуйста, следующее: вот есть у меня в коде цикл на отбор данных в словарь:
Код
For i = 1 To UBound(x)
    If IsNumeric(Application.Match(x(i, 5), Arr_Mem, 0)) Then 'принадлежность объекта
        If x(i, 5) <> "аренда (к)" And x(i, 5) <> "коммерческий" Then INA_e = Application.VLookup(x(i, 1), [Tenants_dir], [INA_dir].Column, 0)
            key = Join(Array(x(i, 1), x(i, 2), INA_e, x(i, 3), x(i, 4), x(i, 5), x(i, 8), "|")
            If x(i, 6) = 1 Then 'вариант подсчета по данным счетчика
                If Not IsEmpty(x(i, 10)) Or x(i, 5) = "аренда (к)" Then
                    If InStr(x(i, 10), "\") = 0 Then  'если в текущем месяце нет признака нового объекта
                        If InStr(x(i, 9), "\") = 0 Then 'если в предыдущем месяце нет признака нового объекта
                            dicData.Add key, x(i, 10) & "|" & x(i, 9)
                        Else: dicData.Add key, x(i, 10) & "|" & Split(x(i, 9), "\")(1)
                        End If
                    Else: dicData.Add key, Split(x(i, 10), "\")(1) & "|" & Split(x(i, 10), "\")(0)
                    End If
                End If
            ElseIf x(i, 6) = 2 Then 'вариант подсчета по разнице
            ...
            ElseIf x(i, 6) = 3 Then 'вариант подсчета по площади
            ...
        End If
    End If
Next i
массив х к этому моменту уже наполнен, значения Arr_Mem и INA_e  известны. Как я понял предложение от Ігор Гончаренко, я должен "обернуть" этот цикл в Function, поместив конструкцию в отдельный модуль и придумав имя:
Код
Function Fil_dic(Arr_Mem, d)
For i = 1 To UBound(x)
    If IsNumeric(Application.Match(x(i, 5), Arr_Mem, 0)) Then 'принадлежность объекта
        If x(i, 5) <> "аренда (к)" And x(i, 5) <> "коммерческий" Then INA_e = Application.VLookup(x(i, 1), [Tenants_dir], [INA_dir].Column, 0)
            key = Join(Array(x(i, 1), x(i, 2), INA_e, x(i, 3), x(i, 4), x(i, 5), x(i, 8), "|")
            If x(i, 6) = 1 Then 'вариант подсчета по данным счетчика
...
end function

а затем вызвать эту функцию в нужном месте

Код
ad = Fil_dic(Arr_Mem)

но у меня код останавливается на этой строке с ошибкой Argument not optional. Я понимаю, что коду не хватает аргументов, но каких и как и где их следует описать? И вообще, я правильно рассуждаю?

Повторное использование строк кода
 
Спасибо, Ігор Гончаренко за пример, попробую прикрутить к реалу
Повторное использование строк кода
 
Доброго времени суток, уважаемые форумчане. Хотелось бы узнать ответ на чисто теоретический вопрос. Итак, ситуация такая: имеется наполненный словарь с данными и значение переменной, начинаем наполнять итоговый массив:                  
Код
Arr_Mem = Array("аренда", "коммерческий") 'первоначальное значение переменной 

ReDim Arr_data(1 To dicData.Count, 1 To 7) 'формирование итогового массива
      For Each k In dicData.keys
          If IsNumeric(Application.Match(dicData.keys()(1), Arr_Mem, 0)) Then
             j = j + 1
             Arr_data(j, 1) = ...
             Arr_data(j, 2) = ...
             ...
          end if
      next k
       .Cells(4, 1).Resize(UBound(Arr_data), 6).Value = Arr_data 'выгрузка
       Arr_Mem = Array("сторонний", "аренда (к)") 'изменение значения переменной                
далее необходимо заново сформировать и выгрузить массив Arr_data, но для отбора данных использовать новое значение переменной Arr_Mem. Сейчас это организовано повтором кода, но ведь код ПОЛНОСТЬЮ идентичен. Отсюда вопрос, можно ли каким-либо образом использовать этот код повторно. Я додумался только до применения оператора GoTo (сразу после изменения Arr_Mem, ну и метку в соответствующее место выставить), но я многократно видел на форумах негативное отношение к этому оператору и хотелось бы узнать можно ли и как ,решить такой вопрос иначе.
Заранее спасибо всем откликнувшимся
Поиск необходимого значение (города) по 2 и более условиям
 
Цитата
Kuzmich написал:
я не формулист
тогда уж не переводчик с формульного ;)  
Поиск необходимого значение (города) по 2 и более условиям
 
Спасибо и Вам, Kuzmich за ваш вариант. Но это тоже цикл, а вот помочь мне с адаптацией формулы (рабочей!) Вы бы не могли?
Поиск необходимого значение (города) по 2 и более условиям
 
Цитата
Mershik написал:
загнать в массив и сделать цикл
дык так и сделано, все работает и считает правильно, но вот сидит теперь мысль об адаптации Вашего формульного варианта и не убегает 8-0  
Поиск необходимого значение (города) по 2 и более условиям
 
Вы ошибаетесь, Mershik ВПР это VLookup. Не получается почему-то напрямую переписать Вашу формулу в код ,и как место ошибки выявить не пойму
Поиск необходимого значение (города) по 2 и более условиям
 
Мой вариант замены рабочей формулы от Mershik  =ПРОСМОТР(F2;1/(($A$1:$A$7=$F$1)*($B$1:$B$7=$F$2));$C$1:$C$7) на код выглядит так:
Код
q=Application.Lookup(2, 1 / (Range("A1:A7") = Range("F1")) * Range("B1:B7") = Range("F2"), Range("C1:C7"))
но выдает ошибку несовпадения типов. Что сейчас написано те так? Подскажите пожалуйста
Изменено: OlegO - 02.03.2021 11:08:32
Поиск необходимого значение (города) по 2 и более условиям
 
Спасибо, Mershik за Ваш вариант, формула выдает правильный ответ, может, если нетрудно, покажете как то же самое кодом написать?
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 27 След.
Наверх