[.net] برمجيا استخراج ماكرو (فبا) التعليمات البرمجية من مستندات ورد 2007


Answers

يمكنك تصدير التعليمات البرمجية إلى الملفات ثم قراءتها مرة أخرى.

لقد تم استخدام التعليمات البرمجية أدناه لمساعدتي في الحفاظ على بعض وحدات الماكرو إكسل تحت السيطرة المصدر (باستخدام سوبفيرزيون و تورتوازيسفن). فإنه أساسا تصدير كافة التعليمات البرمجية إلى ملفات نصية في أي وقت أقوم بحفظ مع محرر فبا مفتوحة. أضع الملفات النصية في التخريب بحيث يمكنني القيام ديفس. يجب أن تكون قادرا على التكيف / سرقة بعض من هذا للعمل في ورد.

تسجيل التسجيل في كاناتسفبوم () يتوافق مع "الوصول إلى الثقة في فيسوال باسيك بروجيكت" في إعداد الأمان.

Sub ExportCode()

    If Not CanAccessVBOM Then Exit Sub ' Exit if access to VB object model is not allowed
    If (ThisWorkbook.VBProject.VBE.ActiveWindow Is Nothing) Then
        Exit Sub ' Exit if VBA window is not open
    End If
    Dim comp As VBComponent
    Dim codeFolder As String

    codeFolder = CombinePaths(GetWorkbookPath, "Code")
    On Error Resume Next
    MkDir codeFolder
    On Error GoTo 0
    Dim FileName As String

    For Each comp In ThisWorkbook.VBProject.VBComponents
        Select Case comp.Type
            Case vbext_ct_ClassModule
                FileName = CombinePaths(codeFolder, comp.Name & ".cls")
                DeleteFile FileName
                comp.Export FileName
            Case vbext_ct_StdModule
                FileName = CombinePaths(codeFolder, comp.Name & ".bas")
                DeleteFile FileName
                comp.Export FileName
            Case vbext_ct_MSForm
                FileName = CombinePaths(codeFolder, comp.Name & ".frm")
                DeleteFile FileName
                comp.Export FileName
            Case vbext_ct_Document
                FileName = CombinePaths(codeFolder, comp.Name & ".cls")
                DeleteFile FileName
                comp.Export FileName
        End Select
    Next

End Sub
Function CanAccessVBOM() As Boolean
    ' Check resgistry to see if we can access the VB object model
    Dim wsh As Object
    Dim str1 As String
    Dim AccessVBOM As Long

    Set wsh = CreateObject("WScript.Shell")
    str1 = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & _
        Application.Version & "\Excel\Security\AccessVBOM"
    On Error Resume Next
    AccessVBOM = wsh.RegRead(str1)
    Set wsh = Nothing
    CanAccessVBOM = (AccessVBOM = 1)
End Function


Sub DeleteFile(FileName As String)
    On Error Resume Next
    Kill FileName
End Sub

Function GetWorkbookPath() As String
    Dim fullName As String
    Dim wrkbookName As String
    Dim pos As Long

    wrkbookName = ThisWorkbook.Name
    fullName = ThisWorkbook.fullName

    pos = InStr(1, fullName, wrkbookName, vbTextCompare)

    GetWorkbookPath = Left$(fullName, pos - 1)
End Function

Function CombinePaths(ByVal Path1 As String, ByVal Path2 As String) As String
    If Not EndsWith(Path1, "\") Then
        Path1 = Path1 & "\"
    End If
    CombinePaths = Path1 & Path2
End Function

Function EndsWith(ByVal InString As String, ByVal TestString As String) As Boolean
    EndsWith = (Right$(InString, Len(TestString)) = TestString)
End Function
Question

هل من الممكن استخراج كافة التعليمات البرمجية فبا من مستند ورد 2007 "دوم" باستخدام أبي؟

لقد وجدت كيفية إدراج التعليمات البرمجية فبا في وقت التشغيل، وكيفية حذف كافة التعليمات البرمجية فبا، ولكن لا سحب التعليمات البرمجية الفعلية في تيار أو سلسلة التي يمكنني تخزين (وإدراجها في وثائق أخرى في المستقبل).

أي نصائح أو الموارد سيكون موضع تقدير.

تحرير : بفضل الجميع، كان رد آردفارك 's بالضبط ما كنت أبحث عنه. لقد حولت التعليمات البرمجية له إلى C #، وكان قادرا على استدعائها من مكتبة فئة باستخدام فيسوال ستوديو 2008.

using Microsoft.Office.Interop.Word;
using Microsoft.Vbe.Interop;

...

public List<string> GetMacrosFromDoc()
{
    Document doc = GetWordDoc(@"C:\Temp\test.docm");

    List<string> macros = new List<string>();

    VBProject prj;
    CodeModule code;
    string composedFile;

    prj = doc.VBProject;
    foreach (VBComponent comp in prj.VBComponents)
    {
        code = comp.CodeModule;

        // Put the name of the code module at the top
        composedFile = comp.Name + Environment.NewLine;

        // Loop through the (1-indexed) lines
        for (int i = 0; i < code.CountOfLines; i++)
        {
            composedFile += code.get_Lines(i + 1, 1) + Environment.NewLine;
        }

        // Add the macro to the list
        macros.Add(composedFile);
    }

    CloseDoc(doc);

    return macros;
}



Links