Причина может быть выяснена из разницы между
NUL : без символов. Он используется для заполнения времени или заполнения пространства на поверхности (например, на поверхности пластины) запоминающего устройства, где нет данных. Мы будем использовать этот символ, когда будем программировать очистители данных (как деструктивные, так и недеструктивные), чтобы стереть нераспределенное пространство, чтобы удаленные данные не могли быть восстановлены кем-либо или какой-либо программой.
SOH: этот символ используется для обозначения начала заголовка, который может содержать информацию об адресе или маршруте.
STX: этот символ используется для обозначения начала текста и, таким образом, также используется для обозначения конца заголовка.
Источник определения
В различных комментариях уже указывалось, что эти символы (первые 32) называются управляющими символами, потому что эти символы выполняют различные операции управления принтером и дисплеем, а не отображают символы.
В Hadoop SOH часто используется в качестве разделителя полей, особенно при чтении CSV-файлов. Кроме того, при открытии файла Excel (без распаковки в виде простого xlsx, т.е. в виде двоичного файла) в Notepad++ и печати управляющих символов можно увидеть много символов SOH. Из-за функций безопасности нельзя будет увидеть фактические данные.
chr(0) = SOH — указатель на адрес памяти всех ячеек, содержащих ТЕКСТ.
и
chr(1) = NUL — это указатель на адрес памяти всех ячеек, содержащих NULL или BLANK CELLS.
Давайте посмотрим на приведенные выше утверждения в отношении различных команд, показанных на изображении ниже. ВЕРХНИЙ СЛЕВА — это исходный диапазон данных, и пример показывает, как работает замена для SOH, NUL и ASTERISK (*) с использованием функции Range.Replace.
![SOH Заменить ВСЕ в EXCEL](https://i.stack.imgur.com/XXux0.png)
Итак, почему Chr(0) и Chr(1) могут заменить значения в ячейке Excel, если они являются просто указателями адресов, и почему chr(1) действует иначе, чем chr(42)?
Это происходит из-за структуры рабочего листа Excel. Когда вы открываете новую книгу Excel, ячейки Excel не помечаются. Это полностью визуально и в жесткой и в мягкой памяти системы.
Однако, как только кто-то вводит что-то в ячейку B2, всем ПУСТЫМ КЛЕТКАМ в квадрате до B2 будет присвоен указатель с Chr (0), а ячейке B2 будет назначен указатель с Chr (1).
Теперь, если удалить содержимое ячейки B2, то вместе с другими ячейками B2 будет назначен указатель NUL или Chr(0).
Это также является причиной того, что простая очистка содержимого с помощью Cells.ClearContents не очистит ячейки в памяти, а рабочая книга Excel раздувается, когда использовалась удаленная ячейка, но не удалялась с помощью Cells.Clear или Ctrl + Delete.
Теперь, когда понятно, почему Excel заменяет содержимое или очищает лист с помощью данной команды. Также важно понимать разницу между звездочкой (*) и SOH [или Chr(0)].
Звездочка (*) заменяет содержимое ячеек с минимальной длиной 0.
В то время как Chr (0) идентифицирует ячейки с SOH, то есть ячейки, содержащие значение, а затем заменяет значение в месте назначения указателя.
Разница не в результате, а в том, как находят или идентифицируют клетки, которые нужно заменить.
Я создал небольшой макрос для проверки гипотез, в котором записываю время, необходимое для замены полумиллиона ячеек (от A1 до CZ5000), используя Chr(1) = SOH и Chr(42) = *
Получается, что использование указателя на адрес ячеек с ТЕКСТом, т.е. SOH, занимает меньше времени, чем АСТЕРИСК (*).
![Время замены текста](https://i.stack.imgur.com/7hKdx.png)
Sub Replace_Timer()
Sheet3.Activate
Dim startTime, endTime
Dim i As Integer
Sheet3.Range("A1:CZ5000").Value = "A"
For i = 1 To 25
startTime = Timer
Sheet3.Cells.Replace Chr(1), "X", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 2).Value = endTime - startTime 'Execution time in miliseconds
startTime = Timer
Sheet3.Cells.Replace Chr(42), "Z", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 3).Value = endTime - startTime 'Execution time in miliseconds
Next
Sheet4.Activate
End Sub
person
jainashish
schedule
21.02.2019
[A1].value = "-" & Chr(1) & "-"
выглядит довольно странно :D - person Dirk Reichel   schedule 10.08.2017Chr(1)
означаетStart of Heading
, и вот документ (cs.tut.fi/~ jkorpela/chars/c0.html) описывает все управляющие символы ASCII. Другой правительственный веб-сайт (its.bldrdoc.gov/fs-1037/ dir-034/_5089.htm) имеет еще более запутанное объяснениеChr(1)
. - person ian0411   schedule 25.08.2017chr(1)
, я просто не понимаю, почему Excel ведет себя так, как со звездочкой (заполнителем), но не с любыми другими непечатаемыми символами. Кажется, что-то глубоко внутри самого приложения смущает Excel. Так что я любезен, если любопытно, что там происходит. (Тем не менее я уверен, что не могу понять это по-настоящему): P - person Dirk Reichel   schedule 25.08.2017Chr(1)
является реальным заполнителем (иначе было бы невозможно выполнить поиск *), но не имея возможности сделать именно это (насколько мне известно), это может быть некоторый остаток. Тем не менее, если ни один программист не остановится здесь случайно, я сомневаюсь, что получу правильный ответ. :/ - person Dirk Reichel   schedule 13.09.2017Chr(63)
что?
делает то же самое - person Karthick Gunasekaran   schedule 22.09.2017?
- это заполнитель для одного символа, а*
- это заполнитель для любого количества символов... - person Dirk Reichel   schedule 22.09.2017xlPart
, все вхождения будут заменены (если заменить a на c, то aba станет cbc). Таким образом, все строки будут очищены char за char) ;) - person Dirk Reichel   schedule 23.09.2017chr(1)
здесь и здесь. - person ashleedawg   schedule 18.10.2017SendKeys Chr(1)
работает как CTRL+A,Chr(2)
работает как CTRL+B и т. д. (подробнее здесь dc .org/files/asciitable.pdf). Возможно, vba интерпретирует chr(1) как «выбрать все», поэтому все непустые ячейки заменяются. - person TomJohnRiddle   schedule 22.01.2018ActiveSheet.Cells.Find(Chr(1), ActiveCell).Activate
также будет действовать так, как будто условие всегда выполняется, другие методы сравнения не показывают такого поведения, какinstr()
. И просто подсказка: это также работает, если вы откроете окно замены и вставите выражениеChr(1)
в поле поиска. И еще одно противоречие для выбора всего: Microsoft Word вообще не показывает такого поведения. - person Dirk Reichel   schedule 15.08.2018