Функция Excel VBA Match для получения строковых или целочисленных переменных в качестве аргумента Arg1 - PullRequest
0 голосов
/ 10 октября 2018

Следующее является частью более длинного кода.Как я могу объявить Arg1 в Application.WorksheetFunction.Match как целое число или строку?

У меня есть данные (числа) в столбце A и числа с подчеркиванием в столбце B.

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

Однако сопоставление будет работать только в том случае, если я использую Dim userinput As Integer, и это будет соответствовать только в столбце A;или используйте Dim userinput As String, и это будет соответствовать только в столбце B.Объявление Dim userinput As Variant будет работать так же, как Dim userinput As String.

Я мог бы сделать несколько обходных путей, но я хотел бы сначала понять, почему он не может сопоставить его в столбце A при объявлении его в качестве варианта?

Ниже приведены данные, которые у меня есть в столбцах Aи B соответственно.

W   WB
25  25_0
25  25_1
25  25_2
25  25_2
25  25_3
25  25_3
25  25_3
26  26_0
26  26_0
26  26_0
26  26_1
26  26_1

Ниже приведен код:

Sub Return_Row()
Dim userinput As Variant, search_rng As Range

userinput = InputBox("Enter your number")

Set search_rng = ActiveSheet.Range("A:A")

On Error Resume Next
N = Application.WorksheetFunction.Match(userinput, search_rng, 0)
On Error GoTo 0

If N = 0 Then
    Set search_rng = ActiveSheet.Range("B:B")
    N = Application.WorksheetFunction.Match(userinput, search_rng, 0)
End If

MsgBox N
End Sub

Ответы [ 2 ]

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

Вот еще один подход:

Sub foo()
    Dim userinput
    userinput = Application.InputBox("your value", Type:=3)

Select Case TypeName(userinput)
    Case "Double"
        'do the numeric match
    Case "String"
        'do the string match
    Case Boolean
        'Cancel button routine
End Select
End Sub

Application.InputBox в отличие от InputBox (что на самом деле VBA.InputBox), позволяет указывать типы возврата.

Как точки @MathieuGuindonЕсть некоторые преимущества использования VarType вместо TypeName.Ниже приведен код с использованием последнего:

Option Explicit
Sub foo()
    Dim userinput
    userinput = Application.InputBouserinput("your value", Type:=3)

Select Case VarType(userinput)
    Case vbDouble
        'do the numeric match
    Case vbString
        'do the string match
    Case vbBoolean
        'Cancel button was pressed
        Stop
End Select
End Sub
0 голосов
/ 10 октября 2018

Спасибо, Скотт Крейнер, это сработало!Я впервые узнаю о функции CDec.

Этот способ (с использованием функции Val) также работает.

Sub Return_Row()
Dim search_rng As Range

userinput = InputBox("Enter your number")

On Error Resume Next
If IsNumeric(userinput) Then
    userinput = Val(userinput)
    Set search_rng = ActiveSheet.Range("A:A")
    N = Application.WorksheetFunction.Match(userinput, search_rng, 0)
Else
    Set search_rng = ActiveSheet.Range("B:B")
    N = Application.WorksheetFunction.Match(userinput, search_rng, 0)
End If

On Error GoTo 0


MsgBox N
End Sub
...