VBA - заменить пустые ячейки - PullRequest
2 голосов
/ 26 февраля 2020

Я должен заменить каждую пустую ячейку в столбце BM данными в этой же строке в столбце DN. Я написал, что:

Columns("BM:BM").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.FormulaR1C1 = "=DN2"

Но "= DN2" заканчивается как "= @ 'DN2'" в каждой ячейке. Что делает ошибку. Кто-нибудь знает, как я могу получить ячейку в DN из того же ряда, пожалуйста?

Заранее большое спасибо!

Ответы [ 3 ]

4 голосов
/ 26 февраля 2020

Другой способ сделать это

Dim rng As Range

On Error Resume Next
Set rng = Columns("BM:BM").SpecialCells(xlCellTypeBlanks)
On Error GoTo 0

If Not rng Is Nothing Then
    rng.Formula = "=DN" & rng.Row
End If

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

4 голосов
/ 26 февраля 2020

Если вы собираетесь R1C1, тогда сделайте Формулу R1C1

If Application.CountA(ActiveSheet.Range("BM:BM"))<> ActiveSheet.Rows.Count Then
    ActiveSheet.Range("BM:BM").SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC118"
End If
2 голосов
/ 26 февраля 2020

Вот мои два цента. Я бы отказался от идеи использования SpecialCells для целых столбцов. Если вы хотите go с SpecialCells, то сначала создайте Range в столбце BM, чтобы использовать его. Если какой-либо столбец превышает интересующие вас строки, вы получите значения в местах, которые вам действительно не нужны (формулы в вашем случае).

Вот небольшой пример, охватывающий A1:C5:

enter image description here

Наша область интересов - столбец B:B, где, если он пуст, нам нужны значения из столбца C:C

Когда мы запускаем код используя SpecialCells, например:

Columns("B:B").SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC3"

В итоге мы получим:

enter image description here

То, что мы видим, это SpecialCells использует UsedRange (как справедливо упомянуто @Peh в разделе комментариев) и поэтому очень ненадежно при таком использовании. Существует риск того, что вы получите значения / формулы там, где они вам не нужны. Я предлагаю использовать последнюю использованную строку из столбца C:C (или в вашем случае DN) и go оттуда. Так что уже намного экономнее будет что-то вроде:

.Range("BM1:BM" & <LastUsedRowOfDN>).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=RC118"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...