Если одна из ячеек, содержащая [
или ]
, может иметь начальные конечные пробелы/неразрушающие пробелы, то необходимо провести сопоставление подстановочных знаков. Кроме того, рабочий лист 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 или даже «Фон окна» в системных настройках компьютера.
Перед запуском суб
После запуска суб
В до и после изображений выше, вы можете увидеть, что D2 сохраняет свою Range.Value property (видимые в формула), пока ничего не отображается на листе. Примечание: значения ячеек все еще могут быть скопированы из ячейки, отображающей ничего, но это является предостережением об использовании метода vbWhite
.
¹ Есть предопределенные константы длиной типа RGB для основного VBA палитры. RGB(255, 255, 255)
- vbWhite
. Полный список доступен по адресу Color Constants.
Возможно, вы должны проверить, что colIndex не превысил lastCol в цикле Do While. В противном случае, если есть «[» без соответствия «]», тогда цикл не остановится там, где вы хотите. Определенный номер ошибки и сообщение облегчат диагностику. – barrowc
Можете ли вы избежать ошибки с помощью команды «Do While» .Cells (rowIndex, colIndex) .Value <> "]« И colIndex <= lastCol'? Если это так, то ']' никогда не будет найден, и вы попытались сбежать с правой стороны листа. Возможно, есть ведущее/конечное пространство с ']' или ']'. Это приведет к ошибке 1004. – Jeeped
Спасибо за подсказку, ошибка уходит, когда я добавляю этот последний бит. Я не думал, что мне нужна пограничная проверка, потому что всегда будет соответствие]. Оказывается, ошибка была вызвана «]» вместо «]». Это дополнительное пространство забросило ошибку. – Mav