Майкрософт.Офис.Взаимодействие.Excel: отсутствует WorkbookQuery?

#c# #.net #vba #excel-interop

#c# #.net #vba #excel-interop

Вопрос:

Я написал некоторый VBA, который перебирает запросы PowerQuery в рабочей книге и экспортирует формулу M в отдельные файлы, и мне пришла в голову глупая идея написать дополнение Excel для этого вместо того, чтобы вставлять его во все рабочие книги, которые могут в нем нуждаться. Проблема в том, что коллекция запросов рабочей книги недоступна в interop.excel, а коллекция таблиц запросов не возвращает формулу M. Кто-нибудь знает, как я могу получить доступ к коллекции запросов рабочей книги, если не добавлять приведенный ниже VBA и запускать его программно?

         For Each qry In ThisWorkbook.Queries
            filepath = directory amp; qry.Name amp; ".txt"
            Set filestream = fso.CreateTextFile(filepath, True)
            arr = Split(qry.Formula, Chr$(10))
            For i = LBound(arr, 1) To UBound(arr, 1)
                filestream.WriteLine (arr(i))
            Next i
            filestream.Close
        Next qry
  

Редактировать: для некоторых разъяснений вот как выглядит c # (с использованием Excel = Microsoft.Офис.Взаимодействие.Excel). Проблема в том, что я не могу сделать что-то вроде foreach(Excel.WorkbookQuery qry в wkbk.Запросы) {} здесь

         void Application_WorkbookAfterSave(Excel.Workbook wkbk, bool suc)
        {
            string wkbk_name = Path.GetFileNameWithoutExtension(wkbk.Name);
            string wkbk_path = wkbk.Path   "\"   wkbk_name;
            DialogResult save_res = MessageBox.Show("Do you want to save scripts?", wkbk_name, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            
            if(save_res == DialogResult.Yes)
            {
                if(!Directory.Exists(wkbk_path))
                {
                    Directory.CreateDirectory(wkbk_path);
                }   
            }
        }
  

Комментарии:

1. ThisWorkbook так же легко может быть ActiveWorkbook , и вы можете написать свою надстройку как xlam…

2. Проблема заключается не в идентификации объекта рабочей книги, а в коллекции запросов рабочей книги. VBA допускает <объект рабочей книги>.запросы, в то время как interop.excel, похоже, не является проблемой.

3. Я только предложил вам рассмотреть возможность использования VBA для вашей надстройки вместо C #, если это не предлагает все необходимые вам интерфейсы

4. ..или, может быть, попробуйте использовать позднюю привязку и посмотреть, сможете ли вы получить доступ к свойству запросов: xspdf.com/questions/41914.shtml