MS Excel 2010 MAXIFS эквивалент в пользовательской форме VBA - PullRequest
0 голосов
/ 17 октября 2018

Я создал пользовательскую форму Excel, чтобы упростить ввод данных новых строк в реестр контрактов.У меня есть поле, которое автоматически генерирует новый уникальный номер контракта путем поиска наибольшего номера в списке номеров контрактов (столбец A), а затем добавляет 1. Эта формула отлично работает:

Me.tbContractNumber = Application.WorksheetFunction.Max(Sheet1.UsedRange.Columns(1)) + 1

I сейчаснеобходимо добавить критерии IF, чтобы отфильтровать любые номера контрактов МЕНЬШЕ, чем "2018000"Я разработал, как это сделать в обычной книге Excel с использованием MAXIFS, но, очевидно, MAXIFS не доступна в VBA?

Может ли кто-нибудь предложить эквивалентный код VBA для приведенной ниже формулы Excel?Заранее благодарим!

=MAXIFS(A2:A500,A2:A500,"<2018000")+1

EDIT Наши рабочие компьютеры работают под управлением 2010 года и не позволяют мне добавлять библиотеку объектов MS Office 16.0, поэтому функция MAXIFS не будет работать.Я могу заставить работать следующую формулу массива, но я никогда не использовал формулу массива в VBA.Может ли кто-нибудь предложить код VBA, эквивалентный приведенной ниже формуле Excel?Заранее благодарю!

{=MAX(IF(A:A<2018000,A:A)) +1}

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

... но MAXIFS, по-видимому, недоступна в VBA .В VBA ее нет, но если вы добавите библиотеку объектов Excel 16.0 (вторая на скриншоте) в свой проект, вы сможете получить к ней доступ следующим образом:

Application.WorksheetFunction.MaxIfs 'Only in Excel
Excel.WorksheetFunction.MaxIfs       'Any host of VBA - Excel, Access, Word

enter image description here

Библиотека добавляется по умолчанию, если вы работаете в Excel.Что касается «перевода» рабочей формулы из Excel в VBA, проверьте это:

https://stackoverflow.com/a/49363501/5448626

0 голосов
/ 18 октября 2018

Я только что изучил функцию Evaluate!Таким образом, эквивалент формулы массива, которую я хочу использовать, преобразует в VBA в:

Me.tbContractNumber = Evaluate("=MAX(IF(" & "A:A" & "<2018000," & "A:A" & "))+1")
0 голосов
/ 17 октября 2018

Если вы все равно ищете самое большое число, нужно ли отфильтровывать что-либо ниже 2018000?Если у вас есть хотя бы одна запись, равная / превышающая 2018000, ваш конечный результат будет выше независимо от других записей.

Я уверен, что есть более эффективные способы сделать это, но если вы счастливыс:

Me.tbContractNumber = Application.WorksheetFunction.Max(Sheet1.UsedRange.Columns(1)) + 1

, затем попробуйте:

me.tbContractNumber = Application.WorksheetFunction.MaxIfs(Sheet1.UsedRange.Columns(1), Sheet1.UsedRange.Columns(1), ">" & 2018000) + 1
...