Вычтите значения из разных мест на двух листах - PullRequest
2 голосов
/ 09 марта 2012

Идеальное решение для этого было бы в VBA, а не в формуле, потому что мне нужно, чтобы первый лист сбрасывался каждый раз, поэтому формула перезаписывается.*

Я хотел бы иметь код VBA, который будет обновлять Sheet2, вычитая "Продано" на Sheet1 из "Счета" на Sheet2.Результат будет выглядеть примерно так:

Sheet2 (Count)

Item#   Count
1020    1027
1021    99
1022    53
1023    128
1024    1
1025    971
1026    987

Мне удалось выяснить несколько кодов, но я никогда не смогу заставить их соответствовать.И Sheet1 будет заставлять пользователей вставлять информацию с веб-сайта, поэтому поиск будет основываться на номере товара, а не на столбце A.

Я думаю, что лучше всего сделать перезагрузку, чтобы убедитьсяЯ не испортил, начав в неправильном направлении.У кого-нибудь есть идеи, с чего начать?

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Другой способ использования Vlookup

Надеюсь, это то, что вы пытаетесь?

ПРОВЕРЕНО И ИСПЫТАНО

Option Explicit

Sub Sample()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim ws1LastRow As Long, ws2LastRow As Long, i As Long
    Dim SearchRange As Range

    Set ws1 = Sheets("Sheet1")
    ws1LastRow = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row

    Set SearchRange = ws1.Range("A1:B" & ws1LastRow)

    Set ws2 = Sheets("Sheet2")

    With ws2
        ws2LastRow = .Range("A" & .Rows.Count).End(xlUp).Row

        For i = 2 To ws2LastRow
            On Error Resume Next
            If Not IsError(Application.WorksheetFunction.VLookup(.Range("A" & i).Value, SearchRange, 2, False)) Then
                .Range("B" & i).Value = .Range("B" & i).Value - _
                Application.WorksheetFunction.VLookup(.Range("A" & i).Value, SearchRange, 2, False)
            End If
            On Error GoTo 0
        Next i
    End With

    '~~> Clear Sheet1 for next input
    ws1.Cells.ClearContents

    '~~> Clean Up
    Set SearchRange = Nothing
    Set ws1 = Nothing
    Set ws2 = Nothing
End Sub

SNAPSHOT

enter image description here

FOLLOWUP

Чистка, которую вы делаете в данный момент, не является правильной.Если я выполняю очистку вручную, лист должен выглядеть следующим образом?

enter image description here

Также, если вы заметили, что числа сохраняются в виде текста или имеют пробелы.Vlookup завершится с ошибкой в ​​этих сценариях.

enter image description here

В таком случае я рекомендую следующее

1) Вам необходимо иметьмакрос в местах, который более эффективно очищает ваши данные для ввода

2) Либо вы перемещаете "SKU" перед "QTY", а затем используете Vlookup ИЛИ , используйтеАльтернативный метод.

3) Если вас интересует альтернативный метод, см. ( Раздел 4 ) по этой ссылке

http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

0 голосов
/ 09 марта 2012

Проблема может быть решена с помощью простого кода, например:

For sht2 = 2 To 8 ' Sheet2 rows
For sht1 = 2 To 4 ' Sheet1 rows
If Cells(sht2, 1).Value = Sheet1.Cells(sht1, 1).Value Then
Cells(sht2, 2).Value = Cells(sht2, 2).Value - Sheet1.Cells(sht1, 2).Value
End If
Next
Next

От 2 до 8 строк в Sheet2 и от 2 до 4 строк в Sheet1 основаны на приведенном примере. Однако количество строк в каждом листе, т. Е. В листе данных о продажах и листе данных о запасах, может быть записано с помощью метода Cells.End, как показано в:

For sht2 = 2 to sheet2.Cells(2,2).End(XlDown).Row +1 ' for Sheet2 rows
For sht1 = 2 to Sheet1.Cells(2,2).End(XlDown).Row +1 ' for Sheet1 rows

Приведенный выше цикл повторяет все ячейки, содержащие данные, и вычитает запас с помощью оператора If

0 голосов
/ 09 марта 2012

Формула метода:

  1. На листе 2 в C2 положить эту формулу

    = ЕСЛИ (НОМЕР (МАТЧ (A2, Лист1! A: A, 0)), B2 - VLOOKUP (A2, Лист1! A: B, 2, 0), B2)

  2. Скопируйте эту формулу в набор данных
  3. Скопировать набор новых данных в C2: C ???
  4. Нажмите на B2 и выберите Изменить> Специальная вставка> Значения
  5. Очистить столбец C ... все готово

Макро метод (тот же подход)

Sub UpdateSheet2()
Dim LR As Long

With Sheets("Sheet2")
    LR = .Range("A" & .Rows.Count).End(xlUp).Row
    With .Range("C2:C" & LR)
        .Formula = "=IF(ISNUMBER(MATCH(A2, Sheet1!A:A, 0)), B2 - VLOOKUP(A2, Sheet1!A:B, 2, 0), B2)"
        .Offset(, -1).Value = .Value
        .Value = ""
    End With
End With

End Sub
...