Как обновить цикл или обновить цикл в VBA

Поэтому у меня есть этот список, длина которого составляет X строк. Каждый из них имеет 5 столбцов: Оборудование, Тип, Материал, Размер и Цена – это в Листе2.

У меня также есть база данных в sheet1 с тем же заполненным столбцом. Я написал код в VBA, что для каждой строки в Sheet2 я могу заполнить «Оборудование», «Тип», «Материал и размер» и будет искать в базе данных в листе1 сопоставимую цену для этих критериев и в прошлом это под столбцом Price in Sheet2.

Теперь проблема в том, что если я, например, заполняю строки 1, 2 и 3 после друг друга, она дает мне цену, но если позже я захочу изменить переменные в строке 1 или 2, это не изменится / обновить цену, но она по-прежнему работает для строки 3 и вперед.

Как сделать так, чтобы он менял / обновлял цену в строках 1 и 2, если я меняю там переменные.

мой код:

Option Explicit Public r As Long Public Const adOpenStatic = 3 Public Const adOpenKeySet = 1 Public Const adLockReadOnly = 1 Sub cmdSearch_Click() Dim strCriteriaEquipment As String Dim strCriteriaType As String Dim strCriteriaMaterial As String Dim strCriteriaSize As String Dim strSQL As String Dim strSourceTable As String Dim c As Long, LR As Long LR = Cells(Rows.Count, 2).End(xlUp).Row For r = 1 To LR c = 2 With Worksheets("Summary") strCriteriaEquipment = Worksheets("Summary").Cells(r, c).Value strCriteriaType = Worksheets("Summary").Cells(r, c + 1).Value strCriteriaMaterial = Worksheets("Summary").Cells(r, c + 2).Value strCriteriaSize = Worksheets("Summary").Cells(r, c + 3).Value End With Next r strSourceTable = "[DB$" & Replace(Worksheets("DB").Range("SourceData").Address, "$", "") & "]" strSQL = "SELECT [Price] FROM " & strSourceTable & vbNewLine strSQL = strSQL & "WHERE [Equipment]= """ & strCriteriaEquipment & """" & vbNewLine strSQL = strSQL & "AND [Type]=""" & strCriteriaType & """" & vbNewLine strSQL = strSQL & "AND [Material]=""" & strCriteriaMaterial & """" & vbNewLine strSQL = strSQL & "AND [Size]=""" & strCriteriaSize & """;" Dim rstRecordSet As Object 'ADODB.Recordset Dim con As Object 'ADODB.Connection Dim strWorkBookPath As String strWorkBookPath = ThisWorkbook.FullName Set con = CreateObject("ADODB.Connection") Set rstRecordSet = CreateObject("ADODB.RecordSet") con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strWorkBookPath & ";" & _ "Extended Properties=""Excel 8.0;HDR=Yes"";" rstRecordSet.Open strSQL, con, adOpenStatic, adLockReadOnly With Worksheets("Summary") For r = r - 29 To LR c = 5 If Not (rstRecordSet.EOF And rstRecordSet.BOF) Then .Range("ResultTable").Cells(r, c).CopyFromRecordset rstRecordSet Else .Range("ResultTable").Cells(r, c).Value = "Data Not Found!" End If Next r End With rstRecordSet.Close con.Close Set rstRecordSet = Nothing Set con = Nothing strWorkBookPath = vbNullString strSQL = vbNullString strCriteriaEquipment = vbNullString strCriteriaType = vbNullString strCriteriaMaterial = vbNullString strCriteriaSize = vbNullString strSourceTable = vbNullString End Sub Public Function UniqueStringWithDelimiter(varArray As Variant, strDelimiter As String) As Variant Dim varTemp() As Variant Dim lngLoop As Long Dim strConcat As String ReDim Preserve varTemp(0 To 0) varTemp(0) = varArray(0, 0) strConcat = strConcat & varArray(0, 0) For lngLoop = 1 To UBound(varArray, 2) If InStr(1, strConcat, varArray(0, lngLoop), vbTextCompare) = 0 Then strConcat = strConcat & strDelimiter & varArray(0, lngLoop) End If Next lngLoop UniqueStringWithDelimiter = strConcat. strConcat = vbNullString Erase varTemp End Function 

Теперь, чтобы обновлять каждый раз, когда я что-то меняю в Sheet2, я просто написал это:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call cmdSearch_Click End Sub 

Итак, снова мой вопрос: как обновить / изменить цену, если я изменю переменную в строке 1 или строке 2, если строка 3 была последней строкой, которая использовалась в листе.

Это база данных, которую я использую:
Это Datbase, которую я использую

Это Sheet2:
Это Sheet2

1) Одна из ближайших проблем, которые, как я вижу, вызовет вашу проблему (и может быть больше, но у меня нет времени, чтобы вскрыть так много в данный момент), заключается в том, что начальный цикл:

 For r = 1 To LR c = 2 With Worksheets("Summary") strCriteriaEquipment = Worksheets("Summary").Cells(r, c).Value strCriteriaType = Worksheets("Summary").Cells(r, c + 1).Value strCriteriaMaterial = Worksheets("Summary").Cells(r, c + 2).Value strCriteriaSize = Worksheets("Summary").Cells(r, c + 3).Value End With Next r 

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

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

Например:

 For r = 1 to LR c = 2 With Worksheets("Summary") 'code to set criteria End With 'code to download data price 'code to stick data and price in summary tab Next r 

2) Кроме того, убедитесь, что квалифицируйте все свои объекты. Линия

 LR = Cells(Rows.Count, 2).End(xlUp).Row 

могут возвращать разные результаты, если лист, который вы хотите активировать, фактически не активен . Лучше сказать это, например, и отказаться от догадок:

 LR = Worksheets("Summary").Cells(Rows.Count, 2).End(xlUp).Row 

3) Использование Worksheet_SelectionChange будет запускать ваш код каждый раз, когда вы переходите от одного к другому на вашем листе . Если вы хотите только запустить код при изменении критериев в своих данных, вместо этого используйте Worksheet_Change . Вы также можете определить, какие конкретные ячейки будут изменения, также запустит код.

  • Импорт Excel в DataGrid, затем сохранение в базу данных MySQL
  • Соответствие неравных столбцов в excel
  • VB.Net Исключение, как получить строку и столбец ошибок в запросе
  • Как конвертировать данные в форматах excel spreasheet в формат для загрузки в базу данных
  • Использование Excel в качестве базы данных ODBC
  • Экспорт запроса из пользовательского ввода в Excel - видны только части HTML
  • Использование массивов для сравнения и совместного использования данных между несколькими рабочими книгами и рабочими листами
  • Excel разбивает столбец на несколько столбцов без разделителя
  • Сохранение данных из текстового поля в Excel
  • Создайте два столбца, например, тип данных карты в excel
  • Динамический диапазон между пустым строками в Excel
  • Interesting Posts

    Код VBA для прокрутки и компиляции отдельных листов из нескольких книг

    Получить путь к папке из листа для подсчета файлов внутри этой папки в Excel VBA

    Сохранить файл Excel в корневом каталоге проекта

    Как подсчитать количество уникальных ячеек в Excel, которые не содержат определенных символов

    Как обрабатывать «отрицательные» часы в результате моего вычитания?

    Microsoft Excel Countif, когда ячейки содержат уникальные строки, разделенные запятыми

    Ошибка кода в Excel 2003

    Обнаружение соответствия заголовка TextBox / Label в элементе управления

    Excel VBA Solver Loop занимает слишком много времени

    дублировать для каждого блока

    Как написать различные данные для разделения файлов Excel в R

    Как вставить пустую строку в расширенный лист Excel с помощью GemBox?

    Поиск VBA Cell, дающий мне время запуска 13

    Создание выпадающего списка только в том случае, если одна ячейка пуста

    Как получить активный экземпляр Excel?

    Давайте будем гением компьютера.