Вопросы, вызванные макросом, который обрезает пробелы

Нашел этот макрос в Интернете и, изучая его, я придумал два вопроса, на которые не смог найти ответа:

Во-первых, нужно ли объявлять объектные переменные MyRange и MyCell? Какие преимущества это дает?

Во-вторых, на основании предыдущего вопроса, который я опубликовал, избыточно ли проверять, пуста ли ячейка или нет, до того, как ее значение будет обрезано. В чем преимущество этой проверки? Это просто для экономии усилий / времени на компиляцию? Или есть другие технические причины?

Sub TrimSpaces()
Dim MyRange As Range
Dim MyCell As Range
Select Case MsgBox(“Workbook First?”, vbYesNoCancel)
    Case Is = vbYes
    ThisWorkbook.Save
    Case Is = vbCancel
    Exit Sub
End Select
Set MyRange = Selection
For Each MyCell in MyRange
    If Not IsEmpty(MyCell) Then
        MyCell = Trim(MyCell)
    End If
Next MyCell
End Sub

Обратите внимание, что вы использовали эти умные кавычки “ ”, но VBA принимает только простые кавычки " ".

Pᴇʜ 31.10.2018 14:18
0
1
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На мой взгляд, я думаю, что лучше объявить диапазон, чтобы избежать повторения и быть более ясным, особенно если у вас длинный код. В вашем случае вы используете цикл для проверки каждой "MyCell" (адрес одной части (диапазона)) весь MyRange (который также является диапазоном).

Во-вторых, проверка значения ячейки поможет сэкономить время, предотвратив выполнение кода после того, как условие не выполняется.

Наконец, функция Trim & Clean поможет вам «очистить» значение ячейки от невидимых символов, ненужных пробелов и т. д.

Left или Right не выдадут ошибку, если вы передадите им Empty. Он неявно приводится к vbNullString. Вы можете проверить это в ближайшем окне: ?Left(Empty, 42)
Comintern 31.10.2018 14:03

@Comintern по какой-то причине иногда я получаю сообщение об ошибке. Не могли бы вы получить дополнительную информацию для расследования?

Error 1004 31.10.2018 14:09

Вы уверены, что ячейка пуста, когда получите сообщение об ошибке? Он может потерпеть неудачу, если ячейка содержит ошибка, но IsEmpty не является подходящим тестом для этого. Как показано выше, пустая ячейка всегда будет принудительно.

Comintern 31.10.2018 14:13

Вы абсолютно правы! Я проверяю значение ячейки, и оно не было пустым, но выглядело как пустое (не было видимых символов, но был специальный символ). Данные были извлечены с веб-сайта! Я исправляю свой код при обрезке значения для обрезки и очистки! это было очень полезно!

Error 1004 31.10.2018 14:18

Вы уверены, что это: «Возможно, вам понадобится использовать функцию« Влево »или« Вправо », и вы не проверяете значение ячейки. Если ячейка пуста, вы получите сообщение об ошибке». правильно? Потому что Debug.Print Left("", 100) вообще не выдает ошибок.

Pᴇʜ 31.10.2018 14:28

@ Pᴇʜ я делал ошибку и ошибся с моей собственной кодировкой, и Коминтерн помог мне найти и понять, где была моя ошибка. Вы можете увидеть наше обсуждение выше!

Error 1004 31.10.2018 14:30
Ответ принят как подходящий

Первый:
Это очень хорошая практика - использовать Option Explicit и объявлять все переменные. Также объявление диапазонов, рабочих листов и т. д. - хороший способ избежать использования .Select или .Activate. Как избежать использования Select в Excel VBA

Второй:
MyCell = Trim(MyCell) вызовет действие записи (требует времени) в эту ячейку, даже если она пуста. Проверка того, был ли он пустым, могла бы избежать ненужного действия записи и, следовательно, могла бы сделать его немного более эффективным.

Спасибо за этот ответ! Чтобы по-настоящему осознать это в моей голове, не могли бы вы показать мне, каким был бы код цикла, если бы я не объявлял переменные диапазона?

GeekyFreaky 31.10.2018 14:38

Вам придется использовать Selection непосредственно в For Each MyCell in Selection, вот и все. Этот код не является хорошим примером для иллюстрации хорошей практики объявления переменных. Но в любом случае все, что вам нужно помнить, это: Избегайте использования .Select и используйте Option Explicit для принудительного объявления переменных. • Отсутствие объявления переменных для правильного типа жестяная банка вызывает ошибки и делает ваш код неэффективным (потому что VBA автоматически предполагает Variant, который является наиболее неэффективным типом).

Pᴇʜ 31.10.2018 14:44

А как насчет MyCell? Чем это можно заменить, если оно не было объявлено как переменная диапазона? Я просто пытаюсь понять, что абсолютно необходимо объявить, а что нет. Огромное спасибо!!!

GeekyFreaky 31.10.2018 15:15

@GeekyFreaky, если вы удалите Dim MyCell As Range и ничего не запишете, Excel автоматически примет его как Variant. Значит он такой же, как был заявлен Dim MyCell As Variant. • Дополнительным преимуществом объявления его как Range является то, что вы можете использовать IntelliSense в редакторе VB (если вы начинаете писать MyCell., Excel выдает список доступных свойств и методов объекта диапазона), что недоступно для Variant.

Pᴇʜ 31.10.2018 15:23

Другие вопросы по теме