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

Тема в разделе "1C и всё что с ней связано", создана пользователем ech, 15 фев 2009.

  1. ech

    ech Гость

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ухх - знаю пока только переборами - а там после получения ячейки Найти(СтрокаЭкселя,"Sum")>0 и из неё выцеплять кусая по запятым.
     
  3. ech

    ech Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    ну примерно так -

    Прайс=СоздатьОбъект("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; // Не уверен насчет символьных имен колонок - пользовался только числовыми.

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

    ech Гость

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Наверно не поняли - ячейка с формулой содержит текст формулы, в которой фигурируют ссылки на ячейки с слагаемыми значениями. Сначалы ты получаешь текст формулы в виде строки, потом откусываешь/вытаскиваешь из него ссылки на ячейки, позиционируешся на них и пишешь их значения в справочник.
     
  7. ech

    ech Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    ага - до первой ячейки добираешся как я написал, после того как вытащил оттуда всё, откусываешь всё что слева от неё в тексте формулы и снова ищешь запятую в обкусаном тексте формулы. Если нашел - значит есть ещё ячейка.
     
  9. ech

    ech Гость


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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    дойдешь до затыка - пиши.
     
  11. ech

    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
     
  12. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    А в сообщить что дает?
     
  13. ech

    ech Гость

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Что сообщает про первую ячейку?


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

    ech Гость

    Первая ячейка С1 Сообщает первые две ссылки на ячейки "(C11,C13,"
     
  16. puh14

    puh14 Well-Known Member
    1C Team

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

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

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

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

    ech Гость

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Очень странно - должен был дальше обрезать.
    Добавь сообщить(товар) - что он там покажет.
    заодно и сообщить(Строка(товар))
     
  19. ech

    ech Гость

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

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


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

    выдает

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

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    ещё более странно - он должен найти первую запятуюи по неё откусить, а ты ещё на шесть символов назад откатываешся.

    попробуй так
    ПерваяЯчейка = Сред(Товар,Найти(Товар,"(")+1,Найти(Товар,")"));//выделил диапозон адресов, должно быть что-то типа "C11,C13,C32,C197" - если нет, дальше не сработает
    Сообщить(перваяЯчейка);
    ПереборЯчеек = Строка(ПерваяЯчейка);//присвоение отдельной переменной строки с полями через запятую для откусывания в цикле
    Пока Найти(ПереборЯчеек,",") >0 Цикл//Цикл кусания переборячеек по запятым
    ТоварЯчейки = ВходExcel.ActiveWorkbook.activesheet.cells(Сред(ПереборЯчеек,2,Найти(ПереборЯчее
    к,",")),Лев(ПереборЯчеек,1)).Value;//строка откусывается с второго символа по запятую, столбец - первый символ строки
    Сообщить(ТоварЯчейки);//проверка поймал-ли. Можешь добавить вывод столбца и ячейки для проверки
    ПереборЯчеек = Сред(ПереборЯчеек,Найти(переборЯчеек,",")+1);//откусывание обработаной части включительно с запятой
    Сообщить(ПереборЯчеек);//показать, что осталось
    КонецЦИкла;
     
Загрузка...
Похожие Темы - Формулы Екселе 1С
  1. Луиза
    Ответов:
    3
    Просмотров:
    371
  2. motogarri
    Ответов:
    11
    Просмотров:
    833
  3. Dimok-163rus
    Ответов:
    0
    Просмотров:
    954
  4. KatyaVm22
    Ответов:
    14
    Просмотров:
    3.610
  5. Xatiko
    Ответов:
    1
    Просмотров:
    1.508

Поделиться этой страницей