Найдите ячейку, используя 2 значения в форме VBA - PullRequest
0 голосов
/ 12 февраля 2019

Моя форма ввода содержит 2 текста, которые соответствуют определенной строке и заголовку столбца моей таблицы.Я хочу использовать 2 выделенных текста в форме, чтобы найти ячейку и отредактировать значение соответствующей ячейки.

1 значения является частью массива в списке (например, расположен в ListBox2.Column (0, 1))

Другое значение из поля со списком (например, cmbName).

Как я могу использовать эти 2 значения, чтобы найти ячейку?Я думал, может быть, индекс / матч будет работать, но это кажется слишком сложным ... любая помощь будет оценена - спасибо!

Я попытался сделать двойной цикл for, чтобы найти столбец, но я не могу понять,как найти правильный ряд.

For m=27 To finalcol

    For n = 0 to ListBox2.ListCount - 1
    If ListBox2.Column(0,n) = Trim(ThisWorkBook.Worksheets("Masterlist").Cells(1,m).Text) Then
    MsgBox ("Matched!")
    End If 
    Next n
Next m

Я получаю "Совпадение!"вывод, но я не уверен, как добиться следующего шага.Является ли этот подход принципиально ограниченным?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Если вы хотите использовать двойной цикл for, это будет что-то вроде:

Public Sub Test 

'Loops through all items in Listbox2'
For n = 0 to ListBox2.ListCount - 1
  FindCell ListBox2.List(n)
Next

End Sub

Private Sub FindCell (lstValue As String)

'Sets the ws As a variable we can use'
Dim ws as Worksheet
Set ws = ThisWorkBook.Worksheets("Masterlist")

Dim ColumnLetter as String

'Find the last non-blank cell in row 1
lCol = Cells(1, Columns.Count).End(xlToLeft).Column

'Loops through each cell in Row 1'
For Each cell In ws.Range("A1:A" & lCol)
  If cell.Value = lstValue Then 'Checks if the cell value is equal to the item we passed in from the ListBox'
    ColumnLetter = Split(Cells(1, cell.Column).Address, "$")(1) 'To use Worksheet.Range below, we need to find the column letter'
    'Find the last non-blank cell in column A(1)
    lRow = Cells(Rows.Count, cell.Column).End(xlUp).Row 'Goes from the bottom of the file up to the first cell that contains a value and stores the row # as a variable'
    For Each cellCol in ws.Range(ColumnLetter & "2:" ColumnLetter & lRow) 'Now we need to check each cell in the row for the value in the combo box'
      If cellCol.Value = cmbName.Value Then
        Messagebox ("Matched")
      End If
    Next
  End If
Next

End Sub

Дайте мне знать, как это происходит:)

0 голосов
/ 12 февраля 2019

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

Я составил лист, который выглядит следующим образом ...

enter image description here

...Затем я добавил в эту матрицу именованный диапазон с именем rngDataSet .

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

Public Sub FindCell(ByVal rngDataSet As Range, ByVal strRowHeader As String, ByVal strColHeader As String, ByVal varNewValue As Variant)
    Dim objCell As Range, objColCell As Range, objRowCell As Range

    ' Find the column header
    For Each objCell In rngDataSet.Rows(1).Cells
        If UCase(Trim(objCell.Text)) = UCase(Trim(strColHeader)) Then
            Set objColCell = objCell
            Exit For
        End If
    Next

    ' Find the row header
    For Each objCell In rngDataSet.Columns(1).Cells
        If UCase(Trim(objCell.Text)) = UCase(Trim(strRowHeader)) Then
            Set objRowCell = objCell
            Exit For
        End If
    Next

    If objColCell Is Nothing Or objRowCell Is Nothing Then
        MsgBox "Either 1 or both of the supplied headers were not found.", vbCritical, "Error"
    Else
        rngDataSet.Worksheet.Cells(objRowCell.Row, objColCell.Column) = varNewValue
    End If
End Sub

Public Sub DoFindCell()
    Dim strRowHeader As String, strColHeader As String

    strRowHeader = InputBox("Row Header ...", "Row Header", "Row Header ")
    strColHeader = InputBox("Column Header ...", "Column Header", "Col Header ")

    FindCell Sheet1.Range("rngDataSet"), strRowHeader, strColHeader, “New Value”
End Sub

Надеюсь, это поможет.

«DoFindCell» существует только для вызова логики, которую следует заменитьпо вашим собственным значениям списка / поля со списком.

0 голосов
/ 12 февраля 2019

Сначала вы можете найти строку, соответствующую cmbName, а затем столбец, как вы уже сделали:

    ' Find the row corresponding to cmbName
    For r=2 To ThisWorkBook.Worksheets("Masterlist").UsedRange.Rows.Count
        If cmbName = Trim(ThisWorkBook.Worksheets("Masterlist").Cells(r,1).Text)
           therow=r
        End if
    Next r

    ' Find the column corresponding to ListBox2 column 0:
For m=27 To finalcol
        For n = 0 to ListBox2.ListCount - 1
            If ListBox2.Column(0,n) = Trim(ThisWorkBook.Worksheets("Masterlist").Cells(1,m).Text) Then
                If ListBox2.Selected(n)
                    ThisWorkBook.Worksheets("Masterlist").Cells(therow,m).Text = ListBox2.Column(1,n)
                End If 
            End If 
        Next n
    Next m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...