Не соответствуют спецификации размерностей при получении элмента массива

Автор Tin, 11 апреля 2016, 15:59

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

Tin

Добрый день. Есть такой кусок кода:
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)
макрос выдает ошибку о несоответствии спецификаций. Помогите, пожалуйста, разобраться. Файл с макросом прилагаю.

rami

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

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

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

rami

Смотрим дальше :o
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

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

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

Цитата: rami от 11 апреля 2016, 16:20iDoc — это документ OSTATKI_18-01-16.xls

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

JohnSUN

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

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

Tin

Цитата: JohnSUN от 11 апреля 2016, 19:03Tin, а тут ещё вопрос по ходу дела: вот эти твои "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

Tin

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

rami

Цитата: Tin от 11 апреля 2016, 19:14Я переделала этот кусок, но не работает поиск, все время выдает 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) + ")"
В этом случае одна указанная ячейка остаётся пустой.

Tin

Цитата: rami от 11 апреля 2016, 20:29Этот кусок должен быть наверно таким
Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!)

Tin


rami

А ещё мне не нравятся слова выделенные красным:
в ячейке 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

Цитата: Tin от 11 апреля 2016, 20:56Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!)
Так, Src(с) это не массив, а один из многих элементов массива под нужным номером. Ещё очень рекомендую расставить буквы в массиве не по алфавиту, а по частоте нахождения — на первом месте самая часто встречающаяся буква, редко встречающиеся буквы в конце — так поиск будет проходить быстрее. А вообще макрос огонь ;D не прошло и пол-часа, как таблица была заполнена ;D

Tin

Цитата: rami от 11 апреля 2016, 21:03А ещё мне не нравятся слова выделенные красным:

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

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

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

Цитата: rami от 11 апреля 2016, 21:22А вообще макрос огонь  не прошло и пол-часа, как таблица была заполнена

Заказчика все устраивает, значит нормально)