Я вернулся к сообщению Michael, сделал еще некоторый ввод по абсолютному адресу и понял, что действительно должен был сделать двойное преобразование, и в конечном счете разработал этот небольшой самородок:
Convert.ToString(Convert.ToChar(Int32.Parse(EncodedString.Substring(intParseIndex, 2), System.Globalization.NumberStyles.HexNumber)));
Оттуда я просто сделал цикл, чтобы пройти все символы 2 2 и получить их "hexified" и затем переведенный в строку.
Nick, и кто-либо еще заинтересовал, я шел вперед, и отправил мое небольшое приложение в CodePlex. Не стесняйтесь использовать/изменять, как Вам нужно.
Я думаю, что магическая функция, которую вы здесь ищете, - это Union (). Он встроен в Excel VBA, поэтому посмотрите справку по нему. Он делает именно то, что вы ожидаете.
Прокрутите свои диапазоны, но вместо построения строки создайте диапазон с несколькими областями. Затем вы можете выбрать или установить свойства для всего этого сразу.
Я не знаю, каков (если есть) ограничение на количество областей, которые вы можете создать в одном диапазоне, но оно больше 600. Я также не знаю, какие (если есть) ограничения на выбор или установку свойств многозонного диапазона, но, вероятно, стоит попробовать.
Более быстрым вариантом может быть использование свойства SpecialCells, чтобы найти пробелы, а затем скрыть строки:
Sub HideRows()
Dim rng As Range
Set rng = ActiveSheet.Range("A1:A600")
Set rng = rng.SpecialCells(xlCellTypeBlanks)
rng.EntireRow.Hidden = True
End Sub
Я думаю, это будет работать только с ячейками в пределах UsedRange.
Небольшое ускорение может быть получено, если вы установите RowHeight значение 0. В моей системе это происходит примерно в два раза быстрее (на 6000 итерациях около 1,17 секунды против 2,09 секунды)
Вы не упомянули, что такое «довольно долго» и какую версию XL вы используете ...
Частично ваша проблема может заключаться в обнаружении вашей строки код, который проверяет строку, которую вы хотите скрыть (?).
Вот мой тестовый код в XL 2003 (закомментируйте одну версию, затем другую):
Option Explicit
Public Sub test()
Dim i As Integer
Dim t As Long
t = Timer()
Application.ScreenUpdating = False
For i = 1 To 6000
With Range("A" & i)
'If .Value = vbEmpty Then .EntireRow.Hidden = True
If .Value = vbEmpty Then .RowHeight = 0
End With
Next
Application.ScreenUpdating = True
Debug.Print Timer() - t & " seconds"
End Sub