На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Как из Access открыть Excel выполнить в Excel макрос и закрыть с сохранением.
    Весь фак перерыл - ничего не нашел....
    Хотя скорее всего уже не раз обсасывалось.

    из Аксеса хочу открыть екселевский файл в который экспортировал данные. Числовые поля которые упрямо воспринимаются как текст привести в нормальный вид следующим кодом:
    ExpandedWrap disabled
      ActiveSheet.UsedRange.Select
      For Each tt In Selection.Cells
          tt.Value = tt.Value
      Next tt



    ____________________________
    Хор Веревки: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle: :whistle:

    Добавлено
    ExpandedWrap disabled
      Shell "cmd /X /C start c:\mydoc\example.xls"
    открывает - но как дальше выполнить там макрос пока не ясно.

    Добавлено
    Вот что получилось:
    ExpandedWrap disabled
      sse = "D:\My_doc\sliv.xls"
       
      Dim objExcel As Object
       
      Set objExcel = CreateObject("Excel.application")
      With objExcel
      .Workbooks.Add Template:=sse
      .Visible = True
      End With
       
      objExcel.ActiveSheet.UsedRange.Select
      For Each tt In objExcel.Selection.Cells
          tt.Value = tt.Value
      Next tt
      objExcel.Workbooks(1).Save
      objExcel.Application.Quit
       
      Set objExcel = Nothing

    Единственное думает очень долго....
    Если исходный макрос запускать из екселся - раз в 20 быстрее.

    за наведение на мысль спасибо Mongol и maxim84_
      немного модифицировал
      ExpandedWrap disabled
        sse = "D:\My_doc\sliv.xls"
         
        Dim objExcel As Object
         
        Set objExcel = CreateObject("Excel.application")
        With objExcel
        .Workbooks.Add Template:=sse
        .Visible = True
        End With
         
        objExcel.ActiveSheet.UsedRange.Select
        For Each tt In objExcel.Selection.Cells
            tt.Value = tt.Value
            rreee = tt.Address
        Next tt
        objExcel.Application.DisplayAlerts = False
        objExcel.Workbooks(1).SaveAs sse
        objExcel.Application.Quit
        Set objExcel = Nothing

      Но грабли вылезли в следующем: на полной базе это займет около часа (напомню в екселе это занимает 20 сек)
      Может есть нормальный способ выливать в ексель числа чтобы не приходилось так корячиться????
      напомню: при экспорте в ексель из аксеса числовые поля стают текстом - спасает от этого только процедура повторного присвоения значения(см код выше)

      ХЕЛП!!!!!!!!!! :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wacko: :wacko: :wacko:
      Сообщение отредактировано: Nick -
        Этого надо избегать
        ExpandedWrap disabled
          For Each tt In objExcel.Selection.Cells


        Вот так будет быстрее:
        ExpandedWrap disabled
          Const xlPasteValues = -4163
          Const xlCellTypeBlanks = 4
          Const xlPasteSpecialOperationAdd = 2
           
          Dim objExcel As Object, sse As String
          sse = "D:\My_doc\sliv.xls"
           
          Set objExcel = CreateObject("Excel.application")
          With objExcel
              .Workbooks.Open Filename:=sse, ReadOnly:=False
              .Cells.SpecialCells(xlCellTypeBlanks).Copy
              .ActiveSheet.UsedRange.PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd
              .DisplayAlerts = False
              .Workbooks(1).SaveAs Filename:=sse
              .Quit
          End With
          Set objExcel = Nothing
        Сообщение отредактировано: pvr -
          pvr даааа.....
          Повис ексель с аксесом и надежно - снял только через три пальца и то через 10 мин.
          То ли лыжи не едут толи я не лыжник....
          может как-то можно в екселе создавать макрос-запускать на выполнение-удалять макрос-закрывать с сохранением?


          pvr- все равно спасибо - показал иной подход.


          Вопрос остаётся открытым... :no-sad:

          Добавлено
          Манипуляции привели к твердому решению - никаких действий с ячейками в екселе из под объекта в аксесе. Уже на выделении ячеек связка виснет на минут 5.

          Следовательно уточняю задачу:

          Открыть ексель - это решено
          Создать в нем макрос определенного содержания - не решено
          Передать управление екселю и запустить макрос - не решено
          по окончании выполнения макроса - удалить все макросы в екселе - не решено
          сохранить и закрыть ексель - это решено
          передать управление аксесу - не решено
            Nick
            С точки зрения выполнения макроса - абсолютно всё-равно, кто его запускает, работать будет одинаково.
            Попробуй мой код выполнить по F8 из аксесса - какой его участок тормозит?

            И тот же код из самого Excel - только objExcel замени на Application.

            У меня одинаково отрабатывает.....

            Может у тебя при старте Excel куча каких-нибудь надстроек грузится?
              я же говорю - макрос сначала был написан в екселе - время выполнения - 20-40 секунд на всё.
              Даже операция выделения непустых ячеек - это 1-3 секунды если запускаешь макрос в екселе (по упомянутому тобой F8) против 5 минут - если это делаешь в аксесе.
              Операция копирования в твоём коде приводит к подвисанию связки (это если дождаться пока оно все выделит) - на работе процесора и памяти данный процес никак не отражается почему-то... :unsure:
              в моём же коде процес идет, но на каждую ячейку тратится очень много времени (10-20ячеек за секунду) при минимальном размере 2000*40 - это на долго....


              :'( :blink: :'(
                Цитата Nick @
                Создать в нем макрос определенного содержания - не решено
                Передать управление екселю и запустить макрос - не решено
                по окончании выполнения макроса - удалить все макросы в екселе - не решено

                Динамическое добавление и запуск макроса на языке VBA в среде разработки Visual Basic
                  Nick
                  Так какая строка моего кода подвисает -
                  Copy или PasteSpecial ???
                    2 pvr копирование.
                    2 Rust - спасибки - по виду самое оно!
                    пробовать не буду - уже далеко ушел.
                    Думаю линк в ФАК добавить стоит.


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


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0301 ]   [ 16 queries used ]   [ Generated: 24.08.25, 15:51 GMT ]