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

Страницы: 1
динамические изменения с параметрами в UserForms
 
Nordheim, благодарю!
динамические изменения с параметрами в UserForms
 
Всем привет!

При создании UserForms столкнулся с тем, что при привязке кнопок к написанным процедурам с параметрами, один из которых является название листа, возникает следующая проблема: в случае если я хочу изменить название листа, то мне приходиться менять соответствующий параметр в каждой процедуре, которая привязана к кнопке.

Ниже две процедуры, которые при нажатии на соответствующие кнопки удаляют или создают лист в книге(CommandButton1_Click, CommandButton2_Click).
Если я хочу изменить название удаляемого/создаваемого листа с "Main" на "Главный лист", то мне необходимо это сделать в двух процедурах (CommandButton1_Click, CommandButton2_Click).

Хотелось бы изменить всего лишь в одном месте. Как это можно реализовать? Подскажите, пжл, как подойти к решению этой проблемы?
Спасибо!

Код
'кнопка удаления существующего в книге листа
Private Sub CommandButton1_Click()
Call SheetDeleter("Main")
End Sub

'кнопка создания несуществующего в книге листа
Private Sub CommandButton2_Click()
Call SheetCreator("Main")
End Sub

'Процедура удаления листа
Sub SheetDeleter(ByVal pSheetName As String)

If ExistSheetWithThatName(pSheetName) Then
    Application.DisplayAlerts = False
    ThisWorkbook.Sheets(pSheetName).Delete
    Application.DisplayAlerts = True
End If

End Sub

'Процедура создания листа
Sub SheetCreator(ByVal pSheetName As String)

If Not ExistSheetWithThatName(pSheetName) Then
    ThisWorkbook.Sheets.Add.Name = pSheetName
End If

End Sub
Изменено: Nikita1994 - 22.02.2021 12:50:24
Долгая передача данных из recordset в массив методом Getrows (VBA)
 
ZVI, благодарю. Попробую. Если сработает - отпишусь!
Долгая передача данных из recordset в массив методом Getrows (VBA)
 
Всем привет.

При оптимизации скорости работы инструмента столкнулся с тем, что при росте числа строк в recordset время передачи данных методом getrows в массив увеличивается.
Код
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset

With con
    .Provider = "..."
    .ConnectionString = "..."
    .Open
End With

QueryText= "select * from table"

rs.Open QueryText, con

Dim x As Variant
x = rs.GetRows      ' <- проблемная часть кода
С запросами, которые возвращают пару тысяч строк, проблем нет. Передача в массив происходит за 1с.
Проблемы возникают при 30к-100к строк.

Пробовал сначала выгружать на отдельный лист через CopyFromRecordset и после считывать данные в массив.
Такой вариант мне не очень нравится чисто стилистически, хотя при этом время работы макроса сокращается.
В случае отсутствия каких-либо альтернатив, конечно, вернусь к нему.

Подскажите, пжл:

1. Есть ли возможность и как оптимизировать эту часть кода таким образом, чтобы сократить время передачи данных из recordset в массив до пару сек?
   На текущий момент время = 300с.
2. Ускорит ли операцию передачи данных из recordset в массив смена версии excel с 2010(32 бит) на 2016(64 бит)?

Спасибо!
Изменено: Nikita1994 - 13.02.2021 17:48:53
проблема с двссыл при создании связанного динамического выпадающего списка
 
AnnaAnna,
кстати вот хорошая идея. спасибо. Почему-то не догадался.
БМВ, большое спасибо. То что нужно!
проблема с двссыл при создании связанного динамического выпадающего списка
 
vikttur, а есть аналог? или как можно решить данную проблему? кроме умных таблиц
Изменено: Nikita1994 - 18.03.2019 01:09:54
проблема с двссыл при создании связанного динамического выпадающего списка
 
Привет, Форумчане.

Создал динамический список (
Код
смещ($A$1;1;0;счетз($A:$A)-1;1)
), дал ему имя( Специалисты). в ячейку G1 добавил выпадающий список (Специалисты, менеджеры и т.д.).
В ячейку H1 добавил связанный список:
Код
двссыл($G$1)
. Почему-то если задавать динамический диапазон двссыл не срабатывает в выпадающем списке.

Прошу помочь! файл во вложении.
Спасибо!в
VBA: недостаточно памяти или ресурсов
 
Всем большое спасибо за Помощь)
Ничем не помогли) увидел только то, что умничали)
но все равно спасибо за отклик)))  
VBA: недостаточно памяти или ресурсов
 
Юрий М, vikttur, я должен спрашивать у вас разрешения как мне обращаться к другим людям? я никого не оскорблял. а способ обращения это мой личный выбор. вас спрашивать я не буду)))
Михаил может не отвечать мне) если его не устраивает мое обращение к нему.  
VBA: недостаточно памяти или ресурсов
 
vikttur, БМВ, ребят, в макросе нет ничего особенного. я бы выложил, но файлик большой. облаками не пользуюсь.

в макросе выгружаются данные через sql. дальше пару строк аля
Код
range("A1").currentregion.copy, range(...).select, range("A1").pastespecial ...

в таком стиле действий много. в итоге на строчке columns("C").insert макрос багается. там 26 тыс строк это не так много. На сишарпе память автоматически чистится. на плюсах ее нужно чистить. но так или иначе там есть для этого команды. Скорее всего есть и на вба.

БМВ, насчет установки 64 битного: если ты когда нибудь работал в компании, то должен понимать, что многие макросы писались другими людьми до твоего прихода и переустановка офиса может привести к новым багам. если просят помощи именно в поиске определенного метода то если знаешь этот метод - напиши его и приложи пример пжл. а писать советы которые никак не помогут не нужно. по делу пжл.

Спасибо за отклик)))
VBA: недостаточно памяти или ресурсов
 
Всем привет.

Столкнулся с такой проблемой:
при запуске макроса на 32 битном офисе в excel выскакивает ошибка "Недостаточно памяти или ресурсов...". Каким образом, можно очистить оперативную память? сразу скажу, что переход на 64-битный офис невозможен: 32битный офис позволяет подрубаться к sql, но переход на 64битный офис не позволяет по той же строке подключения подрубиться к sql. да и много макросов нужно будет переписать, чтобы работать на 64 битном офисе. поэтому вариант только один: задать программно очистку памяти.

Спасибо. Очень жду помощи!
UDF: ВПР, который согласно приоритету тянул бы нужное значение. 
 
artyrH,подошло вроде. Спасибо. Но для второго кода товара выдает ошибку.

я решил это немного по другому:
Код
=ЕСЛИОШИБКА(ЕСЛИОШИБКА(ВПР(A2;ЕСЛИ((I:I="ПУШ")*(G:G=A2);G:H);2;0);ВПР(A2;ЕСЛИ((I:I<>"Отгрузка")*(G:G=A2);G:H);2;0));ВПР(A2;ЕСЛИ((I:I="Отгрузка")*(G:G=A2);G:H);2;0))
UDF: ВПР, который согласно приоритету тянул бы нужное значение. 
 
Цитата
Dima S написал:
Dima S
это небольшой пример из той ситуации, которая у меня возникла на работе. А вообще такой ВПР мне необходим для очень большого файла, в котором куча столбцов и от порядка следования элементов в этих столбцах зависят другие макросы и файлы. А также сам принцип работы этого файла. Поэтому менять что-либо в этом файле я не хочу. Не знаю с какими последствиями столкнусь.
Цитата
tolikt написал:
Dima S
1) Извиняюсь. Мой косяк. В принципе можно в ячейке B2 в форме вместо "ссылка" вбить цифру 2 и получить нужный ответ.
2) все верно, в этом случае нужно тянуть первый попавшийся контракт. Таких контрактов может быть очень много. я привел в пример всего 2 для удобства и экономии времени.
Вот не знаю как переделать VLOOKUP2. Уверен что есть способы работы с массивами, которые позволяют в самом ВПР фильтровать массив по нужному критерию:
например, если в ячейке C2 вбить следующую формулу:
Код
=ВПР(A2;ЕСЛИ(($J$4:$J$10="ПУШ")*($H$4:$H$10=A2);$H$4:$I$10;ЕСЛИ(($H$4:$H$10=A2)*($J$4:$J$10="Отгрузка");$H$4:$I$10));2;0)

то он будет тянуть нужный контракт ПУШ. Если удалить этот контракт, то есть удалить строку 7 из excel файла, который я скинул, то он будет тянуть контракт Отгрузка. Такая идея подходит мне. Но приоритизация ПУШ, ОТГРУЗКА и ОСНОВНОЙ КОНТРАКТ не совсем правильная. Я не знаю, как задать в формуле с помощью массивов, чтобы он в случае отсутствия ПУШ контракта тянул ОСНОВНОЙ контракт (этот контракт имеет массу вариаций:НОНФУД ПРИКАССА и т.д.). и только после того как нет основного контракта необходимо, чтобы тянулся контракт ОТГРУЗКА.

Цитата
Hugo написал:
Dima S
Слишком мудрено...Макросы вообще не подходят, так как должно все обновляться вместе с нажатием клавиши F9. В принципе прошу не предлагать идеи с макросами, т.к. они не подходят. Если есть какие-нить идеи как это можно замутить с помощью уже имеющихся функций, то прошу пожалуйста подсказать.
UDF: ВПР, который согласно приоритету тянул бы нужное значение. 
 
Всем привет.

Пытаюсь написать
Для этого воспользовался макросом с excel-planet.
Код
Function VLOOKUP2(Table As Variant, SearchColumnNum As Long, SearchValue As Variant, _
                  N As Long, ResultColumnNum As Long)
    Dim i As Long, iCount As Long
    Select Case TypeName(Table)
    Case "Range"
        For i = 1 To Table.Rows.Count
            If Table.Cells(i, SearchColumnNum) = SearchValue Then
                iCount = iCount + 1
            End If
            If iCount = N Then
                VLOOKUP2 = Table.Cells(i, ResultColumnNum)
                Exit For
            End If
        Next i
    Case "Variant()"
        For i = 1 To UBound(Table)
            If Table(i, SearchColumnNum) = SearchValue Then iCount = iCount + 1
            If iCount = N Then
                VLOOKUP2 = Table(i, ResultColumnNum)
                Exit For
            End If
        Next i
    End Select
End Function
этот макрос тянет n значение из таблицы.
Но проблема как раз в том чтобы определить это n.

Есть три типа контракта: ОСНОВНОЙ(НОНФУД И ПРИКАССА), ПУШ И ОТГРУЗКА. Приоритет следующий:
Если есть ПУШ, то тянем ПУШ КОНТРАКТ, если нет ПУШ КОНТРАКТА-тянем ОСНОВНОЙ КОНТРАКТ, если нет ОСНОВНОГО и ПУШа, то тянем ОТГРУЗКУ.

Если есть какие-нибудь другие идеи как можно решить эту задачу, то прошу подсказать. СРАЗУ ГОВОРЮ, ЧТО СОРТИРОВКА И ПРОЧИЕ СПОСОБЫ С ДОБАВЛЕНИЕМ СТОЛБЦОВ И ИЗМЕНЕНИЕМ ПОРЯДКА МАССИВОВ НЕ ГОДЯТСЯ!

СПАСИБО!
Проблема выбора значений по условию в фильтре сводной (Pagefield) с помощью VBA
 
Добрый день.

Прошу помочь, если кто знает, как можно выставить условный фильтр(pagefield) в сводной таблице. Интересует именно общая концепция того, как это делается. Читал Уоккенбаха, но там не нашел того что мне нужно.

В идеале хотелось бы, чтобы я мог проставить "галочки" на тех значениях, которые мне нужны. Но так как по умолчанию фильтр устроен таким образом, что на всех элементах проставлены уже "галочки", то я пробовал задавать обратное условие:
Мне нужно выбрать все даты, которые меньше "16/12/2018". Тогда я прописывал, что если значение больше или равно "16/12/2018", то в таком случае необходимо присвоить свойству visible константу false.

Идея моего способа заключалась в следующем: снять все галочки и поставить только на первом pivotitem. После чего задать условие что можно выделять сразу несколько pivotitems и уже если условие выполняется ставить галочку на нужном pivotitem. В конце с первой pivititem галочку убрать. Но условие работает как-то некорректно. Не могу понять в чем ошибка.

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

Благодарю.
файл с макросом и данные
Страницы: 1
Наверх