Как найти несколько строк, используя range.value? - PullRequest
2 голосов
/ 31 января 2020

Я пытался использовать диапазон («A1: I1»). Значение, чтобы найти несколько строк в первой строке, однако это показывает, что ошибка «несоответствие». Что я здесь не так сделал? Есть ли другой способ сделать это?

enter image description here

Dim sht as worksheet

Set sht = ThisWorkbook.Sheets("Result")

If sht.range("A1:I1").value = " Voltage" and sht.range("A1:I1").value = " Time"     ,<---------error 'mismatch' occurs here  

call powerandtime

Ответы [ 3 ]

1 голос
/ 31 января 2020

Проблема в том, что вы сравниваете массив значений с одним значением. В случае такого небольшого массива вы можете использовать некоторые Application.Methods. Другой вариант - использовать Range.Find для фактического Range объекта. Я продемонстрирую оба ниже:


Приложение. Методы

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Result")
Dim arr As Variant

With Application
    arr = .Transpose(ws.Range("A1:I1").Value)
    If .Count(.Match(Array("Voltage", "Time"), arr, 0)) = 2 Then
        Call PowerAndTime
    End If
End With

End Sub

Что происходит здесь .Match вернет массив из двух элементов. Он либо вернет значение ошибки в массив, если «напряжение» или «время» не найдены, либо вернет значение цифра c, когда будет найден один из них. Тогда .Count будет подсчитывать числа c значений в этом возвращенном массиве, и только если счет будет равен 2, это когда оба значения присутствуют в вашем начальном диапазоне.

Примечание: .Match нужен 1D-массив, поэтому .Transpose в начале.


Range.Find

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Result")
Dim rng1 As Range, rng2 As Range

Set rng1 = ws.Range("A1:I1").Find("Voltage", lookat:=xlWhole)
Set rng2 = ws.Range("A1:I1").Find("Time", lookat:=xlWhole)

If Not rng1 Is Nothing And Not rng2 Is Nothing Then
    Call PowerAndTime
End If

End Sub

Таким образом, только когда "Voltage" и "Time" найдены как значения xlWhole в пределах указанного вами диапазона c, он будет продолжать вызывать PowerAndTime.

0 голосов
/ 31 января 2020

Вы можете попробовать:

Sub test()

    Dim arrStrings As Variant
    Dim i As Long, Counter As Long
    Dim rng As Range

    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1:I1")
    Counter = 0

    arrStrings = Split("Time,Electric", ",")

    For i = LBound(arrStrings) To UBound(arrStrings)

        If Not rng.Find(arrStrings(i), lookat:=xlWhole) Is Nothing Then

            Counter = Counter + 1
            GoTo NextIteration

        End If

NextIteration:

    Next i

    If Counter = UBound(arrStrings) + 1 Then

        Call PowerAndTime

    End If

End Sub
0 голосов
/ 31 января 2020
Sub testMatchBis()
Dim sh As Worksheet, rng As Range, voltPos As Long, timePos As Long
Dim rngBis As Range, arrBis as Variant

 Set sh = ActiveSheet ' use please your sheet here
 Set rng = sh.Range("A1:I1")
 voltPos = IsMatch(rng, "Voltage")
 timePos = IsMatch(rng, "Time")
 If voltPos <> 0 And timePos <> 0 Then
    Set rngBis = sh.Columns(voltPos)
    Set rngBis = Union(rngBis, sh.Columns(timePos))
    arrBis = rngBis.Value 'the both columns content will be input in an array
    rngBis.Select 'both columns will be selected. Of course, you need to determine
         'only part of the comumn keeping values (their last row) and limit the range
    'Call call powerandtime 'You must know what this sub must do...
 Else
    MsgBox "(At least) one of your searched strings could not be found in the range..."
 End If
End Sub

    Private Function IsMatch(rng As Range, strS As String) As Long
        On Error Resume Next
        IsMatch = WorksheetFunction.Match(strS, rng, 0)
        If Err.Number <> 0 Then
            Err.Clear: On Error GoTo 0
            IsMatch = 0
        End If
        On Error GoTo 0
    End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...