Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

25 Апрель 2019, 17:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice  без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Не соответствуют спецификации размерностей при получении элмента массива  (Прочитано 3539 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tin
Участник
**
Offline Offline

Сообщений: 28


« Стартовое сообщение: 11 Апрель 2016, 15:59 »

Добрый день. Есть такой кусок кода:
Код:
Dim Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR") as String
Dim c as long
Dim Src as String
Dim Res as Integer
 
For I = 1 to y Step 1
cSheet = iDoc.Sheets(0)
Cell = cSheet.getCellByPosition(0, I)
Dim N1 as String
N1 = Cell.String
For c = 0 to 15 Step 1
Src = Array(c)
Res = Instr(N1, Src, 0)
if Res>0 then Exit For
Next c
Cell = cSheet.getCellByPosition(1, I)
Dim N2 as Variant
N2 = Cell.String
cSheet = oDoc.Sheets(0)
Cell = cSheet.getCellByPosition(1, I)
Cell.String = "Автошины " + N2 + " " + "(" + Mid(N1, Res+1) + Left(N1, Res-1) + ")"
Next I
Этот кусочек должен находить определенную букву в строке и возвращать ее номер, чтобы в дальнейшем можно было разобрать эту строку пополам и переписать в нужном порядке. Но в строке
Цитата:
Src = Array(c)
макрос выдает ошибку о несоответствии спецификаций. Помогите, пожалуйста, разобраться. Файл с макросом прилагаю.

* Конвертация прайс-листа1.ods (16.21 Кб - загружено 7 раз.)
Записан
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 696


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 11 Апрель 2016, 17:06 »

Во первых неправильная строка Dim Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR") as String — ключевое слово Dim служит для объявления переменной, — ну и где в этой строке переменная? Array не может быть переменной, это функция объявления массива, символы в двойных кавычках — строки. Вы создали "сферический массив в вакууме" Смеющийся , правильно создавать массив так: mMassiv=Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR") , размерность массива определяется при создании, а тип Variant.

Вы вначале определяете переменную Src как строку, а затем в строке Src = Array(с) пытаетесь "втиснуть" в неё массив.

Дальше пока не смотрел.
Записан

rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 696


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #2: 11 Апрель 2016, 18:20 »

Смотрим дальше Шокирован
Код:
For I = 1 to y Step 1
cSheet = iDoc.Sheets(0)
Cell = cSheet.getCellByPosition(0, I)
Dim N1 as String
N1 = Cell.String
For c = 0 to 15 Step 1
Src = Array(c)
Res = Instr(N1, Src, 0)
if Res>0 then Exit For
Next c
                .....
                .....
iDoc — это документ OSTATKI_18-01-16.xls, а цикл пробегает по ячейкам Cell = cSheet.getCellByPosition(0, I) — это столбец A) он содержит порядковые числа от 1 до более тысячи — и в этом столбце вы ищете буквы? Или я смотрю не в тот документ?
Записан

Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #3: 11 Апрель 2016, 20:20 »

Во первых неправильная строка Dim Array
Этого я не знала... Опиралась на книги, а там везде массив создается через Dim. Спасибо.

Вы вначале определяете переменную Src как строку, а затем в строке Src = Array(с) пытаетесь "втиснуть" в неё массив.
Нет, нет, я пытаюсь присвоить этой переменной значение из массива, которое соответствует номеру с. Я понимаю, что что-то здесь не так, но не знаю, как провернуть правильно(

iDoc — это документ OSTATKI_18-01-16.xls

Нет, у меня новый формат прайса. В этом столбце содержаться имена.

* 14_03_2016.xlsx (135.89 Кб - загружено 5 раз.)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 11 Апрель 2016, 21:03 »

Ребята, у вас тут весело, можно к вам?
Tin, а тут ещё вопрос по ходу дела: вот эти твои "J","K","L","M","N","P","Q","S","T","R " ,"H","V","W","Y","VR","ZR" - это ты хочешь распарсить наименования по разным типам, да?
Ну, в смысле, "если в названии есть такое вот сочетание букв, то...", да?

И ещё вопрос: отдельные секции - "Лето"-"Зима"-"Груз" - собираешься программно отлавливать? Может быть, есть смысл этой работой пользователя напрячь? А то ведь если формат изменится и макрос не правильно сработает - виновата будешь ты... А если пользователь не правильно диапазон данных выделил, то тут уж "сам дурак".
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #5: 11 Апрель 2016, 21:14 »

Tin, а тут ещё вопрос по ходу дела: вот эти твои "J","K","L","M","N","P","Q","S","T","R " ,"H","V","W","Y","VR","ZR" - это ты хочешь распарсить наименования по разным типам, да?
Ну, в смысле, "если в названии есть такое вот сочетание букв, то...", да?

Не-а. Это разделители строк в моем случае. Т.к. нужно строку разбить пополам и привести к виду: Автошины Nokian Hakka Green (175/70R13 82T) Т.е. поменять местами и кусок заключить в скобки. Иного способа, учитывая, что длина строки каждый раз разная, я не нашла(

Я переделала этот кусок, но не работает поиск, все время выдает 0, хотя ошибок теперь уже никаких нет. Не пойму, то ли в строке поиска напортачила, то ли еще где...
Цитата:
Dim Mas()
Mas = Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR")
Dim c as long
Dim Src as String
Dim Res as Integer
       
   For I = 1 to y Step 1
      cSheet = iDoc.Sheets(0)
      Cell = cSheet.getCellByPosition(0, I)
      Dim N1 as String
      N1 = Cell.String
      MsgBox(N1, "OK")
      For c = 0 to 15 Step 1
         Src = Mas(c)
         Res = Instr(N1, Src, 0)
         if Res>0 then Exit For
      Next c
      Cell = cSheet.getCellByPosition(1, I)
      Dim N2 as Variant
      N2 = Cell.String
      cSheet = oDoc.Sheets(0)
      Cell = cSheet.getCellByPosition(1, I)
      Cell.String = "Автошины " + N2 + " " + Mid(N1, Res+1) + "(" + Left(N1, Res+1) + ")"
   Next I
« Последнее редактирование: 11 Апрель 2016, 21:58 от Tin » Записан
Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #6: 11 Апрель 2016, 21:17 »

И ещё вопрос: отдельные секции - "Лето"-"Зима"-"Груз" - собираешься программно отлавливать?
Да лучше так уже пусть будет) Все равно, если формат прайса измениться, то работа вернется ко мне. Пользователь не на столько дурак, чтобы не заметить изменения прайса, но достаточно ленив, чтобы чего-то не доудалить, а потом высказываться за непонятные строчки)
Записан
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 696


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 11 Апрель 2016, 22:29 »

Я переделала этот кусок, но не работает поиск, все время выдает 0, хотя ошибок теперь уже никаких нет. Не пойму, то ли в строке поиска напортачила, то ли еще где...
Этот кусок должен быть наверно таким:
Код:
Src=Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR") 'это массив для поиска букв (кажется отсутствует "G"?)
Dim c as long
Dim Res as Integer
 
For I = 1 to y Step 1
cSheet = iDoc.Sheets(0)
Cell = cSheet.getCellByPosition(0, I)
Dim N1 as String
N1 = Cell.String
For c = 0 To UBound(Src)
Res = Instr(1,N1,Src(c),0) 'Src(c) — это элемент массива Src() под номером "c"
if Res>0 then Exit For
Next c
Cell = cSheet.getCellByPosition(1, I)
Dim N2 as Variant
N2 = Cell.String
cSheet = oDoc.Sheets(0)
Cell = cSheet.getCellByPosition(1, I)
Cell.String = "Автошины " + N2 + " " + "(" + Mid(N1, Res+1) + Left(N1, Res-1) + ")"
Next I
Если в ячейке поиска нет ни одной буквы из массива поиска, то переменная Res будет равна 0 и это вызовет ошибку, как например в ячейке A469. Чтобы избежать останова из-за ошибки добавил проверку на 0:
Код:
If Res>0 Then Cell.String = "Автошины " + N2 + " " + "(" + Mid(N1, Res+1) + Left(N1, Res-1) + ")"
В этом случае одна указанная ячейка остаётся пустой.
« Последнее редактирование: 11 Апрель 2016, 22:42 от rami » Записан

Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #8: 11 Апрель 2016, 22:56 »

Этот кусок должен быть наверно таким
Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!)
Записан
Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #9: 11 Апрель 2016, 22:59 »

кажется отсутствует "G"?
Правильно отсутствует - такого индекса нет)
Записан
rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 696


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #10: 11 Апрель 2016, 23:03 »

А ещё мне не нравятся слова выделенные красным:
в ячейке B2 — Автошины ACHILLES (latinum 7155/70 R13 75 H Achilles )
в ячейке B6 — Автошины DEBICA (ASSIO 2155/65 R13 73 T )
в ячейке B9 — Автошины SAVA (ERFECTA155/70 R13 75 T )
и многих других отсутствует первая буква ("P", а может и другие), значит неправильно обрабатываются строки.
Записан

rami
Гуру
*******
Online Online

Пол: Мужской
Сообщений: 2 696


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #11: 11 Апрель 2016, 23:22 »

Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!)
Так, Src(с) это не массив, а один из многих элементов массива под нужным номером. Ещё очень рекомендую расставить буквы в массиве не по алфавиту, а по частоте нахождения — на первом месте самая часто встречающаяся буква, редко встречающиеся буквы в конце — так поиск будет проходить быстрее. А вообще макрос огонь Смеющийся не прошло и пол-часа, как таблица была заполнена Смеющийся
Записан

Tin
Участник
**
Offline Offline

Сообщений: 28


« Ответ #12: 12 Апрель 2016, 08:41 »

А ещё мне не нравятся слова выделенные красным:

Я это уже исправила расставив пробелы вокруг букв в массиве и теперь все корректно разделяется.

Ещё очень рекомендую расставить буквы в массиве не по алфавиту, а по частоте нахождения

Ну, это не просто определить для меня, какие индексы чаще, какие реже. Да и прайс каждый раз разный будет.

А вообще макрос огонь  не прошло и пол-часа, как таблица была заполнена

Заказчика все устраивает, значит нормально)
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!