• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Формулы в Екселе и 1С

  • Автор темы ech
  • Дата начала
E

ech

привет! вопрос к знатокам. дан екселевский файл, в нем есть первая ячейка с цифрой при нажатии на которую подсвечуются ячейки сумма которых дает данную нам первую ячейку! так вот как програмно в 1С искать по этому Екселевскому файлу ячейку главную и ячейки подчиненные ей по формулам (т.е. есть ссылки на формулы). Должен быть примерно такой вид:

Ячейка C5 = "=Sum(C13,C15,C34,C199)"

т.е. мне нужно найти в Екселе все ячейки которые принадлежат С5.
 
P

puh14

Ухх - знаю пока только переборами - а там после получения ячейки Найти(СтрокаЭкселя,"Sum")>0 и из неё выцеплять кусая по запятым.
 
E

ech

А поподробней про переборы можно??? Спасибо!
 
P

puh14

ну примерно так -

Прайс=СоздатьОбъект("Excel.Application");//заход в эксель
Попытка
Прайс.Application.Workbooks.Open(СокрЛП(Файл));// открытие конкретного файла, путь к которому в переменной Файл
Исключение
Предупреждение("Файл не существует или открыт пользователем!",20);
СтатусВозврата(0);
КонецПопытки;

прайс.Sheets(TrimAll("Лист 1")).Activate();// активируешь нужный лист , может по другому называться
Для сч = 63 По 19730 Цикл // с какой по какую ячейку обрабатыать
ТОвар = Прайс.ActiveWorkbook.activesheet.cells(Сч,2).value;// Позиционирование на значение ячейки Сч - номер строки, 2 - номер колонки
Если Найти(Товар,"Sum")> 0 ТОгда//Тут собсно ты нашел ячейку
ПерваяЯчейка = Сред(Товар, Найти(Товар,"("),Найти(Товар,","));//Получил значение первой ячейки

КонецЕСли;
КонецЦикла;

ну остальные отрезанием Прав(),Лев() и тем же найти по ","

Как нашел - надо отделить число от колонки.Ежли у тебя колонок мало и они по длине имени не более оного сивола, тогда Лев

ТОварЯчейки = Прайс.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,2), Лев(ПерваяЯчейка,1)).value; // Не уверен насчет символьных имен колонок - пользовался только числовыми.

Усе - переменная товарЯчейки содержит значение ячейки использованой в формуле
 
E

ech

может мы не так друг друга поняли, но мне мне нужно не значение ячейки, а (если быть конкретным) поиск ячеек , сумма числел которых образуют сумму одной ячейки и запись этих чисел (которые образуют сумму) в справочник.

Так вот как организовать поиск этих самых ячеек ??
 
P

puh14

может мы не так друг друга поняли, но мне мне нужно не значение ячейки, а (если быть конкретным) поиск ячеек , сумма числел которых образуют сумму одной ячейки и запись этих чисел (которые образуют сумму) в справочник.
Наверно не поняли - ячейка с формулой содержит текст формулы, в которой фигурируют ссылки на ячейки с слагаемыми значениями. Сначалы ты получаешь текст формулы в виде строки, потом откусываешь/вытаскиваешь из него ссылки на ячейки, позиционируешся на них и пишешь их значения в справочник.
 
E

ech

Наверно не поняли - ячейка с формулой содержит текст формулы, в которой фигурируют ссылки на ячейки с слагаемыми значениями. Сначалы ты получаешь текст формулы в виде строки, потом откусываешь/вытаскиваешь из него ссылки на ячейки, позиционируешся на них и пишешь их значения в справочник.

Во во, это уже ближе!! Метод использовать твой в примере??
 
P

puh14

ага - до первой ячейки добираешся как я написал, после того как вытащил оттуда всё, откусываешь всё что слева от неё в тексте формулы и снова ищешь запятую в обкусаном тексте формулы. Если нашел - значит есть ещё ячейка.
 
E

ech

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


Мда, теперь бы сообразить как кодом это организовать:)
 
E

ech

Для сч = 1 По 481 Цикл
Товар = ВходExcel.ActiveWorkbook.activesheet.cells(Сч,3).Formula;
Если Найти(Товар,"=SUM")> 0 Тогда
ПерваяЯчейка = Сред(Товар,Найти(Товар,"("),Найти(Товар,")"));
Сообщить(ПерваяЯчейка);
КонецЕсли;
КонецЦикла;

ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,1),Лев(ПерваяЯчейка
,2)).Value

Вот тут ошибку выдает ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,1),Лев(ПерваяЯчейка
,2)).Value
 
E

ech

Товар = ВходExcel.ActiveWorkbook.activesheet.cells(Сч,3).value;
таким макаром ты получаешь формулу в виде строки, а через formula - не знаю что получишь.

Не , как раз через ВАлуе не работает, а с формулой работает!! Тока обрезанная часть не одна ячейка, а две...

И Вот тут ошибку выдает (я правда не понял для чего эта строчка)

ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,1),Лев(ПерваяЯчейка
,2)).Value
 
P

puh14

Что сообщает про первую ячейку?


ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,1),Лев(ПерваяЯчейка
,2)).Value
эта строчка чтобы ты встал на ячейку из формулы. В перемнной перваяячейка должно быть что-то типа c1.
таким макаром ты строка = Сред(ПерваяЯчейка,1) откусили первый символ слева и осталось 1 - то есть строка №1
колонка = Лев(ПерваяЯчейка,2) откусили до второго символа осталось с.
Идея примерная - если колонка из двух букв типа СХ - то надо писать уже по другому.
 
P

puh14

Что-то много нашел.
ПерваяЯчейка = Сред(Товар,Найти(Товар,"("),Найти(Товар,")"));
- подкосячил - он при таком раскладе ищет до конца ( символ ")")
так попробуй - что скажет
ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,","));

Все - идею твою понял. Ты хотел вытащить сразу все поля из формулы и отпозиционироваться на них - так не выйдет. Тебе надо тогда откусывать от ПерваяЯчейка симолы до первой запятой, из откусаного первый символ будет номером колонки, а оставшиеся - номером строки. И вот тогда у тебя
ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПерваяЯчейка,1),Лев(ПерваяЯчейка
,2)).Value заработает а то сейчас получилось

ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells("11,C13,","(").Value

как видишь - колонки с номерм ( не бывает, как и строки с номером 11,C13,
 
E

ech

Что-то много нашел.
- подкосячил - он при таком раскладе ищет до конца ( символ ")")
так попробуй - что скажет
ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,","));

Результат колонки С1 = (C11,C13,C32,C197) то что в Екселе

У меня результат после обрезки выдает "C11,C13,C"

И еще все работы ведуться только в 3 -ем столбике экселя
 
P

puh14

Очень странно - должен был дальше обрезать.
Добавь сообщить(товар) - что он там покажет.
заодно и сообщить(Строка(товар))
 
E

ech

ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,",")-6);

Вот таким макаром


Сообщить(ПерваяЯчейка);

выдает

ссылки тока на первые ячейки

Ссылка у С1 получилась не C11,C13,C, а C11. Вроде то что нужно, но как дальше перебирать , то что после С11 стоит, т.е. С13, С32 и С197.

Причем таких ячеек как С1 , у которой есть ссылки на другие ячейки 84 штуки.
 
P

puh14

ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,",")-6);
ещё более странно - он должен найти первую запятуюи по неё откусить, а ты ещё на шесть символов назад откатываешся.

попробуй так
ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,")"));//выделил диапозон адресов, должно быть что-то типа "C11,C13,C32,C197" - если нет, дальше не сработает
Сообщить(перваяЯчейка);
ПереборЯчеек = Строка(ПерваяЯчейка);//присвоение отдельной переменной строки с полями через запятую для откусывания в цикле
Пока Найти(ПереборЯчеек,",") >0 Цикл//Цикл кусания переборячеек по запятым
ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПереборЯчеек,2,Найти(ПереборЯчее
к,",")),Лев(ПереборЯчеек,1)).Value;//строка откусывается с второго символа по запятую, столбец - первый символ строки
Сообщить(ТоварЯчейки);//проверка поймал-ли. Можешь добавить вывод столбца и ячейки для проверки
ПереборЯчеек = Сред(ПереборЯчеек,Найти(переборЯчеек,",")+1);//откусывание обработаной части включительно с запятой
Сообщить(ПереборЯчеек);//показать, что осталось
КонецЦИкла;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!