зацикливание в VBA Excel - PullRequest
       0

зацикливание в VBA Excel

0 голосов
/ 13 марта 2020

У меня проблема с кодом VBA, который я создаю. У меня есть файл Excel, где в первых 3 столбцах у меня есть некоторая информация, такая как номер детали, и т. Д. c, запрошенное количество. Затем на том же листе в других столбцах у меня есть больше данных, где у меня могут быть или не быть те же номера деталей / номеров, что и в первых столбцах, а также дополнительная информация. Идея состоит в том, чтобы go часть / число по части / номеру в первых столбцах и проверить, присутствует ли он в последних столбцах (или наборе данных), и проверить, удовлетворяет ли второй набор данных количеству, требуемому для первого набора данных. и если не перейти к следующей строке, как во втором наборе данных, могут быть дубликаты для одной и той же детали / номера, поскольку у них разные цены, проекты и т. д. c. Таким образом, идея заключается в том, что если во втором наборе данных будет задано количество, необходимое для первого, скопируйте эти значения в разные ячейки и создайте сумму, чтобы в итоге я узнал общее количество. Я сделал немного кодирования, но я получаю ошибки, так как я очень плохо знаком с VBA. Любая помощь будет оценена. Спасибо.

столбец A - это часть / номер первого набора данных, а C необходимое количество / запрошенный столбец AP - это номер / номер второго набора данных, а AQ - доступное количество * 1003. *

Sub ExitFor_Loop()

    Dim i, j, qty   As Integer
    Dim mySum       As Double
    mySum = 0

    For i = 2 To 374
        qty = Range("C" & i).Value
        For j = 2 To 13672
            If Range("A" & i).Value = Range("AP" & j).Value Then
                Do
                    If qty > Range("AQ" & j).Value Then
                        Range("BC" & j).Value = Range("A" & i).Value
                        Range("BD" & j).Value = Range("AT" & j).Value
                        Range("BE" & j).Value = Range("AQ" & j).Value
                        Range("BF" & j).Value = Range("AV" & j).Value
                        Range("BG" & j).Value = Range("AW" & j).Value
                        Range("BH" & j).Value = Range("AX" & j).Value
                        Range("BI" & j).Value = Range("AY" & j).Value
                        Range("BJ" & j).Value = Range("AZ" & j).Value
                        mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
                        qty = qty - Range("AQ" & j).Value
                    Else
                        Range("BC" & j).Value = Range("A" & i).Value
                        Range("BD" & j).Value = Range("AT" & j).Value
                        Range("BE" & j).Value = Range("AQ" & j).Value
                        Range("BF" & j).Value = Range("AV" & j).Value
                        Range("BG" & j).Value = Range("AW" & j).Value
                        Range("BH" & j).Value = Range("AX" & j).Value
                        Range("BI" & j).Value = Range("AY" & j).Value
                        Range("BJ" & j).Value = Range("AZ" & j).Value
                        mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
                    End If

               Loop While (qty > Range("AQ" & j).Value  And ("A" & i).Value = Range("AP" & j).Value)
            Next j
        Next i

    End Sub

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

Помимо ошибок кодирования с отсутствующими Range

'Loop While (qty > Range("AQ" & j).Value  And ("A" & i).Value = Range("AP" & j).Value)
Loop While (qty > Range("AQ" & j).Value  And Range("A" & i).Value = Range("AP" & j).Value)

и отсутствующими End If между Loop и Next j, логика c имеет недостатки.

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

Кроме того, если количество меньше, чем имеющееся, цена рассчитывается с использованием доступного количества (не требуемого количества), а требуемое количество не изменяется.

If qty > Range("AQ" & j).Value Then
    ' range copy
    mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
    qty = qty - Range("AQ" & j).Value
Else
    ' range copy
    mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
End If

должно быть

If qty > Range("AQ" & j).Value Then
    ' range copy
    mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
    qty = qty - Range("AQ" & j).Value
Else
    ' range copy
    mySum = mySum + qty * Range("AV" & j).Value
    qty = 0
End If

Обратите внимание, что сумма будет неправильной, если общее доступное количество меньше требуемого количества.

Это объявление будет лучше, чем Long

' Dim i, j, qty   As Integer  
Dim i as Long, j as Long, qty as Long  

, поскольку оно не будет выполнено, если qty > 32767

Этот код записывает сумму для каждой части в столбец D

Sub ExitFor_Loop2()

    Const SHEET_NAME = "Sheet1" ' change as required

    Const COL_PART = "A"
    Const COL_QU = "C"
    Const COL_SUM = "D" ' sum for each part change as required

    Const COL_STOCKPART = "AP"
    Const COL_STOCKQU = "AQ"
    Const COL_STOCKPRICE = "AV"

    Dim wb As Workbook, ws As Worksheet
    Dim iRow As Long, iLastRow As Long
    Dim t0 As Single, count As Long
    t0 = Timer

    Set wb = ThisWorkbook
    Set ws = wb.Sheets(SHEET_NAME)

    Dim iQu As Long, dSum As Double, sPart As String
    Dim iStockRow As Long, iStockQu As Long, dStockPrice As Double
    Dim iLastStock As Long

    iLastStock = ws.Range(COL_STOCKPART & Rows.count).End(xlUp).Row
    iLastRow = ws.Range(COL_PART & Rows.count).End(xlUp).Row
    'Debug.Print iLastRow, iLastStock

    ' double loop
    Application.ScreenUpdating = False
    For iRow = 2 To iLastRow

        sPart = ws.Cells(iRow, COL_PART)
        iQu = ws.Cells(iRow, COL_QU)
        dSum = 0

        For iStockRow = 2 To iLastStock

            ' matching part no
            If sPart = ws.Cells(iStockRow, COL_STOCKPART) Then

                iStockQu = ws.Cells(iStockRow, COL_STOCKQU) 'qu
                dStockPrice = ws.Cells(iStockRow, COL_STOCKPRICE) 'price

                With ws.Rows(iStockRow)
                   .Columns("BC") = sPart
                   .Columns("BD").Value = .Columns("AT").Value
                   .Columns("BE").Value = .Columns("AQ").Value
                   .Columns("BF:BJ").Value = .Columns("AV:AZ").Value
                End With

                If iQu > iStockQu Then

                    dSum = dSum + iStockQu * dStockPrice
                    iQu = iQu - iStockQu

                Else

                    dSum = dSum + iQu * dStockPrice
                    iQu = 0
                    iStockRow = iLastStock ' end search

                End If

            End If
            count = count + 1
        Next

        ' not enough stock
        If iQu > 0 Then
            MsgBox iQu & " items short for " & sPart, vbExclamation, "Part row " & iRow
            dSum = 0
        End If

        ws.Cells(iRow, COL_SUM) = dSum ' sum in coll E
   Next
   Application.ScreenUpdating = True

   MsgBox "Scanned col " & COL_PART & " to row " & iRow - 1, vbInformation, _
          count & " iterations completed in " & Format(Timer - t0, "0.00") & " secs"
End Sub
~~~
0 голосов
/ 13 марта 2020

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

Option Explicit

Sub ExitFor_Loop()

Dim i, j, qty   As Integer
Dim mySum       As Double
mySum = 0

For i = 2 To 374
  qty = Range("C" & i).Value
    For j = 2 To 13672
      If Range("A" & i).Value = Range("AP" & j).Value Then
        Do While (qty > Range("AQ" & j).Value And Range("A" & i).Value = Range("AP" & j).Value)
            If qty > Range("AQ" & j).Value Then
                Range("BC" & j).Value = Range("A" & i).Value
                Range("BD" & j).Value = Range("AT" & j).Value
                Range("BE" & j).Value = Range("AQ" & j).Value
                Range("BF" & j).Value = Range("AV" & j).Value
                Range("BG" & j).Value = Range("AW" & j).Value
                Range("BH" & j).Value = Range("AX" & j).Value
                Range("BI" & j).Value = Range("AY" & j).Value
                Range("BJ" & j).Value = Range("AZ" & j).Value
                mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
                qty = qty - Range("AQ" & j).Value
            Else
                Range("BC" & j).Value = Range("A" & i).Value
                Range("BD" & j).Value = Range("AT" & j).Value
                Range("BE" & j).Value = Range("AQ" & j).Value
                Range("BF" & j).Value = Range("AV" & j).Value
                Range("BG" & j).Value = Range("AW" & j).Value
                Range("BH" & j).Value = Range("AX" & j).Value
                Range("BI" & j).Value = Range("AY" & j).Value
                Range("BJ" & j).Value = Range("AZ" & j).Value
                mySum = mySum + Range("AQ" & j).Value * Range("AV" & j).Value
            End If
         Loop
      End If
  Next j
Next i

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...