Как записать макросом поиск пробела в ячейке?

Автор OOKapitan, 28 марта 2019, 17:50

0 Пользователи и 1 гость просматривают эту тему.

bigor

Цитата: OOKapitan от 29 марта 2019, 11:07Работает на ура.
ты результат проверял? он ищет пробел в строке  "oSheet.getCellByPosition (5, r).String"
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

С уважением,
Михаил Каганский

OOKapitan

Цитата: Bigor от 29 марта 2019, 11:10"oSheet.getCellByPosition (5, r).String"
Полный код выглядит так:
Sub UF
Dim i&, r&
oDoc=Thiscomponent
oSheet = oDoc.Sheets(i)
For r=1 to 119
If VAL(LEFT(oSheet.getCellByPosition (5, r).String, InStr("oSheet.getCellByPosition (5, r).String"," ")-1))*1>=6 Then
   oSheet.getCellRangeByPosition (1,r,5, r).SetPropertyValue("CellBackColor", 65280)
End If
Next r
End Sub

Зелёным закрасилось всё правильно. Может я чего-то не понимаю? А как записать, чтобы пробел искался в ячейке? Не в конкретном словосочетании, а в ячейке?

bigor

Цитата: OOKapitan от 29 марта 2019, 13:12Зелёным закрасилось всё правильно.
Я не спорю, что-то закрасится. Вот только сомневаюсь, что правильно.
А зачем макрос? это можно условным форматированием сделать.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

OOKapitan

 :o
Я решил сразу после For добавить в код команду:
Print oSheet.getCellByPosition (5, r).String
Выдаёт 0. У меня данные находятс в столбце F и начинаются в ячейке F4. Что я не так записал? Пробовал и так писать: Print oSheet.getCellByPosition (6, r).String - не помогает.

OOKapitan

Цитата: Bigor от 29 марта 2019, 13:35А зачем макрос? это можно условным форматированием сделать.
А как правильно макрос прописать? У меня не получается.

bigor

сделай файл с примемером и выложи сюда, откуда мы знаем какие у тебя данные
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Для того, чтобы работать с макросами, неплохо было бы попытаться понять, что это вообще такое; и что такое функции; и читать описания используемых функций, чтобы понимать, какие данные туда можно передавать и какие ошибки они могут выдавать.

Когда просят помочь с макросами, присать "Поправил. VAL(LEFT(oSheet.getCellByPosition (5, r).String, InStr(oSheet.getCellByPosition (5, r).String," ")-1)). Всё-равно - "Неправильный вызов процедуры". Что не так-то?" говорит о том, что человек вообще ничему не научился за более чем 400 сообщений на форуме; в частности, что нужно давать достаточно данных в контексте. И даже дополнение типа
Цитата: OOKapitan от 29 марта 2019, 13:12Полный код выглядит так:
Код:
Sub UF
Dim i&, r&
oDoc=Thiscomponent
oSheet = oDoc.Sheets(i)
For r=1 to 119
If VAL(LEFT(oSheet.getCellByPosition (5, r).String, InStr("oSheet.getCellByPosition (5, r).String"," ")-1))*1>=6 Then
  oSheet.getCellRangeByPosition (1,r,5, r).SetPropertyValue("CellBackColor", 65280)
End If
Next r
End Sub
недостаточно: ведь неизвестно, что там в ячейках F2:F120.

Код пытается вызвать функцию Val, которая принимает строку. Эту строку должен подготовить вызов функции Left. Как указано в её описании, она принимает строку и число символов, которое должно быть взято из начала этой строки; 0 - значит возвратить пустую строку. Это число символов определяется функцией InStr, которая возвращает 0, если искомое не найдено. Из результата InStr вычитается 1, что может привести к тому, что в Left будет передано отрицательное значение.

Как видно, сочиняемый макрос лепится из того, что прочитывается вообще безо всякой попытки разобраться. Не читается документация. Не производится отладка, когда каждая функция пишется в отдельной строке, чтобы увидеть, что именно даёт сбой. Не используется пошаговая отладка.

Подсказка: вычитать единицу не надо было. А вообще-то Val принимает и строку типа "12345 вышел зайчик погулять" и сам превратит её в 12345, безо всякой подготовки.
С уважением,
Михаил Каганский

rami

Цитата: OOKapitan от 29 марта 2019, 13:12Зелёным закрасилось всё правильно.
Кстати так тоже закрасится "правильно":
Sub UF
Dim i&, r&
oDoc=Thiscomponent
oSheet = oDoc.Sheets(i)
For r=1 to 119
If VAL(LEFT(oSheet.getCellByPosition(5, r).String, InStr("МожноЗаменитьНаЭтуСтроку Результат не изменится"," ")-1))*1>=6 Then
   oSheet.getCellRangeByPosition(1,r,5, r).SetPropertyValue("CellBackColor", 65280)
End If
Next r
End Sub

mikekaganski

Цитата: OOKapitan от 29 марта 2019, 13:37
:o
Я решил сразу после For добавить в код команду:
Print oSheet.getCellByPosition (5, r).String
Выдаёт 0. У меня данные находятс в столбце F и начинаются в ячейке F4. Что я не так записал? Пробовал и так писать: Print oSheet.getCellByPosition (6, r).String - не помогает.
Банально заполнить часть листа названиями ячеек (например, в A1 записать руками "A1", в A2 - "A2" и т.п.) и потом выполнить такой вот Print не пробовали?
С уважением,
Михаил Каганский

OOKapitan

Цитата: mikekaganski от 29 марта 2019, 13:41вычитать единицу не надо было
Надо. Ибо иначе вернёт "23 ", а мне надо 23. Только когда я перед этим написал Print oSheet.getCellByPosition (5, r).String, то мне уже вернуло 23, хотя в ячейке формула выдаёт 23 мес 5 дн Как так?

OOKapitan


mikekaganski

Уже не говоря о том, что макрос делается, видимо, чтобы заменить условное форматирование.
С уважением,
Михаил Каганский

mikekaganski

Цитата: OOKapitan от 29 марта 2019, 13:49
В ячейках уже есть данные.

Потрясающе! То есть создать новый лист, в нём проделать тестирование, чтобы разобраться, как происходит адресация, и полученные знания применить в рабочем листе - это, видимо, из разряда ненаучной фантастики.
С уважением,
Михаил Каганский

OOKapitan

Цитата: mikekaganski от 29 марта 2019, 13:50Уже не говоря о том, что макрос делается, видимо, чтобы заменить условное форматирование
Именно так.
Цитата: Bigor от 29 марта 2019, 13:39сделай файл с примемером и выложи сюда, откуда мы знаем какие у тебя данные
Выкладываю файл. Мне нужно из ячеек столбца F вывести цифры слева до первого пробела. Как это сделать? Помогите, пожалуйста.