Onur ERYILMAZ Ответов: 1

Проблема цикла Vba в listobject(таблица excel)


Привет,

У меня есть проблема в моем цикле for. Я хочу перебрать каждую строку excel в моей таблице excel и найти значение в определенном столбце, когда я найду значение, которое я редактирую в 25-м столбце этой строки.

Для этого я написал код VBA. Но когда я запускаю его, цикл for не заполняет ячейки одну за другой. Я прикрепил снимок экрана моих колонок, когда запускал макрос.

Заранее спасибо.

Ссылка на скриншот : Ссылка[^]

Edit: я обнаружил, что таблица содержит 156 строк, но в цикле for после 86-й строки значение ячейки становится пустым. Почему это так?

Что я уже пробовал:

Private Sub FindAndReplaceButton_Click()
    Dim s As String
    s = WorkCommandNumbersInputField.Value
    Dim wcns() As String
    wcns = Split(s, ",")
    
    Dim wrksht As Worksheet
    Dim objListObj As ListObject
    Dim objListRows As ListRows
    
    Set wrksht = Application.ActiveSheet
    Set objListObj = wrksht.ListObjects(1)
    Set objListRows = objListObj.ListRows
    
    Dim rowCount As Integer
    rowCount = objListRows.Count
      
    For Each wcn In wcns
        For i = 1 To rowCount
            Dim FindedRow As Range
            Set FindedRow = objListObj.ListRows(i).Range
            Dim FindedCell As Range
            Set FindedCell = FindedRow.Cells(i, 2)
            If FindedCell.Value = wcn Then
                Dim ChangedCell As Range
                Set ChangedCell = FindedRow.Cells(i, 25)
                If (ChangedCell.Value = "") Or (ChangedCell.Value = "---") Then
                    ChangedCell.Value = ShelfNumberInputField.Value
                ElseIf ChangedCell.Value <> ShelfNumberInputField.Value Then
                    ChangedCell.Value = ChangedCell.Value + "-" + 
                    ShelfNumberInputField.Value
                End If
            End If
        Next i
    Next
End Sub

Graeme_Grant

любая причина, по которой вы просто не используете встроенный Excel If(...) функция в 25-м столбце каждой строки?

Onur ERYILMAZ

Потому что если функция всегда устанавливает ячейку "False" или "Empty", то то, что я хотел сделать, если условие не соответствует, ничего не делает. Таким образом, встроенная функция if не предлагает в противном случае ничего не делать.

Graeme_Grant

Тогда вы не понимаете Excel. Например:

=IF(B7>15, "Big", "Small")

Если B7 = 10, то ячейка будет содержать "маленький", если B7 = 20, то ячейка будет содержать "большой".

Вы можете сделать еще один шаг вперед и использовать ссылку на ячейку для состояний true/false:
=IF(B7>15, D4, C4)

Onur ERYILMAZ

Но проблема в том, что я не хочу писать "маленький", я хочу это =IF(B7>15, "Большой", в противном случае оставьте ячейку незатушенной)

Graeme_Grant

Тогда используйте нулевую строку, просто!

Onur ERYILMAZ

Мне не нужна нулевая строка восьмерки.

Graeme_Grant

Тогда удачи. Я дал вам гораздо более простое решение, чем вы пытаетесь реализовать сами. Это то, о чем вы просили, это то, что вы получили.

Onur ERYILMAZ

Ты мне ничего не дал ;)

Richard MacCutchan

Да, он это сделал, но, похоже, вы не понимаете основ VBA.

ZurdoDev

=Если(B7>15, "Большой", "")

Это оставит камеру нетронутой.

Graeme_Grant

Спасибо. Он не понимает, что пустая ячейка-это нулевая строка. Сомневаюсь, что он вообще пытался это сделать.

Pat O'Brien

но ячейка с формулой не является нулем, даже если она возвращает нулевую строку.

Саб тест()
Дим ГСЧ в диапазоне
Set rng = [testcell]
Отлаживать.Выведите "x+CellValue+x", "имеет формулу", "IsNull", "Формула"
Отлаживать.Выведите "x" & [testcell] & "x", rng.HasFormula, IsNull(rng), rng.Формула

Конец Подводной Лодки


Запустите вышеописанное и вы получите:

x+CellValue+x имеет формулу IsNull Formula
xx True False =IF(G7>G8,"big", "")




ZurdoDev

Отладьте свой код. Тогда вы точно увидите, что происходит.

1 Ответов

Рейтинг:
0

Patrice T

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

Цитата:
Я обнаружил, что таблица содержит 156 строк, но в цикле for после 86-й строки значение ячейки становится пустым. Почему это так?

Поскольку ваш код не зависит от номера строки, поведение вашего кода зависит от содержимого листа. Вы-единственный, кто может что-то сделать.
-----
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
Отладка в Excel VBA - простые макросы Excel[^]
MS Excel 2013: введение в отладку VBA[^]
Как отладить Excel VBA - YouTube[^]

Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.