Доброго дня, уважаемые! Не могу осознать принцип работы следующего макроса и прошу разъяснить на пальцах:
Цитата
16 Май 2013 10:05:26 Казанский написал:
Код
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
.Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With
По отдельности прочитал\посмотрел значения, но логика всего этого в одну строку не уловил. А также прошу подсказать, как указать текущую ячейку. Как я понял, из-за оператора "Evaluate" ссылка на ячейку происходит с помощью фразы " & .Address & ". Конкретно мне требуется перебрать все ячейки (их значение - текст) удалив "лишние" пробелы, включая невидимые. Нашёл несколько вариаций, включая цитируемый способ, и решил его доработать, другим вариантом:
Код
TRIM(CLEAN(SUBSTITUTE(("A1",CHAR(160),"" "")))
который, мне кажется, более предпочтительным, но может я ошибаюсь в правильности выбора, так как не очень понял их описание, трактовка порой разная. Одни пишут, что удаляют всё, но зачем-то отдельно 160-ый символ обрабатывают, а другие перечисляют 120-ые вручную помимо операторов... В примере применяется 2 оператора TRIM(сжпробелы) и Clean(печсимв), но я не уверен, что они так же стирают эти 120-ые символы; и для 160 символа отдельно используется 3-ий оператор SUBSTITUTE(подставить). В любом случае, я не понимаю, как мне указать текущую ячейку, которую требуется обработать, т. е. в другом коде:
Код
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
.Value =TRIM(CLEAN(SUBSTITUTE((XXX,CHAR(160),"" "")))
End With
Вместо XXX должно быть что-то вроде того же ".Value" или " & .Address & ", который мне и нужно обработать каждым шагом перебора или "Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value" - но это всё не работает. Циклом For это выглядело бы нагляднее (пример)
Код
For i=1 to 10
If Range("A" & i).Value = " " Then Range("A" & i).Value = ""
End If: End For
Т. е. тут в ячейку i-тую присваиваем результат работы с нею же, И-той ячейкой - я явно указал с какой ячейкой работал, а в коде выше я не знаю, как указать ссылку на И-тую ячейку, потому что не вижу упоминания "И-тости". В первом коде, в качестве ссылки используется " & Address & " - тоже не понятная мне конструкция, и ничего умнее этого не придумал:
Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
.Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
.Value = TRIM(CLEAN(SUBSTITUTE((" & .Address & ",CHAR(160),"" "")))
'или
'.Value = TRIM(CLEAN(SUBSTITUTE((.Value,CHAR(160),"" "")))
End With
где вместо XXX указал "Аддресс", но так не сработало =(
Да, в пользу найденного мною варианта с 3 операторами:
Цитата
Функция СЖПРОБЕЛЫ (TRIM) предназначена для удаления из текста знаков пробела 7-разрядного кода ASCII (значение 32). В наборе знаков Юникода существует дополнительный знак пробела, который называется знаком неразрывного пробела и имеет десятичное значение 160. Этот знак обычно используется на веб-страницах как сущность HTML . Сама по себе функция СЖПРОБЕЛЫ не удаляет этот знак неразрывного пробела. Пример синтаксиса, позволяющего удалить из текста оба знака пробела, см. в разделе Удаление пробелов и непечатаемых знаков из текста. ПЕЧСИМВ (CLEAN) Удаляет из текста первые 32 непечатаемых знака в 7-битном коде ASCII (значения с 0 по 31). СЖПРОБЕЛЫ (TRIM) Удаляет из текста знак пробела в 7-битной кодировке ASCII (значение 32). ПОДСТАВИТЬ (SUBSTITUTE) Можно использовать для замены символов Юникода с более высокими значениями (127, 129, 141, 143, 144, 157 и 160) знаками 7-битной кодировки ASCII, для которых предназначены функции СЖПРОБЕЛЫ и ПЕЧСИМВ.
*Если я пойму принцип работы такого "цикла", то я многое смогу переделать с цикла for на этот.
*Косвенный вопрос: какой цикл\способ перебора быстрее работает? В итоге требуется перебирать много ячеек и либо редактировать их, например, удалять пробелы, а затем почищенные диапазоны сравнивать между собой (~80+ тысяч строк сравнить с ~60+ тысячами строк). Писать всё по детски\не профессионально циклом For мне, конечно, проще, нагляднее, но есть "пинок" сделать это лучше\быстрее, удобнее и короче в разы.
Доброго времени, уважаемые! Снова вынужден попросить помощи (в идеале готовый код, ибо соображать что к чему уже не способен, но разберусь позже), сам никак не додумаюсь, голова болит, волосы дыбом, а сроки поджимают… в общем Вы в курсе ^^)
Изначально, сведения содержаться в csv-файле, но, думаю, это не сильно влияет на всю задачу. Я его открываю (средствами макроса), и вижу как среди прочих сведений, которые чётко расположены в своём столбце, в своей ячейке, за исключением одного столбца - куча параметров-значений в одну ячейку. Конечно, эксель всё делает верно, он уже достаточно разбил, осталось «добить» и «разнести». Имеем диапазон ячеек, в каждой ячейке записано в "одну строку\подряд\сплошняком" что-то вроде «параметр1 : значение1», «параметр2 : значение2» etc На Исходном листе указаны примерные варианты Значений, когда как Параметры – всегда одинаковы. Порядок расположения Параметров – разный. Суть: Из каждой ячейки листа (Исходный) найти параметры, посмотреть их значения и занести (значения) в соответствующие столбцы на другой лист (Готовый), где: Наименования параметров (bu, cnt, diag…) – это атрибуты – наименования столбцов; Значения (O10101015, 65489, Исправно…) – значения атрибутов. *Если нет значения параметру "bu" (и некоторым другим, например, oldisn), то параметр не упоминается, однако, об этом сообщает другой параметр "no_bu" (no_oldisn) со значением "1". В обычном случае, bu есть и значение no_bu 0. В общем, это не важно, мне главное понять, как найти и перенести, на деле, может не все значения придётся переносить - нет данных, останется ячейка пустой в соответствующем столбце - не страшно.
Порыл интернет, нашёл как разбить (split и т. п.), но не хватает какого-то «озарения», добавить сравнение и занесения значений в соответствующие столбы. В общем, даже пример кода дать затрудняюсь – сдался, лечусь от мигрени =(
Здравствуйте, уважаемые! Являюсь новичком в VBA в Excel`е. На борту MS Office Pro Plus 2010, Excel v: 14.0.6129.5000 (32-разрядная). Задача: В ячейке А1 расположена цифра "830511". Макрос должен инпутбоксом попросить ввести цифру, затем происходит сравнение введённого с содержимым ячейки А1. Если совпадает - покрасить ячейку в цвет. Проблема: Если инпутбокс передаёт значение в переменную, затем переменную использовать в сравнении if, то равенство не верно: 830511 не равно 830511. Хотя в переменной данные цифры есть. Если в if вместо переменной указать сразу инпутбокс, то равенство верно: 830511 равно 830511 Предполагаю переменная должна быть какого-то типа? Не работает\не красит:
Код
Sub Test()
Dim x
x = InputBox("Введите искомое значение")
If Range("A1").Value = x Then
Range("A1").Interior.Color = vbGreen
End If
End Sub
Работает\красит:
Код
Sub Test()
If Range("A1").Value = InputBox("Введите искомое значение") Then
Range("A1").Interior.Color = vbGreen
End If
End Sub