На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Ruby. Работа с Excel (формулы)
      Выполняю простейший скрипт:
      ExpandedWrap disabled
        require 'win32ole'
         
        ExcelApplication = WIN32OLE.new('Excel.Application')
        ExcelApplication.WorkBooks.Add
        ActiveSheet = ExcelApplication.ActiveSheet
        ActiveSheet.Cells(1, 1).Value = 1
        ActiveSheet.Cells(2, 1).Value = 2
        ActiveSheet.Cells(3, 1).Value = 3
        ActiveSheet.Cells(4, 1).Value = 4
        ActiveSheet.Cells(5, 1).Value = 5
        ActiveSheet.Cells(6, 1).FormulaR1C1 = '=СУММ(A1:A5)'
         
        ExcelApplication.Visible = TRUE

      Почему-то формула преобразуется в
      ExpandedWrap disabled
        =СУММ('A1':'A5')
      и, естественно, не работает.
      Пробовал подставлять такую формулу:
      ExpandedWrap disabled
        ActiveSheet.Cells(6, 1).FormulaR1C1 = '=SUBTOTAL(9,R[-5]C:R[-1]C)'
      - вообще матерится
      ExpandedWrap disabled
        test.rb:11: in 'method_missing': (WIN32OLERuntimeError)
            OLE error code:800A03EC in <Unknown>
              <No description>
            HRESULT error code:0x80020009
              ╬°шсър.   from test.rb:11

      Как подставить формулу так, чтобы в ячейку попадало именно то, что я туда передаю и не производился вызов неведомого метода?
        Скорее всего, вам нужно использовать не FormulaR1C1, а FormulaR1C1Local

        И тестеруйте предварительно в VBA
          xNut, давали бы хоть дельные советы...
          Код рабочий, он же на VBScript замечательно работает.

          Тут, как я понимаю, вся проблема в символе "=".
            Вот тут точно ошибка
            ExpandedWrap disabled
              ActiveSheet.Cells(6, 1).FormulaR1C1 = '=СУММ(A1:A5)'


            Я проверил, VB делает тоже самое, что и Ruby
            Сообщение отредактировано: xNut -
              Действительно, что-то я не то написал, скопировал, видимо, из кривого исходника, приношу извинения... Аналогичный код на VBScript тоже неведомо откуда вставляет кавычки. Непонятно, да ладно, будем считать, что с этим разобрались.

              Вот замечательно работающий код на VBScript:
              ExpandedWrap disabled
                Set ExcelApplication = CreateObject("Excel.Application")
                ExcelApplication.WorkBooks.Add
                Set ActiveSheet = ExcelApplication.ActiveSheet
                ActiveSheet.Cells(1, 1).Value = 1
                ActiveSheet.Cells(2, 1).Value = 2
                ActiveSheet.Cells(3, 1).Value = 3
                ActiveSheet.Cells(4, 1).Value = 4
                ActiveSheet.Cells(5, 1).Value = 5
                ActiveSheet.Cells(6, 1).FormulaR1C1 = "=SUM(R[-5]C:R[-1]C)"
                ExcelApplication.Visible = True

              Если на Ruby пытаться подставить формулу =SUM(R[-5]C:R[-1]C), то почему-то в ячейку попадает =SUM(A1:A5), хотя на VBScript записывается правильно: =СУММ(A1:A5).
              Это первое.
              Второе и главное: формулу =SUBTOTAL(9,R[-5]C:R[-1]C) на Ruby записать в ячейку не удается вовсе, так как генерируется вышеописанное исключение, а на VBScript все замечательно срабатывает.
                Я вам уже говорил, используйте LOCAL! Ruby только его понимает
                  Цитата xNut @
                  используйте LOCAL

                  ExpandedWrap disabled
                    ActiveSheet.Cells(6, 1).FormulaR1C1Local = '=SUM(R[-5]C:R[-1]C)'
                  Аналогично, в ячейку записывается =SUM(A1:A5).
                  ExpandedWrap disabled
                    ActiveSheet.Cells(6, 1).FormulaR1C1Local = '=SUBTOTAL(9,R[-5]C:R[-1]C)'
                  Аналогично, генерируется исключение.

                  Цитата xNut @
                  Ruby только его понимает
                  Не понимаю, как Ruby может понимать и не понимать свойства интерфейсов... Они либо есть, либо их нет.
                    А это в VB работает?
                    ExpandedWrap disabled
                      ActiveSheet.Cells(6, 1).FormulaR1C1Local = '=SUM(R[-5]C:R[-1]C)'
                      ActiveSheet.Cells(6, 1).FormulaR1C1Local = '=SUBTOTAL(9,R[-5]C:R[-1]C)'


                    Ruby вместо FormulaR1C1 вызывает FormulaR1C1Local, он не учитывает некоторых особенностей национальных настроек COM
                    Сообщение отредактировано: xNut -
                      Цитата xNut @
                      А это в VB работает?
                      Нет. Получается результат как в Ruby. Для первой строчки: =SUM(A1:A5); для второй:
                      Цитата
                      ---------------------------
                      Сервер сценариев Windows
                      ---------------------------
                      Сценарий: C:\test.vbs
                      Строка: 10
                      Символ: 1
                      Ошибка: Неизвестная ошибка выполнения
                      Код: 800A03EC
                      Источник: Ошибка выполнения Microsoft VBScript

                      ---------------------------
                      ОК
                      ---------------------------
                      А вот это уже совсем интересно. Получается, ошибка на совести MS? :huh:

                      А вот так на VBScript замечательно работает:
                      ExpandedWrap disabled
                        ActiveSheet.Cells(6, 1).FormulaR1C1Local = "=СУММ(R[-5]C:R[-1]C)"
                        ActiveSheet.Cells(6, 1).FormulaR1C1Local = "=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;R[-5]C:R[-1]C)"


                      На Ruby заработало в таком виде:
                      ExpandedWrap disabled
                        ActiveSheet.Cells(6, 1).FormulaR1C1Local = '=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(9;R[-5]C:R[-1]C)'


                      Блин, свихнешься с этим :wacko:
                      Я, признаться, в сторону национальных настроек даже не подумал. Спасибо, xNut :)
                        Есть еще неприятное свойство NumberFormatLocal, с ним вообще сложно бороться, т.к. на разных компьютерах могут быть разные системные настройки разделителей, а Excel может быть настроен как на использование системных, так и на использование своих региональных настроек

                        Проще тестировать Excel скрипты непосредственно в VBA, а не в VBScript
                        Сообщение отредактировано: xNut -
                          xNut, так ведь код, который я писал на Ruby, я переводил именно с VBA...

                          Еще такая неприятность имеется: такое решение, насколько я понимаю, работать будет только в русской Windows, так как подставляется русскоязычный вариант названия формулы. Использование свойства FormulaR1C1 и англоязычных названий формул избавляет от этой проблемы. Но вот как обратиться именно к FormulaR1C1, чтобы вместо него не шло обращение к FormulaR1C1Local?
                            Цитата Domino @
                            xNut, так ведь код, который я писал на Ruby, я переводил именно с VBA...

                            тогда откуда
                            Цитата Domino @
                            Сервер сценариев Windows


                            Да, не плохо бы подправить win32ole. Там нужно в GetIDsOfNames четвертым параметром подставлять 0. Во всяком случае, такое прошло с LuaCom. А почему вы выбрали Ruby, а не Lua?
                              Цитата xNut @
                              Цитата Domino @
                              xNut, так ведь код, который я писал на Ruby, я переводил именно с VBA...

                              тогда откуда
                              Цитата Domino @
                              Сервер сценариев Windows

                              Код поначалу я писал на VBA, потом переводил на Ruby, когда столкнулся с проблемой, проверил в VBScript, а когда увидел, что там работает, обратился на форум за помощью.

                              Цитата xNut @
                              А почему вы выбрали Ruby, а не Lua?

                              Никаких особых причин. Захотил изучить какой-нибудь динамический язык, выбор пал на Ruby. Впечатлили возможности Python, но он показался сложноватым для первого шага. Lua... А почему Lua? :)
                              Посмотрел описание языка и его возможностей в Википедии, понравилось, что Lua - "достаточно быстрый и нетрудный в освоении скриптовый язык программирования". Если считаете, что Lua заслуживает внимания, я легко могу переключиться на него.

                              Почему Ruby? Мне понравился синтаксис языка, относительная простота и мощные возможности. То есть, если вдуматься, то просто понравился.
                              Так как сейчас Ruby использую только в простых вещах (делать сложные мне пока не хватает квалификации), то с моими задачами справится любой язык.

                              xNut, почему рекомендуете Lua?
                                Сам на нем пишу и радуюсь 8-)
                                  И всё? 8-)
                                    Видимо, да. В общем, подумал-подумал и остановил выбор на Python 8-)
                                    Буду терзать змеюку.
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,0526 ]   [ 16 queries used ]   [ Generated: 26.04.24, 12:27 GMT ]