VBA, min / max ... или другие математические функции - PullRequest
0 голосов
/ 08 октября 2018

Я много гуглил, но хочу быть уверен:

Действительно ли мне нужно использовать "Application.WorksheetFunction.Max" для функции max?

Если да, могу лиЯ сокращаю это?Есть ли издержки, если я перетяну эту длинную конструкцию в функцию?

Редактировать: Я удалил тег vba-access.

Ответы [ 5 ]

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

После того, как я вижу, что мой вопрос неясен, я отвечаю на него сам.

Некоторые люди не знали, имею ли я в виду EXCEL или ДОСТУП.Я виноват в том, что дал неправильный тег.Это был чистый вопрос VBA.

Вторая ошибка: я предоставлял EXCEL-Way (Worksheet) для моего вопроса.Но это был чистый вопрос VBA.

Я не могу удалить вопрос, но мне нравится это делать.

Итак, ответ:

Public Function max(x, y As Variant) As Variant
  max = IIf(x > y, x, y)
End Function

Public Function min(x, y As Variant) As Variant
   min = IIf(x < y, x, y)
End Function

... делает свою работу.

Извините, что потратил наше время!

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

Здесь нет контекста, но если вы в основном зацикливаетесь и находите максимум для каждой пары, то вы делаете неправильно, особенно если вы находитесь в базе данных Access.Делать то же самое, что и SQL-запрос, гораздо быстрее и проще для разработки и оптимизации, чем пытаться найти хакерские обходные пути VBA, которые вынуждают вас работать в режиме RBAR *, который является анафемой для всех баз данных.

Итак, сначала я бы внимательно посмотрел на то, что пытается делать код, и если это в основном просто совокупности данных, которые нужно агрегировать, вам следует использовать не VBA, а SQL.

Черт, если вы хотите быть ленивым, Access уже предоставляет вам DMax функцию домена (хотя они проблематичны, потому что они неизменно используются в VBA и, следовательно, используются в режиме RBAR).Вы действительно просто хотите, чтобы SQL выполнил всю работу и получил окончательный набор записей, который операция превращается в прямое чтение / экспорт / отображение без какой-либо дополнительной работы.

Если вы долго и усердно смотрели на код ивходные данные не из источника данных, они не запускаются в цикле (прямо или косвенно), тогда вы, конечно, можете покончить с какой-нибудь доморощенной функцией VBA или ссылаться на библиотеку Excel (предпочтительно с поздним связыванием).


1) R ow- B y- Agonizing - R ow - итерации - это крутов императивных языках.Это не так круто в декларативных языках, таких как SQL.

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

У меня есть 3 идеи для вас,

  1. , вы можете пропустить «Приложение» и просто написать «Worksheetfunction.Max» практически при любых обстоятельствах, используя VBA.

  2. Вы можете установить переменную как «Функция листа», т. Е.

    Dim foo As Object
    Set foo = Application.WorksheetFunction
    foo.Max(MyArray)
    
  3. Вы можете создать функцию или вспомогательный модуль в модуле, который выполняет только это.и иметь длинную входную информацию, не уверен, что это стоит затраченных усилий, и это может значительно замедлить код.

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

При доступе у вас нет этих функций рабочего листа, единственный способ сделать это, если вы либо A сами их кодировали, либо B импортировали библиотеку Excel в свой проект доступа.Лично я бы пошел с A, так как если вы импортируете библиотеку Excel, вы застряли на точной версии Excel, в которую вы импортировали.

Быстрый и грязный пример будет

Public Function Max(ByVal A As Variant,ByVal B As Variant) As Variant
    If A > B Then
        Max = A
    Else
        Max = B
    End If
End Function

Это требует небольшого TLC, чтобы вы не пытались сравнивать наборы записей или другую чепуху и выдавали ошибку.

РЕДАКТИРОВАТЬ: я полагаю, вы также можете получить библиотеку Excel, если вы поздно связали ссылкучтобы преуспеть, вот и третий вариант.

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

Я нашел два более коротких способа кодирования:

Один

Sub MaxTest()
    Dim A As Integer, B As Integer
    A = Sheet1.Range("$A$1").Value
    B = Sheet1.Range("$A$2").Value
    Sheet1.Range("$B$1").Value = WorksheetFunction.Max(A, B)
End Sub

Два

Sub MaxTest()
    Dim A As Integer, B As Integer
    A = Sheet1.Range("$A$1").Value
    B = Sheet1.Range("$A$2").Value
    Sheet1.Range("$B$1").Value = IIf(A > B, A, B)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...