Не получается запустить макрос 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);
....
Дело может быть в самом Excel. Статью по ссылке почитайте. Может поможет. Запрещен программируемый доступ к проекту на VBA для Office По сути нужно разрешить в выполнение в Excel всех макросов - изменить настройки безопасности.
Опция включения доступа к объектной модели находится в Excel 2013 по следующему пути Файл>Параметры>Центр управления безопасностью> Кнопка "Параметры центра управления безопасностью..." > Вкладка "Параметры макросов". Вам нужна галочка "Предоставлять доступ к объектной модели проектов VBA"
Если у вас другой Excel - попробуйте поискать в сети где она находится. По идее все должно быть примерно там же.
Еще один баг Вашего кода - с запуском 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);
}
}
}
`
Здравствуйте, как в Unity объекту UI Image присвоить спрайт из сети, по определенной ссылке? Или как его можно загрузить в проект и сохранить в нем...
как на C# в библиотеке cudafy получить информацию о температуре видеокарты, на сколько она загружена и возможно ли управлять её частотой и напряжением?
Добрый деньВозник вопрос следующего характера: согласно офф
Хочу создать форму на основе существующейПытаюсь унаследовать базовую форму-родителя: public partial class Order : EmployeeClass