Программный доступ к проекту Visual Basic не является доверенным

313
26 ноября 2017, 12:08

Не получается запустить макрос vba в проекте c#. Подскажите, что я делаю не так. Сначала открываю excel файл,а затем прогоняю макрос. Но вылезает ошибка в строке "oModule = oWb.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule);" Программный доступ к проекту Visual Basic не является доверенным

string xlSheetPath = textBox1.Text;
        string ext = xlSheetPath.Substring(xlSheetPath.LastIndexOf("."),
            xlSheetPath.Length - xlSheetPath.LastIndexOf("."));
        int xlVersion = (xlSheetPath.Substring(xlSheetPath.LastIndexOf("."),
            xlSheetPath.Length - xlSheetPath.LastIndexOf(".")) == ".xls") ? 
 8 : 12;
        Microsoft.Office.Interop.Excel._Application xlApp = new 
  Excel.Application();
        xlApp.Visible = true;
        Excel.Workbook workbook = xlApp.Workbooks.Open(xlSheetPath);
        Excel.Worksheet worksheet = workbook.Sheets[1];

        //Где то тут включить макрос.
        Excel.Workbook oWb;
        Excel.Workbooks oWbs;
        Excel.Worksheet oSheet;
        VBA.VBComponent oModule;
        String sCode;
        //xlApp.SheetsInNewWorkbook = 1;
        oWbs = (Excel.Workbooks)xlApp.Workbooks;
        oWb = oWbs.Add(System.Reflection.Missing.Value);
        oSheet = xlApp.Worksheets.Add();
        oModule = 
 oWb.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule);
        sCode = "Sub copyTable()\r\n" +
            "Dim colRange As Variant\r\n" +
            "colRange = Array(1, 2, 3, 4, 5, 6, 7) 'Columns where your data 
  is'\r\n" +
            "Dim destColRange As Variant\r\n" +
            "destColRange = Array(10, 11, 12, 13, 14, 15, 16, 17) 'Columns 
  where you want data be copied'\r\n" +
            "n = UBound(colRange) - LBound(colRange)\r\n" +
            "i = 2 'Initial row'\r\n" +
            "newI = i\r\n" +
            "maxLen = 500 'Maximum size allowed in one cell'\r\n" +
            "While Not (Cells(i, colRange(0)) Is Nothing) And (Cells(i, 
  colRange(0)) <> \"\")\r\n" +
            "Text = Cells(i, colRange(n))\r\n" +
            "Do\r\n" +
            "For j = 0 To n - 1\r\n" +
            "Cells(newI, destColRange(j)) = Cells(i, colRange(j))\r\n" +
            "Next j\r\n" +
            "Cells(newI, destColRange(j)) = Mid(Text, 1, maxLen)\r\n" +
            "Text = Mid(Text, maxLen + 1)\r\n" +
            "newI = newI + 1\r\n" +
            "Loop Until Len(Text) <= 0\r\n" +
            "i = i + 1 \r\n" +
            "Wend\r\n" +
            "End Sub\r\n";
        oModule.CodeModule.AddFromString(sCode);
        sCode = null;
        xlApp.Run("[copyTable]", Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing);

....

Answer 1

Дело может быть в самом Excel. Статью по ссылке почитайте. Может поможет. Запрещен программируемый доступ к проекту на VBA для Office По сути нужно разрешить в выполнение в Excel всех макросов - изменить настройки безопасности.

Опция включения доступа к объектной модели находится в Excel 2013 по следующему пути Файл>Параметры>Центр управления безопасностью> Кнопка "Параметры центра управления безопасностью..." > Вкладка "Параметры макросов". Вам нужна галочка "Предоставлять доступ к объектной модели проектов VBA"

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

Answer 2

Еще один баг Вашего кода - с запуском 2 экземпляров Excel мы разобрались. А вот как я переписал ваш пример. Обратите внимание на то как я передал в метод Run имя макроса. Ну и я его еще укоротил маленько

`

using System;
using System.Windows.Controls;
using System.Windows;
using Excel = Microsoft.Office.Interop.Excel;
using VBA = Microsoft.Vbe.Interop;
namespace MarginMove
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Excel1();
        }
        public void Excel1()
        { 
        Excel.Application xlApp = new Excel.Application();
        xlApp.Visible = true;
        //Это ваша проблема с 2 книгами
        //  Excel.Workbook workbook = xlApp.Workbooks.Add();
        //    Excel.Worksheet worksheet = workbook.Sheets[1];
        //Где то тут включить макрос.
        Excel.Workbook oWb;
        Excel.Workbooks oWbs;
        Excel.Worksheet oSheet;
        VBA.VBComponent oModule;
        String sCode;
        //xlApp.SheetsInNewWorkbook = 1;
        oWbs = (Excel.Workbooks)xlApp.Workbooks;
        oWb = oWbs.Add(System.Reflection.Missing.Value);
        oSheet = xlApp.Worksheets.Add();
        oModule =  oWb.VBProject.VBComponents.Add(VBA.vbext_ComponentType.vbext_ct_StdModule);
        sCode = "Sub copyTable()\r\n" + "MsgBox(\"123\")\r\n" + "End Sub\r\n";
        oModule.CodeModule.AddFromString(sCode);
        sCode = null;
        xlApp.Run("copyTable()", Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing);
        }
    }
}

`

READ ALSO
Unity загрузка спрайта из сети

Unity загрузка спрайта из сети

Здравствуйте, как в Unity объекту UI Image присвоить спрайт из сети, по определенной ссылке? Или как его можно загрузить в проект и сохранить в нем...

237
cudafy получение активной информации

cudafy получение активной информации

как на C# в библиотеке cudafy получить информацию о температуре видеокарты, на сколько она загружена и возможно ли управлять её частотой и напряжением?

192
Конструктор List&lt;T&gt;(IEnumerable&lt;T&gt;)?

Конструктор List<T>(IEnumerable<T>)?

Добрый деньВозник вопрос следующего характера: согласно офф

406
Унаследовать форму

Унаследовать форму

Хочу создать форму на основе существующейПытаюсь унаследовать базовую форму-родителя: public partial class Order : EmployeeClass

197