При создании 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
При оптимизации скорости работы инструмента столкнулся с тем, что при росте числа строк в 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 бит)?
Столкнулся с такой проблемой: при запуске макроса на 32 битном офисе в excel выскакивает ошибка "Недостаточно памяти или ресурсов...". Каким образом, можно очистить оперативную память? сразу скажу, что переход на 64-битный офис невозможен: 32битный офис позволяет подрубаться к sql, но переход на 64битный офис не позволяет по той же строке подключения подрубиться к sql. да и много макросов нужно будет переписать, чтобы работать на 64 битном офисе. поэтому вариант только один: задать программно очистку памяти.
Пытаюсь написать Для этого воспользовался макросом с 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) в сводной таблице. Интересует именно общая концепция того, как это делается. Читал Уоккенбаха, но там не нашел того что мне нужно.
В идеале хотелось бы, чтобы я мог проставить "галочки" на тех значениях, которые мне нужны. Но так как по умолчанию фильтр устроен таким образом, что на всех элементах проставлены уже "галочки", то я пробовал задавать обратное условие: Мне нужно выбрать все даты, которые меньше "16/12/2018". Тогда я прописывал, что если значение больше или равно "16/12/2018", то в таком случае необходимо присвоить свойству visible константу false.
Идея моего способа заключалась в следующем: снять все галочки и поставить только на первом pivotitem. После чего задать условие что можно выделять сразу несколько pivotitems и уже если условие выполняется ставить галочку на нужном pivotitem. В конце с первой pivititem галочку убрать. Но условие работает как-то некорректно. Не могу понять в чем ошибка.
Буду очень благодарен, кто скинет русскоязычный гайд или подскажет кодом как это можно сделать. ссылка на файл вместе с макросом ниже. В макросе есть комментарии, где именно мне нужна помощь.