Использование функции VLookup для поиска ячейки для изменения ее значения - PullRequest
0 голосов
/ 28 января 2020

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

Первая половина кода работает нормально. Он успешно обновляет заказ # и вставляет его в Book1 из Book2. У меня возникают проблемы при обновлении ячейки в столбце «статус» таблицы с соответствующим порядком #, который был просто вставлен в рабочую книгу, либо в 1, либо в 2. У меня есть таблица, отформатированная так, чтобы пустая ячейка была красной (заказ не активен), 1 = желтый (заказ открыт) и 2 = зеленый (заказ выполнен).

Я попробовал приведенный ниже код, используя "IF", если счетчик заказов был равен 0, потому что он будет сброшен перед вставкой нового номера заказа. ПРИМЕЧАНИЕ : заказы не могут быть выполнены в том порядке, в котором они перечислены, поэтому это должен быть какой-то тип поиска. Я не могу просто найти последнюю пустую ячейку в столбце "status".

Обновить * FIGUED IT OUT! Код ниже теперь работает на случай, если кто-нибудь еще столкнется с этой веткой!

Спасибо всем в комментариях ниже.

Private Sub CommandButton1_Click()
   Dim wbEntry As Workbook
   Set wbEntry = ThisWorkbook
   Dim wbCount As Workbook
   Set wbCount = Workbooks("MO# Count.xlsm")

   wbEntry.Sheets("Sheet1").Range("B3").Copy

   wbCount.Activate
   wbCount.Worksheets("Golf Cart").Range("V5").Select
   ActiveCell.PasteSpecial xlPasteValues

  Dim Fnd As Range
   Set Fnd = Sheets("Golf Cart").Range("A:A").Find(Sheets("Golf Cart").Range("V5").Value, , , xlWhole, , , False, , False)
   If Not Fnd Is Nothing Then
      Set Fnd = Fnd.Offset(0, 2)
   End If

   Fnd.Value = 1


   ActiveWorkbook.Save

   wbEntry.Activate

   Application.CutCopyMode = False

   wbEntry.ActiveSheet.Range("H2").Select

End Sub

Book1

Book2

1 Ответ

0 голосов
/ 28 января 2020
  • Если вы пишете What:="MO", то вы ищете буквально текст «MO», а не значение в переменной MO. Чтобы использовать переменную, вы должны написать What:=MO

  • Для каждого объекта Range укажите, в какой книге / рабочей таблице он находится, или Excel может принять другой лист, чем вы думали.

  • Искать только в столбце A wsGolf.Columns("A").Find(…), если вы ищете в Cells, вы ищете в всех ячейках и, конечно, вы всегда найдете то, что вы ищите в Range("V5"), но это не тот результат, который вам нужен.

  • Проверьте, был ли Find успешным: If FoundRef Is Nothing Then. Вы можете только Offset из найденной ячейки, если она действительно была найдена.

  • Никогда не использовать .Select, .Activate или ActiveSheet, всегда указывать рабочие листы по имени для всех Range и Cells объекты et c. См. Как избежать использования Select в Excel VBA .

Так что вам может помочь что-то подобное ниже:

Option Explicit

Private Sub CommandButton1_Click()
    Dim wbEntry As Workbook
    Set wbEntry = ThisWorkbook

    Dim wbCount As Workbook
    Set wbCount = Workbooks("MO# Count.xlsm")

    wbEntry.Worksheets("Sheet1").Range("B3").Copy

    Dim wsGolf As Worksheet
    Set wsGolf = wbCount.Worksheets("Golf Cart")

    wsGolf.Range("V5").PasteSpecial xlPasteValues

    Dim MO As Range
    Set MO = wsGolf.Range("V5")

    Dim FoundRef As Range
    Set FoundRef = wsGolf.Columns("A").Find(What:=MO, After:=wsGolf.Range("A1"), LookIn:=xlValues, LookAt:=xlPart, _
                                     SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

    If FoundRef Is Nothing Then
        MsgBox "'" & wsGolf.Range("V5") & "' was not found.", vbCritical
        Exit Sub
    End If

    FoundRef.Offset(ColumnOffset:=2).Value = 1
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...