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

Страницы: 1
динамические изменения с параметрами в 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)
 
Всем привет.

При оптимизации скорости работы инструмента столкнулся с тем, что при росте числа строк в 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
проблема с двссыл при создании связанного динамического выпадающего списка
 
Привет, Форумчане.

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

Прошу помочь! файл во вложении.
Спасибо!в
VBA: недостаточно памяти или ресурсов
 
Всем привет.

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

Спасибо. Очень жду помощи!
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
Наверх