Цикл Excel VB For не выполняет итерацию оператора if - PullRequest
1 голос
/ 31 мая 2011

Я ценю, что это дилетантский вопрос, но я не привык к VB и его синтаксису.

Я пытаюсь перетащить информацию из одного рабочего листа (ProductList) в другой (Quote), основываясь на том, есть ли значение в столбце количества (QTY).

Вот мой метод:

Private Sub cmdProductListContinue_Click()

    'Declare variabless
    Dim i, duration, qty, outputX, outputY

    'Set initial values
    duration = 120 'Used to determine number of iterations in for loop (no. of QTY cells we are to check)
    i = 3 'Used as cell co-ordinates to pull information from
    outputX = 17 'Used as cell co-ordinates to output information

    'Populate invoice with product info by iterating through all QTY cells and pulling across info if needed
    For i = 3 To duration
        'Reset quantity to zero each time
        qty = 0
        'Set quantity to the value in the QTY cell
        Set qty = Worksheets("ProductList").Cells(i, 3)
            'If there is a quantity value present
            If qty > 0 Then
                'Insert quantity value into appropriate cell in quote sheet
                Worksheets("Quote").Cells(outputX, 2) = qty
                'Insert description into quote sheet
                Worksheets("Quote").Cells(outputX, 3) = Worksheets("ProductList").Cells(i, 2)
                'Insert unit price into quote sheet
                Worksheets("Quote").Cells(outputX, 4) = Worksheets("ProductList").Cells(i, 4)
                'Increment the output co-ordinates to the next line
                outputX = outputX + 1
            End If
    Next i

    'Open quote sheet
    Sheets("Quote").Select

End Sub

Используя точки останова, я вижу, что когда есть количественное значение, оно успешно перемещается в первый оператор «Then», но затем, кажется, просто возвращается к началу цикла, полностью пропуская две другие выходные строки.

Мой синтаксис правильный? Я что-то упускаю из своей логики?

Я ценю, что это может быть трудно обдумать, не имея листов, чтобы увидеть столбцы данных и т. Д.

'i' установлено в 3, поскольку первое значение столбца Количество находится в ячейке C, 3 с описанием в C, 2 и ценой в C, 4. Затем они увеличиваются в цикле.

Любая помощь с этим будет оценена.

Спасибо !!

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Здесь вы присваиваете qty объекту (диапазон):

Set qty = Worksheets("ProductList").Cells(i, 3)

Если вместо этого вы хотите получить значение ячейки , используйте:

qty = Worksheets("ProductList").Cells(i, 3).Value

«Набор» используется при назначении объекта, поэтому он вам здесь не нужен.«Значение» является свойством по умолчанию, но я все равно предпочитаю его включать.

Небольшая доработка вашего кода:

Private Sub cmdProductListContinue_Click()

Dim i, duration, qty, outputX
Dim wsQuote As Worksheet, wsProd As Worksheet

    Set wsQuote = Worksheets("Quote")
    Set wsProd = Worksheets("ProductList")

    duration = 120
    outputX = 17

    For i = 3 To duration
        qty = wsProd.Cells(i, 3).Value
        If qty > 0 Then
            With wsQuote.Rows(outputX)
                .Cells(2).Value = qty
                .Cells(3).Value = wsProd.Cells(i, 2).Value
                .Cells(4).Value = wsProd.Cells(i, 4).Value
                outputX = outputX + 1
            End With
        End If
    Next i

    wsQuote.Activate

End Sub
2 голосов
/ 31 мая 2011
Set qty = Worksheets("ProductList").Cells(i, i)

This! Будет перебирать диагональ листа, то есть C3, D4, E5 и т. Д.

Вы можете захотеть что-то вроде

Set qty = Worksheets("ProductList").Cells(i, 3)

или

Set qty = Worksheets("ProductList").Cells(3, i)

Также проверьте другие ссылки на лист ProductList (конец строк):

'Insert description into quote sheet
Worksheets("Quote").Cells(outputX, outputY + 1) = Worksheets("ProductList").Cells(i, i - 1)
'Insert unit price into quote sheet
Worksheets("Quote").Cells(outputX, outputY + 2) = Worksheets("ProductList").Cells(i, i + 1)
...