Как вычесть значение, введенное в одну ячейку из другой через VB в Excel? - PullRequest
0 голосов
/ 07 сентября 2018

У меня следующая проблема.

Мне нужно создать «Inventory Chart» в Excel для работы, которая выглядит как показано ниже.

Фактическая диаграмма содержит еще немного информации, но это важные.

+---+--------+-------+---+--------+------------+
|   |   A    |   B   | C |   D    |     E      |
+---+--------+-------+---+--------+------------+
| 1 | Item   | Stock |   | Item   | Withdrawel |
| 2 | Item 1 | 32    |   | Item 4 | 5          |
| 3 | Item 2 | 228   |   | Item 3 | 20         |
| 4 | Item 3 | 121   |   | Item 1 | 10         |
| 5 | Item 4 | 93    |   |        |            |
| 6 | Item 5 | 44    |   |        |            |
+---+--------+-------+---+--------+------------+
  • Столбец A содержит товары, которые есть в наличии
  • Столбец B содержит текущий запас. Его можно изменить вручную или с помощью VB, как я объясню позже (здесь я борюсь)
  • Колонка C это просто проставка
  • В столбце D пользователь вставляет элемент, который он / она снял со склада
  • В столбце E пользователь вводит сумму, которую он / она снял
  • Столбцы D и E предназначены для бесконечного понижения, поэтому у вас есть постоянная история изъятий

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

Но поскольку B также можно изменить вручную (например, для инвентаризации), здесь я не могу использовать формулу.

Я хотел бы добавить, что я почти ничего не знаю о VB. Мой единственный опыт работы с VB был со школы, когда нам приходилось работать с Visual Studio. Поэтому я попытался провести некоторые исследования по моей проблеме, но я не знал, что искать, и не нашел ничего похожего.

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


EDIT:

Как и было обещано, вот фактический график. Я все еще буду использовать «Элемент 1» и т. Д. В качестве имен элементов Фактические имена элементов могут содержать специальные символы, такие как пробелы, "-", "/", "(", ")" и "." если это имеет значение.

Обратите внимание, что на этом графике A находится другой столбец, чем раньше. Я всегда корректировал код, который вы указали, чтобы он соответствовал столбцам.

Столбец A содержит все возможные варианты номеров предметов. Здесь могут появляться пустые ячейки.

D остается проставкой.

Столбцы A, B и C фактически переходят к строке 46 (включая заголовок). Столбцы Е до Я спускаемся бесконечно. Я просто не хотел, чтобы пост становился слишком большим, поэтому я сократил его до 6 строк.

<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}
.tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top}
.tg .tg-fymr{font-weight:bold;border-color:inherit;text-align:left;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
  <tr>
    <th class="tg-1wig">Item Number</th>
    <th class="tg-fymr">Item</th>
    <th class="tg-fymr">Stock</th>
    <th class="tg-fymr">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>
    <th class="tg-fymr">Item</th>
    <th class="tg-fymr">Withdrawal</th>
    <th class="tg-1wig">Use</th>
    <th class="tg-1wig">Employee</th>
    <th class="tg-1wig">Date</th>
  </tr>
  <tr>
    <td class="tg-0lax">AAA-AAA-0000</td>
    <td class="tg-0pky">Item 1<br></td>
    <td class="tg-0pky">32</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 4</td>
    <td class="tg-0pky">5</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">09.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax">0AA-AAA-0000</td>
    <td class="tg-0pky">Item 2</td>
    <td class="tg-0pky">228</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 3</td>
    <td class="tg-0pky">20</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">10.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax">AAAA-AAA-0000</td>
    <td class="tg-0pky">Item 3</td>
    <td class="tg-0pky">121</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky">Item 1</td>
    <td class="tg-0pky">10</td>
    <td class="tg-0lax">Usage</td>
    <td class="tg-0lax">Kuraiko</td>
    <td class="tg-0lax">11.09.2018</td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0pky">Item 4</td>
    <td class="tg-0pky">93</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
  <tr>
    <td class="tg-0lax"></td>
    <td class="tg-0pky">Item 5</td>
    <td class="tg-0pky">44</td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0pky"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
    <td class="tg-0lax"></td>
  </tr>
</table>

Ответы [ 4 ]

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

Обдумав комментарий cars10ms к моему основному посту и снова изучив ответ Tedinoz, я пришел к следующему решению.

  • Я поместил формулу в C: =SUMIF($E:$E;B2;$F:$F)
  • Затем я сделал инвентаризацию, заполнив E всеми имеющимися у нас предметами, а F - текущим запасом
  • Теперь я собираюсь заблокировать C и некоторые другие столбцы / ячейки, поэтому немногие другие пользователи, имеющие доступ к этому листу, не могут испортить

Если бы я знал заранее, насколько сложно использовать VB в Excel, я бы раньше подумал о таком простом решении. Я просто думал, что это будет проще и удобнее.

В любом случае, огромное СПАСИБО всем за ваши усилия и время! И извините, что я не смог применить одно из решений VB. По крайней мере, у меня есть крошечная внутренность в VB, и я сейчас собираюсь выяснить разницу между VB и VBA;)

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

Невозможность поместить формулу в столбец C является неудачей, но есть также риск того, что ручная настройка не будет точной.

Я предлагаю создать две новые колонки. Первый = "W / Drawl Total" (скажем, это столбец F), а второй = "W / Drawal Proof" (скажем, столбец G)

Формула в F2 такая:

=SUMIF($D$2:$D$6,A2,$E$2:$E$6)

Суммирует все снятия со склада, указанного в этой строке.
Обратите внимание, что «Диапазон» и «Диапазон суммы» выражаются в абсолютных единицах. Это очень важно.
В этом примере диапазон составляет только от строки 2 до 6, но в действительности вы должны отредактировать номер строки для фактической нижней строки диапазона и скопировать формулу вниз по строке.

Формула в G2 такова:

=+C2-F2

Довольно просто. Он принимает значение в столбце C и вычитает «Всего снятий». Это подсвечивает, когда ввод данных вручную не согласуется с данными транзакции. Вы также копируете эту формулу вниз по столбцу.

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

Я начал свой ответ некоторое время назад и немного отвлекся. Похоже, @JNevill, и у меня были довольно похожие идеи!

По сути, если вы внесете изменение во второй столбец элемента или в столбец снятия, он проверит ваш пустой столбец рядом с ним и, если там нет "x", он попытается вычесть изъятие этой записи из итого в столбце акций и, наконец, отметьте "x" в пустом столбце, если он успешен.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim colItems1 As String: colItems1 = "B"
    Dim colStock As String: colStock = "C"
    Dim colEmpty As String: colEmpty = "D"
    Dim colItems2 As String: colItems2 = "E"
    Dim colWithdrawal As String: colWithdrawal = "F"

    If Not Intersect(Target, Range(colItems2 & ":" & colWithdrawal)) Is Nothing Then

        Dim rowLast As Long
        rowLast = Range(colWithdrawal & Rows.Count).End(xlUp).Row

        'Uncomment this for it to only attempt to subtract when there isn't an "x" in each row
'        If WorksheetFunction.CountA(Range(colEmpty & "2:" & colEmpty & rowLast)) <> rowLast - 1 Then

            Dim vals As Variant
            vals = Range(colEmpty & "2:" & colWithdrawal & rowLast).Value2

            Dim i As Long
            For i = LBound(vals) To UBound(vals)
                If Len(vals(i, 1)) = 0 And Len(vals(i, 2)) > 0 And Len(vals(i, 3)) > 0 Then

                    Dim itemMatch As Range
                    Set itemMatch = Range(colItems1 & ":" & colItems1).Find(vals(i, 2))

                    If Not itemMatch Is Nothing Then
                        itemMatch.Offset(0, 1).Value2 = itemMatch.Offset(0, 1).Value2 - vals(i, 3)
                        Range(colEmpty & 2 + i - 1).Value2 = "x"
                    End If
                End If
            Next i

'        End If

    End If

End Sub

Если вы хотите скрыть новые отметки "x" в своем пустом столбце, вы можете скрыть весь этот столбец или сохранить этот интервал, просто выделив в нем белый цвет шрифта.

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

Я думаю, что я понимаю, что вы после здесь. Вы можете использовать событие Worksheet_Change(), чтобы определить, изменилось ли значение в столбце E, и выполнить вычисления для обновления B:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 5 And Target.Cells.Count = 1 Then  'A cell in Column E was changed
        Dim withdrawal As Long
        Dim item As String

        withdrawal = Target.value
        item = Target.Offset(,-1).value

        Dim foundItem as String
        Set foundItem = Range("A:A").Find(item)

        foundItem.Offset(,1).value = foundItem.Offset(,1).value - withdrawal
    End If
End Sub
...