L oop через диапазон и очистить содержимое 8 ячеек ниже оцениваемой ячейки - PullRequest
0 голосов
/ 26 мая 2020

Я хочу l oop через ячейки от $ C $ 29 до $ G $ 29, и если ячейки содержат пустое пространство, я хочу очистить содержимое 8 ячеек ниже. Например, если $ G $ 29 пуст, я хочу очистить содержимое в $ G $ 30: $ G $ 37. Я прикрепил код ниже. Но я считаю, что со строкой .ClearContents что-то не так, что-то связано с тем, как я пытаюсь ссылаться относительно. Спасибо!

Best, M

Sub Hide_Financing()

Dim r As Range

For Each r In Sheet2.Range("$C$29:$G$29")
    If r.Value = "" Then
        Sheet2.Range(r.Address & ":" & r.Offset(rowOffset:=8).Address).ClearContents
    End If
Next r

End Sub

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Я написал это, чтобы дать больше ответа , так как текущий является скорее комментарием и на самом деле не дает прямого решения (это неоднозначно и подразумевает, что Sheet2 не 'нигде не объявляется, что является вашей проблемой (что не обязательно правильно, поскольку Sheet2 является кодовым именем для Worksheets ("Sheet2") по умолчанию, поэтому вам все равно следует избегать переменных с такими типами имен).

Когда мой код ничего не делает вы должны выполнить базовые c шаги отладки (это только одно из многих мест в Интернете, объясняющих, как отлаживать - используйте Ваша поисковая система в ваших интересах!).

Глядя на ваш код, нет никаких проблем с синтаксисом, и все кажется, что должен работать, так что прочтите это вслух про себя.

Вы определили, что ссылаетесь на ячейки на Sheet2 вместо Sheet1, что на самом деле только вы можете установить sh, поскольку вы единственный, кто знает, где вы хотите манипулировать. ваши данные.


Подводя итог ключевым моментам здесь:

  1. Используйте метод отладки Rubber Duck
  2. Отлаживайте свой код.

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

Для отладки кода вы можете делать такие вещи, как использование оператора Debug.Print. Я бы добавил это в ваш код следующим образом:

For Each r In Sheet2.Range("$C$29:$G$29")
    If r.Value = "" Then
        Debug.Print r.Address 
        Debug.Print r.Offset(rowOffset:=8).Address
    End If
Next r

Теперь для вашего приложения вы ожидаете что-то вроде этого в немедленном окне:

$C$29
$C$37

Но в зависимости от вашего значения на Sheet2, если таковые имеются, вы, вероятно, увидите следующее:


Это пустое значение специально, потому что вы ссылались не на тот лист - Или, конечно, вы могли видеть некоторые другие неожиданные ссылки на ячейки в зависимости от значений вашего листа2.

Я полагаю, вы бы довольно быстро поняли, что вам следует проверять Sheet1 вместо Sheet2, выполняя оба этих действия - конечно, это не гарантированное решение каждый раз - некоторые вещи просто не работают. не имеет смысла, и для этого существуют такие сообщества, как SO! - но он работает лучше, чем вы думаете, для подобных вещей.

0 голосов
/ 26 мая 2020

У меня отлично работает. В вашем коде нигде вы не устанавливали значение "sheet2". Вы правильно установили? Остальная часть вашего кода верна. Другой вопрос, уверены ли вы, что очистили хотя бы одну ячейку в диапазоне «$ C $ 29: $ G $ 29»?

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