VBA Заполнить пустые ячейки в диапазоне с нуля - PullRequest
0 голосов
/ 19 декабря 2018

В VBA я хочу заполнить пустые ячейки в диапазоне нулем (0)

Ниже, если моя функция:

Function FillEmptyCellWith0(r As Range)
Dim n_rangeWidth As Integer
Dim n_rangeHeight As Integer
Dim n_i As Integer
Dim n_j As Integer
Dim n_value As Integer

n_rangeWidth = r.Columns.Count
n_rangeHeight = r.Rows.Count

MsgBox "Range width = " & n_rangeWidth
MsgBox "Range height = " & n_rangeHeight

For n_j = 1 To n_rangeWidth
  For n_i = 1 To n_rangeHeight
    n_value = r.Cells(n_j, n_i).value
    MsgBox "Cell (" & n_j & ", " & n_i & ") = " & n_value <----- MARK1

    If IsEmpty(r.Cells(n_j, n_i)) Then
        MsgBox "Empty cell"
        r.Cells(n_j, n_i).value = "0" <----- MARK2
    End If
  Next n_i
Next n_j

С помощью следующей таблицы:

------+-------
|   1 |      |
------+-------
|     |     3|
------+-------

У меня есть две пустые ячейки, которые я хочу заполнить нулями в (1, 2) и (2, 1).

Я вызываю функцию следующим образом: FillEmptyCellWith0(A1:B2)

Когда я достигаю «MARK1», при втором повороте цикла он отображает:

Cell (1, 2) = 0
Empty cell

и затем останавливается.

Когда я отслеживаю код, я вижу егоостанавливается на MARK2.

Вы понимаете, почему?

Можете ли вы сказать мне, как присвоить нулевое значение (0) этим пустым ячейкам?

EDIT 1

Видимо, я не могу этого сделать.

https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Попробуйте

Sub test()
    FillEmptyCellWith0 Range("a1: c10")
End Sub

Sub FillEmptyCellWith0(rngDb As Range)
    Dim vDB As Variant
    Dim r As Long, c As Integer
    Dim i As Long, j As Integer

    vDB = rngDb
    r = UBound(vDB, 1)
    c = UBound(vDB, 2)

    For i = 1 To r
        For j = 1 To c
            If IsEmpty(vDB(i, j)) Then
                vDB(i, j) = 0
            End If
        Next j
    Next i
    rngDb = vDB
End Sub
0 голосов
/ 19 декабря 2018

Есть несколько способов сделать это:

Sub Fill0s1()
    Dim rng As Range: Set rng = Range("G5:I7")
    Dim Cell As Range

    For Each Cell In rng
        Cell.value = IIf(IsEmpty(Cell), "0", Cell.value)
    Next
End Sub

Sub Fill0s2()
    Dim rng As Range: Set rng = Range("G5:I7")
    Dim Cell As Range

    For Each Cell In rng.SpecialCells(xlCellTypeBlanks)
        Cell.value = "0"
    Next
End Sub

Sub Fill0s3()
    Dim rng As Range: Set rng = Range("G5:I7")
    rng.Replace What:="", Replacement:="0", LookAt:=xlWhole
End Sub
0 голосов
/ 19 декабря 2018

Вы должны использовать встроенную функциональность вместо

Sub FillZero()
    Dim rg As Range

    Set rg = Range("A1:B4")

    rg.Replace What:="", Replacement:="0", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False


End Sub
0 голосов
/ 19 декабря 2018

Измените с соответствующим диапазоном и попробуйте:

Option Explicit

Sub test()

    Dim rng As Range, Cell As Range

    'Set your range
    Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5")

    For Each Cell In rng

        If IsEmpty(Cell) Then
            Cell.Value = "0"
        End If

    Next

End Sub
0 голосов
/ 19 декабря 2018

Циклы не нужны.

Поскольку вы не возвращаете значение из функции, используйте взамен Sub и попросите функцию сообщить, были ли изменены какие-либо ячейки:

Sub MAIN()
    Dim r As Range
    Set r = Selection
    x = FillEmptyCellWith0(r)
    MsgBox x
End Sub

Public Function FillEmptyCellWith0(r As Range) As String
    Dim re As Range
    On Error Resume Next
        Set re = r.Cells.SpecialCells(xlCellTypeBlanks)
    On Error GoTo 0
    If re Is Nothing Then
        FillEmptyCellWith0 = "Nothng changed"
        Exit Function
    End If
    re.Value = 0
    FillEmptyCellWith0 = "done"
End Function

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

...