Vba excel sql like

I am quite new in working with SQL in VBA and can’t seem to get my query working. I searched around in the forums and tried many different solutions but to no avail.

Here is my code:

Sub RequeteClasseurFerme_Excel2007()
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset
Dim CoPo As String

'Définit le classeur fermé servant de base de données
Fichier = ThisWorkbook.Worksheets("Menu").Range("B7").Value
'Nom de la feuille dans le classeur fermé
NomFeuille = "Data"
CoPo = ActiveWorkbook.Worksheets("Menu").Range("B3").Value

Set Cn = New ADODB.Connection

'--- Connexion ---
With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With
'-----------------

'Request
request_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE [" & NomFeuille & "$].[CodePostal] LIKE '" & CoPo & "%'"

Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(request_SQL)

Worksheets("Data2").Range("A1").CopyFromRecordset Rst
'
'... la requête ...
'

'rst.Find
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing

I am pretty sure it’s the like since when I remove it, it does return me all the results.

Stavros Jon's user avatar

Stavros Jon

1,6852 gold badges6 silver badges17 bronze badges

asked Aug 16, 2018 at 12:47

Jomathr's user avatar

4

You should always use parameters:

Sub RequeteClasseurFerme_Excel2007()

Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim cmd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim CoPo As String

'Définit le classeur fermé servant de base de données
Fichier = ThisWorkbook.Worksheets("Menu").Range("B7").Value

'Nom de la feuille dans le classeur fermé
NomFeuille = "Data"
CoPo = ActiveWorkbook.Worksheets("Menu").Range("B3").Value

Set Cn = New ADODB.Connection

'--- Connexion ---
With Cn
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
    .Open
End With
'-----------------

'Request
request_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE [" & NomFeuille & "$].[CodePostal] LIKE ?"


Set cmd = New ADODB.Command
cmd.ActiveConnection = Cn
cmd.CommandText = request_SQL
cmd.Parameters.Append cmd.CreateParameter("@postalCode", adVarChar, adParamInput, 50)

cmd.Parameters("@postalCode").Value = CoPo + "%"

Set Rst = cmd.Execute

Worksheets("Data2").Range("A1").CopyFromRecordset Rst
'
'... la requête ...
'

'rst.Find
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub

answered Aug 16, 2018 at 13:18

Cetin Basoz's user avatar

Cetin BasozCetin Basoz

21.6k3 gold badges29 silver badges38 bronze badges

When you specify HDR=NO; in your connection string, you tell the driver that the Excel sheet contains no Header row. In that case, you cannot access columns by their name (simply because they have no name). In that case, the RecordSet contains pseudo fieldnames like F1, F2...,and you can even use these in a query, eg where [F1] = 'A'". But of course a column like CodePostal is not known and accessing it will throw the error you mentioned in the comments.

I assume, however, that your data has a header row, and in that case, simple change the parameter to HDR=YES;

answered Aug 16, 2018 at 13:18

FunThomas's user avatar

FunThomasFunThomas

20.1k2 gold badges18 silver badges34 bronze badges

Содержание

  1. LIKE Operator
  2. Character Wildcards
  3. Examples
  4. Like operator (Microsoft Access SQL)
  5. Syntax
  6. Remarks
  7. Example
  8. See also
  9. Support and feedback
  10. Оператор Like (Microsoft Access SQL)
  11. Синтаксис
  12. Замечания
  13. Пример
  14. См. также
  15. Поддержка и обратная связь
  16. Оператор Like
  17. Синтаксис
  18. Замечания
  19. Пример
  20. См. также
  21. Поддержка и обратная связь

LIKE Operator

The LIKE operator uses wildcard characters to match patterns in the data.
If the column specified contains a NULL, then the result is undefined

Character Wildcards

Character Access SQL Server
? single character
* zero or more characters
_ single character
% zero or more characters
# single digit [0-9]
[ characters ] single character in a group of characters
[ ! characters ] single character not in a group of characters

[A-Z]#[A-C]
Example — doc_title LIKE (‘&EAFE%’)
If you want to include the underscore character as a character to include in your filter you must use the Escape clause. LIKE «%^_%’ ESCAPE ‘^’» is equivalent to LIKE «%_%»
Search conditions can contain either numbers or literal characters. The «%»and «_» can be used in any combination with literal characters. If you need to match the actual characters «%» or «_» then use the Escape option and prefix them with a backslash ()
Literal characters or strings are in single quotation marks

This works in SQL Server but not in Access since the % is interpreted differently

This works in SQL Server but not in Access

—% in SQL Server means any string of zero or more characters
—% in Access is meant to mean zero or more characters, but doesn’t work

This works in Access but not in SQL Server

This works in Access but not in SQL Server

This works in SQL Server but not in Access since the % is interpreted differently

Examples

—This works in SQL Server but not in Access since the % is interpreted differently

—% in SQL Server means any string of zero or more characters
—% in Access is meant to mean zero or more characters, but doesn’t work

=—this works in SQL Server but not in Access

=—_ in SQL Server means any single character
—_ in Access is meant to mean a single character, but doesn’t work

=—this works in Access but not in SQL Server

—* in SQL Server does not mean anything
—* in Access means zero or more characters

=—this works in Access but not in SQL Server

—# in Access means a single digit character 0-9

—# in SQL Server does not mean anything — you can use % and [0-9] to represent the same thing

=—this works in Access but not in SQL Server

—? in SQL Server does not mean anything

—This works in SQL Server but not in Access since the % is interpreted differently

—% in SQL Server means any string of zero or more characters
—% in Access is meant to mean zero or more characters, but doesn’t work

Источник

Like operator (Microsoft Access SQL)

Applies to: Access 2013 | Access 2016

Compares a string expression to a pattern in an SQL expression.

Syntax

expression Like «pattern«

The Like operator syntax has these parts:

Part Description
expression SQL expression used in a WHERE clause.
pattern String or character string literal against which expression is compared.

Use the Like operator to find values in a field that match the pattern you specify. For pattern, you can specify the complete value (for example, Like «Smith» ), or you can use wildcard characters to find a range of values (for example, ), or you can use wildcard characters to find a range of values (for example, Like «Sm*») .

In an expression, you can use the Like operator to compare a field value to a string expression. For example, if you enter Like «C*» in an SQL query, the query returns all field values beginning with the letter C. In a parameter query, you can prompt the user for a pattern to search for.

The following example returns data that begins with the letter P followed by any letter between A and F and three digits:

The following table shows how you can use Like to test expressions for different patterns.

Kind of match Pattern Match (returns True) No match (returns False)
Multiple characters a*a aa, aBa, aBBBa aBC
ab abc, AABB, Xab aZb, bac
Special character a[*]a a*a aaa
Multiple characters ab* abcdefg, abc cab, aab
Single character a?a aaa, a3a, aBa aBBBa
Single digit a#a a0a, a1a, a2a aaa, a10a
Range of characters [a-z] f, p, j 2, &
Outside a range [!a-z] 9, &, % b, a
Not a digit [!0-9] A, a, &, 0, 1, 9
Combined a[!b-m]# An9, az0, a99 abc, aj0

Example

This example returns a list of employees whose names begin with the letters A through D. It calls the EnumFields procedure, which you can find in the SELECT statement example.

See also

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Оператор Like (Microsoft Access SQL)

Область применения: Access 2013 | Access 2016

Сравнивает строковое выражение с шаблоном в выражении SQL.

Синтаксис

выражение, как «pattern«

Синтаксис оператора Like состоит из следующих частей:

Part Описание
выражение Выражение SQL, используемое в предложении WHERE.
pattern Строковый или символьный строковый литерал, с которым сравнивается выражение .

Замечания

Используйте оператор Like , чтобы найти значения в поле, соответствующее указанному шаблону. Для шаблона можно указать полное значение (например, Like «Smith» ), или использовать подстановочные знаки для поиска диапазона значений (например, ), или использовать подстановочные знаки для поиска диапазона значений (например, Like «Sm*») .

В выражении можно использовать оператор Like для сравнения значения поля со строковым выражением. Например, если ввести Like «C*» в SQL-запросе, запрос вернет все значения полей, начинающиеся с буквы C. В запросе параметров можно запросить у пользователя шаблон для поиска.

В следующем примере возвращаются данные, начинающиеся с буквы P, за которой следует любая буква между A и F и три цифры:

В следующей таблице показано, как использовать like для тестирования выражений для различных шаблонов.

Тип соответствия Pattern Match (возвращает значение True) Нет совпадения (возвращает значение False)
Несколько символов a*a aa, aBa, aBBBa Abc
Ab abc, AABB, Xab aZb, bac
Специальный символ a[*]a a*a Ааа
Несколько символов Ab* abcdefg, abc cab, aab
Один символ a?a aaa, a3a, aBa aBBBa
Однозначная цифра a#a a0a, a1a, a2a aaa, a10a
Диапазон символов [a-z] f, p, j 2, &
За пределами диапазона [!a-z] 9, &% b, a
Не цифра [!0-9] A, a, &, 0, 1, 9
Комбинированный a[!b-m] # An9, az0, a99 abc, aj0

Пример

В этом примере возвращается список сотрудников, имена которых начинаются с букв от A до D. Он вызывает процедуру EnumFields, которую можно найти в примере инструкции SELECT.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Оператор Like

Используется для сравнения двух строк.

Синтаксис

Результат = Шаблон stringLike

Синтаксис оператора Like состоит из следующих частей:

Part Описание
result Обязательный элемент; любая числовая переменная.
строка Обязательный элемент; любое строковое выражение.
pattern Обязательный элемент; любое строковое выражение, соответствующее соглашениям о сопоставлении шаблонов, описанным в разделе «Замечания».

Замечания

Если аргумент string соответствует аргументу pattern, значением result будет являться True; если не соответствует — значением result будет являться False. Если string либо pattern имеет значение Null, result также будет иметь значение Null.

Поведение оператора Like зависит от оператора Option Compare. Методом по умолчанию для сравнения строк для каждого модуля является Option Compare Binary.

Метод Option Compare Binary выдает результат сравнения строк на основе порядка сортировки, выводимого из внутреннего двоичного представления знаков. Порядок сортировки определяется кодовой страницей.

В следующем примере показан типичный бинарный порядок сортировки:

Метод Option Compare Text выдает результат сравнения строк на основе порядка сортировки текста без учета регистра букв, определяемого языковым стандартом системы. Сортировка тех же знаков с использованием метода Option Compare Text дает следующий порядок сортировки:

Встроенное сопоставление шаблона предоставляет универсальное средство для сравнения строк. Возможности сопоставления шаблона позволяют использовать подстановочные знаки, списки знаков или диапазоны знаков в любой комбинации, чтобы сопоставить строки. В следующей таблице представлены знаки, разрешенные для использования в аргументе pattern, и объясняется, чему они соответствуют:

Знаки в pattern Сопоставление в string
? Любой отдельный знак.
* Ноль или больше знаков.
# Любая однозначная цифра (0–9).
[ charlist ] Любой отдельный знак, представленный в charlist.
[ !charlist ] Любой отдельный знак, не представленный в charlist.

Группа из одного или нескольких символов ( charlist ), заключенная в квадратные скобки ([ ]), может использоваться для сопоставления с любым одним символом в строке и может включать практически любой код символов, включая цифры.

Чтобы получить сопоставление для специальных знаков, а именно для левой квадратной скобки ([), вопросительного знака (?), знака номера (#) и звездочки (*), заключите их в квадратные скобки. Знак правой квадратной скобки (]) не может использоваться в рамках группы для сопоставления самому себе, однако может использоваться за пределами группы как отдельный знак.

С помощью дефиса (), разделяющего нижнюю и верхнюю границы диапазона, charlist может использоваться для определения диапазона знаков. Например, приводит к совпадению, [A-Z] если соответствующая позиция символов в строке содержит прописные буквы в диапазоне от A до Z. Несколько диапазонов могут включаться в квадратные скобки без использования каких-либо разделителей.

Значение указанного диапазона зависит от порядка расположения знаков, допустимого во время выполнения (определяется оператором Option Compare и языковыми настройками системы, в которой выполняется код). В примере Option Compare Binary диапазон [A-E] соответствует A, B и E. С параметром Сравнение текста соответствует [A-E] A, a, À, à, B, B, E, e. Данный диапазон не определяет сопоставление для Ê или ê, поскольку символы с надстрочными знаками располагаются по порядку сортировки после символов без надстрочных знаков.

Также имеются другие важные правила для сопоставления шаблона:

  • Восклицательный знак (!) в начале charlist означает, что выполняется сопоставление, если любой знак, кроме знаков, указанных в charlist, будет найден в аргументе string. При использовании вне квадратных скобок восклицательный знак сопоставляется самому себе.
  • Дефис () может отображаться в начале (но после восклицательного знака, если он используется) или в конце charlist для сопоставления самому себе. На любой другой позиции дефис используется для указания диапазона знаков.
  • При задании диапазона знаков они должны отображаться по возрастающему порядку сортировки (от наименьшего к наибольшему). [A-Z] является допустимым шаблоном, но [Z-A] не является.
  • Последовательность [] символов считается строкой нулевой длины («»).

В некоторых языках имеются специальные знаки в алфавите, представляющие два отдельных знака. Например, в нескольких языках используется знак «æ» для представления знаков «a» и «e», когда они отображаются вместе. Оператор Like распознает, что такой отдельный специальный знак и соответствующие два отдельных знака являются эквивалентными.

Когда языки, в которых используются специальные знаки, указываются в языковых настройках системы, отдельный специальный знак в аргументе pattern либо в аргументе string сопоставляется с эквивалентной 2-знаковой последовательностью в другой строке. Аналогичным образом отдельный специальный знак в аргументе pattern, заключенный в квадратные скобки (указанный отдельно, в списке или в диапазоне), сопоставляется с эквивалентной 2-знаковой последовательностью в string.

Пример

В этом примере оператор Like используется для сравнения строки с шаблоном.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

title keywords f1_keywords ms.prod ms.assetid ms.date ms.localizationpriority

Like operator (Microsoft Access SQL)

jetsql40.chm5277589

jetsql40.chm5277589

access

70d2ecef-90d7-aff9-398e-8703fb7dfc6e

06/08/2017

medium

Applies to: Access 2013 | Access 2016

Compares a string expression to a pattern in an SQL expression.

Syntax

expression Like «pattern«

The Like operator syntax has these parts:

Part Description
expression SQL expression used in a WHERE clause.
pattern String or character string literal against which expression is compared.

Remarks

Use the Like operator to find values in a field that match the pattern you specify. For pattern, you can specify the complete value (for example, Like "Smith"), or you can use wildcard characters to find a range of values (for example, ), or you can use wildcard characters to find a range of values (for example, Like "Sm*").

In an expression, you can use the Like operator to compare a field value to a string expression. For example, if you enter Like "C*" in an SQL query, the query returns all field values beginning with the letter C. In a parameter query, you can prompt the user for a pattern to search for.

The following example returns data that begins with the letter P followed by any letter between A and F and three digits:

The following table shows how you can use Like to test expressions for different patterns.

Kind of match Pattern Match (returns True) No match (returns False)
Multiple characters a*a aa, aBa, aBBBa aBC
ab abc, AABB, Xab aZb, bac
Special character a[*]a a*a aaa
Multiple characters ab* abcdefg, abc cab, aab
Single character a?a aaa, a3a, aBa aBBBa
Single digit a#a a0a, a1a, a2a aaa, a10a
Range of characters [a-z] f, p, j 2, &
Outside a range [!a-z] 9, &, % b, a
Not a digit [!0-9] A, a, &, ~ 0, 1, 9
Combined a[!b-m]# An9, az0, a99 abc, aj0

Example

This example returns a list of employees whose names begin with the letters A through D. It calls the EnumFields procedure, which you can find in the SELECT statement example.

Sub LikeX() 
 
    Dim dbs As Database, rst As Recordset 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' Return a list of employees whose names begin with 
    ' the letters A through D. 
    Set rst = dbs.OpenRecordset("SELECT LastName," _ 
        & " FirstName FROM Employees" _ 
        & " WHERE LastName Like '[A-D]*';") 
 
    ' Populate the Recordset. 
    rst.MoveLast 
 
    ' Call EnumFields to print the contents of the  
    ' Recordset. Pass the Recordset object and desired 
    ' field width. 
    EnumFields rst, 15 
    
    dbs.Close 
 
End Sub

See also

  • Access for developers forum
  • Access help on support.office.com
  • Access forums on UtterAccess
  • Access developer and VBA programming help center (FMS)
  • Access posts on StackOverflow

[!includeSupport and feedback]

master-artyom

0 / 0 / 0

Регистрация: 12.06.2015

Сообщений: 66

1

05.11.2017, 12:28. Показов 16253. Ответов 8

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Уважаемые знатоки!
Подскажите пожалуйста, как корректно написать оператор Like в запросе?
Мне нужно, чтобы запрос выдавал все возможные варианты того, что я ищу в столбце myField. Для этого я пишу:

T-SQL
1
SELECT * FROM myTable WHERE myField LIKE '*пример*'

Все работает до того момента, как мне нужно найти, например, такие вхождение «41-2», т.е. с дефисом. Такая запись точно имеется в поле, однако, запрос ничего не выдает. Видимо, дефис как-то иначе воспринимается.
Как это можно исправить?
Спасибо!



0



mobile

Эксперт MS Access

26777 / 14456 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

05.11.2017, 12:43

2

Можно реплейсом удалить дефис

SQL
1
SELECT * FROM myTable WHERE REPLACE(myField, "-", "") LIKE '*412*'

Другой вариант искать также с промежуточным символом

SQL
1
SELECT * FROM myTable WHERE myField LIKE '*412*' OR myField LIKE '*41?2*'

Если «пример» берется из формы

SQL
1
SELECT * FROM myTable WHERE REPLACE(myField, "-", "") LIKE '*' & Forms!ИмяФормы!ИмяПоля & '*'



1



master-artyom

0 / 0 / 0

Регистрация: 12.06.2015

Сообщений: 66

05.11.2017, 13:12

 [ТС]

3

Большое спасибо за ответ!
Вот этот вариант лучшим образом подходит:

T-SQL
1
SELECT * FROM myTable WHERE myField LIKE '*41?2*'



0



Capi

Модератор

Эксперт MS Access

5122 / 2529 / 628

Регистрация: 12.06.2016

Сообщений: 6,749

05.11.2017, 13:14

4

Лучший ответ Сообщение было отмечено master-artyom как решение

Решение

Цитата
Сообщение от master-artyom
Посмотреть сообщение

мне нужно найти, например, такие вхождение «41-2», т.е. с дефисом.
Такая запись точно имеется в поле, однако, запрос ничего не выдает.
Видимо, дефис как-то иначе воспринимается.

Нет, дефис такой же символ, как и прочие.
Он не является для LIKE служебным, как символы ?*#!.
Все нормально распознается:

Visual Basic
1
2
? "123 41-2 9999" LIKE "*41-2*"
True

В запросе тоже — выдает правильно запись таблицы. Проверено.

Ищите другую причину.
Проверьте, например, Asc() символа «-» в поле таблицы.

А ? выдаст записи с любым символом в этом месте. Нужно ли это?



1



0 / 0 / 0

Регистрация: 12.06.2015

Сообщений: 66

05.11.2017, 16:08

 [ТС]

5

Коллеги, прошу прощения за дезинформацию. Действительно, «-» не относится к специальному символу. Все работает корректно вместе с ним. Не понимаю, почему первые 10 тестов у меня ничего не давали. Вопрос снят. Еще раз прошу прощения.



0



шапоклякистка 8-го дня

3674 / 2234 / 391

Регистрация: 26.06.2015

Сообщений: 4,647

Записей в блоге: 1

05.11.2017, 16:28

6

master-artyom, потому что в таблице символов есть по меньшей мере 3 разных символа, которые при беглом чтении могут быть все три восприняты как одно и то же. Они отличаются длиной и расположением в строке (строго по центру или немного выше), но визуально перепутать их очень легко, и есть шансы ввести другой вид «черточки» и не заметить: при определенных настройках автозамены дефис, окруженный пробелами с двух сторон, может запросто быть преобразован в тире.

Поэтому совет

Цитата
Сообщение от Capi
Посмотреть сообщение

Проверьте, например, Asc() символа «-«

очень дельный.

Добавлено через 3 минуты
Для примера: проверьте коды символов в этой строке:



1



9728 / 4908 / 1195

Регистрация: 05.10.2016

Сообщений: 13,817

Записей в блоге: 1

05.11.2017, 23:26

7

Цитата
Сообщение от texnik-san
Посмотреть сообщение

Для примера: проверьте коды символов в этой строке:

Довольно верное замечание!



0



Rikozenit

3 / 3 / 0

Регистрация: 03.08.2015

Сообщений: 156

25.11.2019, 15:31

8

Всем доброго дня! Сегодня убил уйму времени, пока не нашёл вот такую инфу на просторах сети (решил поделиться):

При выполнении SQL запроса из VBA кода, в месте где пишется условие, при использовании сравнения LIKE нужно использовать символ %, а не * когда требуется сравнивать какую то часть текста, а не точное сравнение. При этом если запустить запрос с * например в Access, то он отработает нормально. Если не знать эту особенность, то ошибку можно долго искать в коде.

Правильно : SELECT * FROM table WHERE pole LIKE «%Условие%»
Неправильно : SELECT * FROM table WHERE pole LIKE «*Условие*»

Нашёл вот тут: http://mekap.ru/where-and-like-vba/#comment-51

У меня собственно была строка:

SQL
1
WHERE  (((Присутствующие) LIKE '*" & Fio & "*')

, которая не работала, пока не заменил * на %.



0



Эксперт MS Access

26777 / 14456 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

25.11.2019, 15:43

9

Цитата
Сообщение от Rikozenit
Посмотреть сообщение

При выполнении SQL запроса из VBA кода, в месте где пишется условие, при использовании сравнения LIKE нужно использовать символ %, а не *

И то и другое верно, но область применения зависит от функционала. Если выполняется в DAO, то нужна звездочка «*», если в ADODB, то процент «%»



3



Joe4

Joe4

MrExcel MVP, Junior Admin


  • #2

Welcome to the Board!

There are a few topics you want to look into Filters, Pivot Tables, and Subtotals

Filters are pretty easy, and work much like the «WHERE» clause in SQL. It will just return the records you want.
However, if you want totals or subtotals, then you will probably want to use Subtotals or Pivot Tables in Excel.

Excel’s Help files are a good place to start for details on these things, but there are also many good articles, videos, and tutorials on-line which can be located pretty easily using a Google Search.

  • #3

Welcome to the Board!

There are a few topics you want to look into Filters, Pivot Tables, and Subtotals

Filters are pretty easy, and work much like the «WHERE» clause in SQL. It will just return the records you want.
However, if you want totals or subtotals, then you will probably want to use Subtotals or Pivot Tables in Excel.

Excel’s Help files are a good place to start for details on these things, but there are also many good articles, videos, and tutorials on-line which can be located pretty easily using a Google Search.

Thanks for the reply.

I’m actually looking specifically to do all this as part of a VBA macro without altering the sheet data.

For example, right now I created a dictionary where the keys are the person’s name and their values are the total scores. Now I want to return in a cell the name of the person with the Max score. Not sure how to do that quite yet.

  • #4

Here is one way to get the answer. I’m not sure it will work if there are two occurences of the High Score though. It will just hit the first name…..

Data Looks Like:

Excel 2012
A B
1 Names Scores
2 Mike 55
3 John 66
4 Matt 77
5 Gerald 88
6 John 58

Sheet5

Code:

[COLOR=#0000ff]Sub[/COLOR] GetHighScore()

  [COLOR=#0000ff]  Dim[/COLOR] LastRow[COLOR=#0000ff]             As Long[/COLOR]
[COLOR=#0000ff]    Dim[/COLOR] Rng                 [COLOR=#0000ff]As [/COLOR]Range
    [COLOR=#0000ff]Dim[/COLOR] HighScoreAddress    [COLOR=#0000ff]As String[/COLOR]
    [COLOR=#0000ff]Dim[/COLOR] HighScore           [COLOR=#0000ff]As String[/COLOR]
    
    LastRow = Range("A" & Rows.Count).End(xlUp).Row
    HighScore = WorksheetFunction.Max(Range("B2:B" & LastRow))
    
   [COLOR=#0000ff]   Set[/COLOR] Rng = Range("B2:B" & LastRow).Find(What:=HighScore, _
                           After:=Range("B2"), _
                           LookAt:=xlWhole, _
                           LookIn:=xlValues, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlNext, _
                           MatchCase:=[COLOR=#0000ff]False[/COLOR])
                           
              [COLOR=#0000ff]  If Not [/COLOR]Rng[COLOR=#0000ff] Is Nothing Then[/COLOR]
                    HighScoreAddress = Rng.Address
                    NameVal = Range(HighScoreAddress).Offset(, -1).Address
[COLOR=#0000ff]                End If[/COLOR]
                        
            MsgBox Range(NameVal).Value
              
[COLOR=#0000ff]End Sub[/COLOR]

Last edited: Aug 29, 2014

  • #5

If you change the code to this it will also check for multiple top values:

Code:

[COLOR=#0000ff]Sub[/COLOR] GetHighScore()


[COLOR=#0000ff]    Dim[/COLOR] LastRow           [COLOR=#0000ff]As Long[/COLOR]
   [COLOR=#0000ff] Dim[/COLOR] Rng               [COLOR=#0000ff]As[/COLOR] Range
    [COLOR=#0000ff]Dim [/COLOR]HighScoreAddress  [COLOR=#0000ff]As String[/COLOR]
[COLOR=#0000ff]    Dim[/COLOR] HighScore         [COLOR=#0000ff]As String
    Dim[/COLOR][COLOR=#000000] CountMaxVal [/COLOR][COLOR=#0000ff]      As Integer[/COLOR]
    
    LastRow = Range("A" & Rows.Count).End(xlUp).Row
    HighScore = WorksheetFunction.Max(Range("B2:B" & LastRow))
    
   [COLOR=#0000ff]   Set[/COLOR] Rng = Range("B2:B" & LastRow).Find(What:=HighScore, _
                           After:=Range("B2"), _
                           LookAt:=xlWhole, _
                           LookIn:=xlValues, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlNext, _
                           MatchCase:=[COLOR=#0000ff]False[/COLOR])
                           
            [COLOR=#0000ff]    If Not [/COLOR]Rng [COLOR=#0000ff]Is Nothing Then[/COLOR]
                    HighScoreAddress = Rng.Address
                    NameVal = Range(HighScoreAddress).Offset(, -1).Address
[COLOR=#0000ff]                End If[/COLOR]
                
            CountMaxVal = Application.WorksheetFunction.CountIf(Range(Cells(2, 2), Cells(LastRow, 2)), CInt(HighScore))
            
    [COLOR=#0000ff]    If[/COLOR] CountMaxVal <= 1 [COLOR=#0000ff]Then[/COLOR]
            MsgBox Range(NameVal).Value, vbInformation, "Top Value Calculator"
[COLOR=#0000ff]        Else[/COLOR]
            MsgBox "Multiple Top Values", vbInformation, "Top Value Calculator"
[COLOR=#0000ff]        End If[/COLOR]

[COLOR=#0000ff]End Sub[/COLOR]

  • #6

If you change the code to this it will also check for multiple top values:

Code:

[COLOR=#0000ff]Sub[/COLOR] GetHighScore()


[COLOR=#0000ff]    Dim[/COLOR] LastRow           [COLOR=#0000ff]As Long[/COLOR]
   [COLOR=#0000ff] Dim[/COLOR] Rng               [COLOR=#0000ff]As[/COLOR] Range
    [COLOR=#0000ff]Dim [/COLOR]HighScoreAddress  [COLOR=#0000ff]As String[/COLOR]
[COLOR=#0000ff]    Dim[/COLOR] HighScore         [COLOR=#0000ff]As String
    Dim[/COLOR][COLOR=#000000] CountMaxVal [/COLOR][COLOR=#0000ff]      As Integer[/COLOR]
    
    LastRow = Range("A" & Rows.Count).End(xlUp).Row
    HighScore = WorksheetFunction.Max(Range("B2:B" & LastRow))
    
   [COLOR=#0000ff]   Set[/COLOR] Rng = Range("B2:B" & LastRow).Find(What:=HighScore, _
                           After:=Range("B2"), _
                           LookAt:=xlWhole, _
                           LookIn:=xlValues, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlNext, _
                           MatchCase:=[COLOR=#0000ff]False[/COLOR])
                           
            [COLOR=#0000ff]    If Not [/COLOR]Rng [COLOR=#0000ff]Is Nothing Then[/COLOR]
                    HighScoreAddress = Rng.Address
                    NameVal = Range(HighScoreAddress).Offset(, -1).Address
[COLOR=#0000ff]                End If[/COLOR]
                
            CountMaxVal = Application.WorksheetFunction.CountIf(Range(Cells(2, 2), Cells(LastRow, 2)), CInt(HighScore))
            
    [COLOR=#0000ff]    If[/COLOR] CountMaxVal <= 1 [COLOR=#0000ff]Then[/COLOR]
            MsgBox Range(NameVal).Value, vbInformation, "Top Value Calculator"
[COLOR=#0000ff]        Else[/COLOR]
            MsgBox "Multiple Top Values", vbInformation, "Top Value Calculator"
[COLOR=#0000ff]        End If[/COLOR]

[COLOR=#0000ff]End Sub[/COLOR]

Thanks!

Понравилась статья? Поделить с друзьями:
  • Vba excel sql connect
  • Vba excel project locked
  • Vba excel split что это
  • Vba excel rgb colors
  • Vba excel private sub что это