И я не вижу никакой разницы между модулями, которые я могу прочитать, и теми, которые я не могу. Поскольку буквально нет никаких свойств для модуля, кроме имени ...

звлечь весь код VBA (формы, модули, отчеты) из более чем ста баз данных Access через c #.

Невозможно изменить базы данных и / или добавить код VBA к ним. Извлечение Кодекса должно быть сделано только для чтения.

Я попробовал этот код:

var appClass = new ApplicationClass();

appClass.OpenCurrentDatabase(@"C:\Temp\Test\FBIOE.mdb", false, "");

Console.WriteLine(appClass.Version);
Console.WriteLine(appClass.Modules.Count.ToString());
Console.WriteLine(appClass.Modules.Parent.ToString());

int NumOfLines = 0;
Console.WriteLine("Anzahl Module:" + appClass.Modules.Count.ToString());
for (int i = 0; i < appClass.Modules.Count; i++)
{
    Console.WriteLine(appClass.Modules[i].Name + " : " + appClass.Modules[i].CountOfLines);
    NumOfLines += appClass.Modules[i].CountOfLines;
    //Console.WriteLine(appClass.Modules[i].Name + " : " + appClass.Modules[i].ToString());
}

Console.WriteLine("Number of Lines : " + NumOfLines);
Console.ReadKey();

Но у этого Кодекса есть некоторые проблемы:

Он запускает autoexec-macro, что очень плохо, так как все базы данных делают разные опасные вещи при запуске.Кажется, не каждый модуль. Многие из них, кажется, пропущены. В моей тестовой базе данных более 53 модулей (не считая форм и отчетов), но appClass.Modules.Count равен 44 (и есть формы и отчеты в комплекте)

Редактировать:

Я нашел способ прочитать весь Кодекс:

    appClass.OpenCurrentDatabase(tempFile, false, "");

Debug.WriteLine("appClass.CurrentProject.AllForms.Count:" + appClass.CurrentProject.AllForms.Count.ToString());
Debug.WriteLine("appClass.CurrentProject.AllMacros.Count:" + appClass.CurrentProject.AllMacros.Count.ToString());
Debug.WriteLine("appClass.CurrentProject.AllModules.Count:" + appClass.CurrentProject.AllModules.Count.ToString());
Debug.WriteLine("appClass.CurrentProject.AllReports.Count:" + appClass.CurrentProject.AllReports.Count.ToString());
var currentProject = appClass.CurrentProject;

for (int i = 0; i < appClass.CurrentProject.AllForms.Count; i++)
{
    var form = appClass.CurrentProject.AllForms[i];
    Debug.WriteLine("Erledige: " + file+ " Item: " + form.FullName);
    appClass.SaveAsText(AcObjectType.acForm, form.FullName, absolutesVerzeichnis + "Form_"+form.FullName + ".txt");
}

for (int i = 0; i < appClass.CurrentProject.AllMacros.Count; i++)
{
    var macro = appClass.CurrentProject.AllMacros[i];
    Debug.WriteLine("Erledige: " + file + " Item: " + macro.FullName);
    appClass.SaveAsText(AcObjectType.acMacro, macro.FullName, absolutesVerzeichnis + "Makro_" + macro.FullName + ".txt");
}

for (int i = 0; i < appClass.CurrentProject.AllModules.Count; i++)
{
    var module = appClass.CurrentProject.AllModules[i];
    Debug.WriteLine("Erledige: " + file + " Item: " + module.FullName);
    appClass.SaveAsText(AcObjectType.acModule, module.FullName, absolutesVerzeichnis + module.FullName + ".txt");
}

for (int i = 0; i < appClass.CurrentProject.AllReports.Count; i++)
{
    var report = appClass.CurrentProject.AllReports[i];
    Debug.WriteLine("Erledige: " + file + " Item: " + report.FullName);
    appClass.SaveAsText(AcObjectType.acReport, report.FullName, absolutesVerzeichnis + "Report_" + report.FullName + ".txt");
}

Это отлично работает. Но главная проблема остается той же:

Код autoexec выполняется, и если в нем есть ошибки, извлечение останавливается.

Ответы на вопрос(0)

Ваш ответ на вопрос