Excel VBA AdvancedFilter через пользовательскую форму Проблемы - PullRequest
0 голосов
/ 13 декабря 2018

Я использую Microsoft Office Pro Plus 2016. У меня есть таблица (ListObject), которая является связанной таблицей Sharepoint, и пользовательская пользовательская форма, которая содержит 4 комбинированных списка (Region, Country, IMType и LOB).

Логика, которую я пытаюсь применить, заключается в том, что пользовательская форма представляет себя пользователю, на заднем плане она «нефильтрует» список.Затем конечный пользователь может выбрать критерии в пользовательской форме, нажав кнопку ОК, он вводит значения комбинированных списков в часть «критериев» листа и затем выполняет расширенный фильтр.Пример изображения ниже

UserForm i'm using

Ниже приведен снимок экрана листа, который я пытаюсь отфильтровать

: ListObject example

по общему признанию, попробовав МНОЖЕСТВО различных способов вырезать индейку, я заблудился с различными кодами, которые я написал, чтобы обойти это, некоторые из которых я вставилниже, но очень хотелось бы, чтобы сияющий рыцарь в метрической броне отвел меня от безумия.В настоящее время у меня есть две проблемы:

1) Я получаю сообщение «Переменная объекта или С переменной блока не установлено», и форма инициализируется этим битом кода.По какой-либо причине?

With FilterForm
.StartUpPosition = 0
.Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
.Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height)
.Show
End With

Инициализация почтовой формы и после нажатия «ОК» на пользовательской форме запускается следующий код:

Private Sub cmdOK_Click()

Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

Call AutoFilterCheck

Application.ScreenUpdating = False
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ""

'    Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter _
'        Action:=xlFilterInPlace, CriteriaRange:=Range("AI6:BK7"), Unique:=False
Call AdvancedFilteronSPData

Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ComboBox1.Value
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ComboBox2.Value
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ComboBox3.Value
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ComboBox4.Value

'    Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter _
'        Action:=xlFilterInPlace, CriteriaRange:=Range("AI6:BK7"), Unique:=False
Call AdvancedFilteronSPData

Unload Me
Application.ScreenUpdating = True
End Sub

Код VB, на который он ссылается (AutoFilterCheck и AdvancedFilteronSPData)ниже, и для меня это была поздняя попытка обойти тот факт, что код автофильтра просто не работает.Они наклеены ниже для справки:

Sub AutoFilterCheck()

Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

With ActiveSheet
        .AutoFilterMode = False
        .Range("MIMSPData").AutoFilter
    End With

End Sub

И последний

Sub AdvancedFilteronSPData()
Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("MIMSPData")

    Range("MIMSPData").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AI6:BK7"), Unique:=False
End Sub

Короче, я подумал, не могли бы вы рассмотреть, что я пытаюсь сделать (т.е. выполнитьрасширенный фильтр в моей таблице списков объектов, основанный на критериях комбинированных списков, и посоветуйте, где мне не хватает трюка, так как я занимался этим 2 дня и, кажется, ходил кругами.

Ваша помощь будеточень ценится, с Рождеством всех.

1 Ответ

0 голосов
/ 13 декабря 2018

Так что мне удалось поиграться с кодом, и с тех пор я @ смог исправить проблему, с которой столкнулся, поэтому хотел опубликовать свой обновленный код здесь.Спасибо Имрану за его комментарий об ошибке UserForm, которая у меня была.

Разница, казалось, заключалась в том, как я ссылался на объект Table (вместо того, чтобы принять «записанную» версию Excel по умолчанию (которая была

Range("'MIM Policy Governance Tracking'!MIMSPData").AdvancedFilter

, я изменил ее на:

Range("MIMSPData[#All]").AdvancedFilter

Это, похоже, решило мою проблему. Если, однако, кто-нибудь там сможет найти лучший способ сделать это, я буду открыт к предложениям. Я только работаю неполный рабочий день в VBA, поэтому приветствую гурувведите здесь. Надеюсь, что это может помочь другим.

Private Sub cmdOK_Click()

'Clear existing entries cell values
Application.ScreenUpdating = False
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ""
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ""

'Filter to show all
Range("MIMSPData[#All]").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AJ6:AM7"), Unique:=False

'Input new cell values based on current criteria
Sheets("MIM Policy Governance Tracking").Range("AJ7").Value = ComboBox1.Value
Sheets("MIM Policy Governance Tracking").Range("AK7").Value = ComboBox2.Value
Sheets("MIM Policy Governance Tracking").Range("AL7").Value = ComboBox3.Value
Sheets("MIM Policy Governance Tracking").Range("AM7").Value = ComboBox4.Value

'Filter to show updated results
Range("MIMSPData[#All]").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Range("AJ6:AM7"), Unique:=False

Application.ScreenUpdating = True

Unload Me
End Sub
...