Tin
Участник

Offline
Сообщений: 28
|
Добрый день. Есть такой кусок кода: 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 не может быть переменной, это функция объявления массива, символы в двойных кавычках — строки. Вы создали "сферический массив в вакууме"  , правильно создавать массив так: mMassiv=Array("J","K","L","M","N","P","Q","S","T","R ","H","V","W","Y","VR","ZR") , размерность массива определяется при создании, а тип Variant. Вы вначале определяете переменную Src как строку, а затем в строке Src = Array(с) пытаетесь "втиснуть" в неё массив. Дальше пока не смотрел.
|
|
|
Записан
|
|
|
|
rami
|
Смотрим дальше  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
Сообщений: 28
|
Во первых неправильная строка Dim Array Этого я не знала... Опиралась на книги, а там везде массив создается через Dim. Спасибо. Вы вначале определяете переменную Src как строку, а затем в строке Src = Array(с) пытаетесь "втиснуть" в неё массив. Нет, нет, я пытаюсь присвоить этой переменной значение из массива, которое соответствует номеру с. Я понимаю, что что-то здесь не так, но не знаю, как провернуть правильно( iDoc — это документ OSTATKI_18-01-16.xls Нет, у меня новый формат прайса. В этом столбце содержаться имена.
|
|
|
Записан
|
|
|
|
JohnSUN
|
Ребята, у вас тут весело, можно к вам? Tin, а тут ещё вопрос по ходу дела: вот эти твои "J","K","L","M","N","P","Q","S","T","R " ,"H","V","W","Y","VR","ZR" - это ты хочешь распарсить наименования по разным типам, да? Ну, в смысле, "если в названии есть такое вот сочетание букв, то...", да?
И ещё вопрос: отдельные секции - "Лето"-"Зима"-"Груз" - собираешься программно отлавливать? Может быть, есть смысл этой работой пользователя напрячь? А то ведь если формат изменится и макрос не правильно сработает - виновата будешь ты... А если пользователь не правильно диапазон данных выделил, то тут уж "сам дурак".
|
|
|
Записан
|
|
|
|
Tin
Участник

Offline
Сообщений: 28
|
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
Сообщений: 28
|
И ещё вопрос: отдельные секции - "Лето"-"Зима"-"Груз" - собираешься программно отлавливать? Да лучше так уже пусть будет) Все равно, если формат прайса измениться, то работа вернется ко мне. Пользователь не на столько дурак, чтобы не заметить изменения прайса, но достаточно ленив, чтобы чего-то не доудалить, а потом высказываться за непонятные строчки)
|
|
|
Записан
|
|
|
|
rami
|
Я переделала этот кусок, но не работает поиск, все время выдает 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
Сообщений: 28
|
Этот кусок должен быть наверно таким Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!)
|
|
|
Записан
|
|
|
|
Tin
Участник

Offline
Сообщений: 28
|
кажется отсутствует "G"? Правильно отсутствует - такого индекса нет)
|
|
|
Записан
|
|
|
|
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
|
Вот оно как! А я думала, что поиск не будет корректно работать с массивом, потому отдельную переменную создала, а оказывается наоборот надо было! Огромное спасибо! Я еще массив подправила, теперь просто отлично работает!) Так, Src(с) это не массив, а один из многих элементов массива под нужным номером. Ещё очень рекомендую расставить буквы в массиве не по алфавиту, а по частоте нахождения — на первом месте самая часто встречающаяся буква, редко встречающиеся буквы в конце — так поиск будет проходить быстрее. А вообще макрос огонь  не прошло и пол-часа, как таблица была заполнена 
|
|
|
Записан
|
|
|
|
Tin
Участник

Offline
Сообщений: 28
|
А ещё мне не нравятся слова выделенные красным: Я это уже исправила расставив пробелы вокруг букв в массиве и теперь все корректно разделяется. Ещё очень рекомендую расставить буквы в массиве не по алфавиту, а по частоте нахождения Ну, это не просто определить для меня, какие индексы чаще, какие реже. Да и прайс каждый раз разный будет. А вообще макрос огонь не прошло и пол-часа, как таблица была заполнена Заказчика все устраивает, значит нормально)
|
|
|
Записан
|
|
|
|
|