Цикл поиска строки VBA - список соответствия - PullRequest
0 голосов
/ 13 сентября 2018

Вот мои данные:

data

На одном листе есть блоки данных, в столбце F всегда будет «Версия встроенного программного обеспечения контроллера», а версия всегда будет на одну ячейку ниже, а также D, содержащая серийный номер зарядного устройства от двух до осталось от этого.

Мой желаемый результат - это список, в котором собраны все PK ### с их соответствующими версиями прошивки:

PK ### LP2.28
PK ### LP #. ##
...

Sub Check_Firmware()
    Dim S1$, Firmware As Range, x As Range, ws As Worksheet

    ws = Worksheet(Sheet1)
    Search = "Controller Firmware Version"

    With ws

    Set Firmware = Range("F:F" & Cells(Rows.Count, "F").End(xlUp).Row)
    For Each x In Firmware
        If x.Value2 = "Search" Then
            S1 = S1 & " " & worksheet.function(offset(x.Address(0, 0),1,0)
        End If
    Next

      'How to offset and copy the LP2.28 and compile the results?

End Sub

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Можно сделать вот так

Option Explicit

Sub Check_Firmware()
    Dim ArrPK() As String, SearchString As String 'Declare ArrPk as string array 
    Dim Firmware As Range, aCell As Range
    Dim ws As Worksheet
    Dim PkCounter As Long
    Dim LstBox As msforms.ListBox

    Set ws = ThisWorkbook.Sheets("Sheet1")        
    SearchString = "Controller Firmware Version"
    Set LstBox = UserForm1.ListBox1

    PkCounter = 1

    With ws
         'set range that will be source for searching 
        Set Firmware = .Range("F1:F" & .Cells(.Rows.Count, "F").End(xlUp).Row)                          


        For Each aCell In Firmware 'loop each cell of desired range 
            If aCell.Value2 = SearchString Then 'if match found 
                ReDim Preserve ArrPK(1 To 2, 1 To PkCounter) 'redimension array.
                ArrPK(1, PkCounter) = aCell.Offset(1, 0) 'firmware
                ArrPK(2, PkCounter) = aCell.Offset(1, -2) 'serial no
                PkCounter = PkCounter + 1 'increase counter for next match found 
            End If
        Next
    End With

    With LstBox
        .Clear
        .ColumnCount = 2
        .Width = 105
        .ColumnWidths = "50;50"
        For PkCounter = LBound(ArrPK(), 2) To UBound(ArrPK(), 2)
            .AddItem 'add new item to listbox 
              'put values to newly added row 
            .List(PkCounter - 1, 0) = ArrPK(1, PkCounter) 'new row/column 0 
            'PkCounter - 1 because listbox is counted from 0 
            .List(PkCounter - 1, 1) = ArrPK(2, PkCounter)'new row/column 1 
        Next PkCounter
    End With

    UserForm1.Show

End Sub


РЕДАКТИРОВАТЬ:
ReDim Preserve ArrPK(1 To 2, 1 To PkCounter) Это устанавливает новые измерения для массива
Так что теперь у вас есть 2 массива измерения.

Preserve означает, что все значения, которые уже находятся в массиве, останутся там 1 To 2 and 1 to PkCounter - новые размеры для массива. Когда вы найдете больше совпадений, то PkCounter будет расти, как и массив.

Установите точку останова на With LstBox, откройте окно «Местные жители». Вы увидите там свой массив ArrPK и сможете проверить, что внутри него.
Вы можете прочитать больше о массивах в Интернете.

0 голосов
/ 13 сентября 2018

Используйте Option Explicit.Это действительно необходимо, и это поможет вам исправить около 1 ошибки на строку кода.

Это пример:

Option Explicit

Sub TestMe()

    Dim S1 As String, search As String, Firmware As Range
    Dim x As Range, ws As Worksheet

    Set ws = Worksheets("Sheet1")
    search = "Controller Firmware Version"

    With ws
        Set Firmware = .Range("F1:F" & .Cells(.Rows.Count, "F").End(xlUp).Row)
        For Each x In Firmware
            If x.Value2 = search Then
                S1 = S1 & " " & x.Offset(1, -2)
                S1 = S1 & " " & x.Offset(1, 0)
                S1 = S1 & vbCrLf
            End If
        Next
    End With

    Debug.Print S1

End Sub

Изменения:

  • объявлено search переменная;
  • Worksheets вместо Worksheet;
  • . добавлено перед .Range("F1:F"..., поэтому With ws действительно полезен;
  • Range("F:F") вернет весь столбец.Чтобы взять определенное количество клеток, необходимо .Range("F1:F & numberOfCells)..Range("F:F5") будет ошибкой;
  • x.Offset() - это функция, необходимая для получения относительного значения объекта диапазона;
  • когда объект рабочего листа назначен, это делается с помощьюслово set - Set ws = Worksheets("Sheet1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...