2015-11-15 4 views
0

Я написал код для поиска наборов скобок в файле excel и вычеркнул содержимое ячеек между ними. У меня есть код для 26-27 строк, прежде чем я получу сообщение об ошибке.Excel VBA: Определено приложение или ошибка, определенная объектом

Вот код:

Sub macro() 
Dim white As Long 
Dim rowIndex As Long 
Dim colIndex As Long 
Dim lastRow As Long 
Dim lastCol As Long 

white = RGB(Red:=255, Green:=255, Blue:=255) 

With ActiveSheet 

lastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
lastCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

For rowIndex = 1 To lastRow 
     For colIndex = 1 To lastCol 
      If .Cells(rowIndex, colIndex).Text = "[" Then 
       colIndex = colIndex + 1 
       Do While .Cells(rowIndex, colIndex).Value <> "]" 
        .Cells(rowIndex, colIndex).Font.Color = white 
        colIndex = colIndex + 1 
       Loop 
      End If 
     Next colIndex 
Next rowIndex 
End With 
End Sub 

Ошибка происходит на этой линии:

Do While Cells(rowIndex, colIndex).Value <> "]" 

Я попытался добавить в:

With ActiveSheet 

Наряду с. перед каждой командой Cell, но это не помогло. Любая помощь очень ценится.

+1

Возможно, вы должны проверить, что colIndex не превысил lastCol в цикле Do While. В противном случае, если есть «[» без соответствия «]», тогда цикл не остановится там, где вы хотите. Определенный номер ошибки и сообщение облегчат диагностику. – barrowc

+1

Можете ли вы избежать ошибки с помощью команды «Do While» .Cells (rowIndex, colIndex) .Value <> "]« И colIndex <= lastCol'? Если это так, то ']' никогда не будет найден, и вы попытались сбежать с правой стороны листа. Возможно, есть ведущее/конечное пространство с ']' или ']'. Это приведет к ошибке 1004. – Jeeped

+0

Спасибо за подсказку, ошибка уходит, когда я добавляю этот последний бит. Я не думал, что мне нужна пограничная проверка, потому что всегда будет соответствие]. Оказывается, ошибка была вызвана «]» вместо «]». Это дополнительное пространство забросило ошибку. – Mav

ответ

1

Если одна из ячеек, содержащая [ или ], может иметь начальные конечные пробелы/неразрушающие пробелы, то необходимо провести сопоставление подстановочных знаков. Кроме того, рабочий лист MATCH function может находить брекетинговые ячейки с помощью поиска подстановочных знаков более эффективно, чем циклическое перемещение по каждой ячейке по очереди.

Sub hide_cell_values() 
    Dim whiteOut As String '<~~ using alternate method .NumberFormat ;;; 
    Dim rw As Long, n As Long, f As Long, l As Long 

    whiteOut = ";;;" 'custom cell number format to show nothing in cell 

    With ActiveSheet 
     'process row by row in the .UsedRange 
     With .Range(.Cells(1, 1), .Cells.SpecialCells(xlCellTypeLastCell)) 
      For rw = 1 To .Rows.Count 
       ' check for existance of matching pairs 
       If Not IsError(Application.Match("*[*", .Rows(rw), 0)) And _ 
           Application.CountIf(.Rows(rw), "*[*") = _ 
           Application.CountIf(.Rows(rw), "*]*") Then 
        ' [ and ] pairs exist and match in row. 
        f = 0: l = 0 
        For n = 1 To Application.CountIf(.Rows(rw), "*[*") 
         'this looks complicated but it just references the cells between [ & ] 
         f = Application.Match("*[*", .Rows(rw).Cells.Offset(0, l), 0) + l + 1 
         ' last safety check to ensure that [ comes before ] 
         If Not IsError(Application.Match("*]*", .Rows(rw).Cells.Offset(0, f), 0)) Then 
          l = Application.Match("*]*", .Rows(rw).Cells.Offset(0, f), 0) + f - 1 
          With .Range(.Cells(rw, f), .Cells(rw, l)) 
           'this is a better method of not displaying text in a cell 
           .NumberFormat = whiteOut '<~~ e.g. ;;; 
           'the old method of white-text-on-white-background (not reliable as .Interior.Color can change) 
           '.Font.Color = vbWhite 
          End With 
         End If 
        Next n 
       Else 
        ' [ and ] pairs do not match or do not exist in row. do nothing. 
       End If 
      Next rw 
     End With 
    End With 

End Sub 

Я выбрал пользовательский формат номера ячейки из ;;;, а не изменяя цвет шрифта RGB(255, 255, 255) (см сноску ¹). A Range.NumberFormat property из трех полуколонок подряд просто ничего не показывает; видимая видимость белого шрифта подчиняется ячейкам Range.Interior.Color property, worksheet backgroun или даже «Фон окна» в системных настройках компьютера.

Hiding cell contents before sub
Перед запуском суб

Hiding cell contents after sub
После запуска суб

В до и после изображений выше, вы можете увидеть, что D2 сохраняет свою Range.Value property (видимые в формула), пока ничего не отображается на листе. Примечание: значения ячеек все еще могут быть скопированы из ячейки, отображающей ничего, но это является предостережением об использовании метода vbWhite.


¹ Есть предопределенные константы длиной типа RGB для основного VBA палитры. RGB(255, 255, 255) - vbWhite. Полный список доступен по адресу Color Constants.

+0

<3 Так что это может быть более эффективным, но код сложнее читать/понимать (по крайней мере для меня XD). Независимо от того, спасибо, собираюсь изучить это ... – findwindow

Смежные вопросы