برمجيا استخراج الكلي (VBA) رمز من مستندات Word 2007
-
09-06-2019 - |
سؤال
هل من الممكن استخراج كافة التعليمات البرمجية لـ VBA من Word 2007 "docm" الوثيقة باستخدام API ؟
لقد وجدت كيفية إدراج التعليمات البرمجية لـ VBA في وقت التشغيل و كيفية حذف كافة التعليمات البرمجية ل VBA ، ولكن لا سحب الرمز الفعلي إلى تيار أو السلسلة التي لا يمكن تخزين (و تضاف إلى وثائق أخرى في المستقبل).
أي نصائح أو الموارد سيكون موضع تقدير.
تحرير:بفضل الجميع ، خنزير الأرض's الجواب هو بالضبط ما كنت أبحث عنه.أنا حولت له البرمجية C#, و كان قادرا على استدعاء من مكتبة فئة باستخدام Visual Studio 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;
}
المحلول
سيكون لديك لإضافة مرجع إلى Microsoft Visual Basic عن تطبيقات للتوسعة 5.3 (أو أيا كان لديك نسخة).لدي VBA SDK و هذا على بلدي مربع - حتى هذا قد لا يكون بالضبط ما مكتب السفن.
أيضا لديك لتمكين الوصول إلى طراز كائن VBA على وجه التحديد - انظر "مركز التوثيق" في خيارات Word.هذا بالإضافة إلى جميع إعدادات أمان الماكرو يوفر المكتب.
هذا المثال سيتم استخراج الكود من الوثيقة الحالية في حياتنا - هو نفسه ماكرو VBA (و سيتم عرض نفسه أي رمز آخر أيضا).وهناك أيضا تطبيق.vbe.VBProjects جمع الوصول إلى وثائق أخرى.في حين لم تفعل ذلك ، أفترض تطبيق خارجي يمكن فتح الملفات باستخدام هذا VBProjects جمع كذلك.الأمن هو مضحك مع هذه الاشياء لذلك قد تكون خادعة.
وأتساءل أيضا ما docm تنسيق الملف الآن - XML مثل docx?من شأنه أن يكون أفضل نهج ؟
Sub GetCode()
Dim prj As VBProject
Dim comp As VBComponent
Dim code As CodeModule
Dim composedFile As String
Dim i As Integer
Set prj = ThisDocument.VBProject
For Each comp In prj.VBComponents
Set code = comp.CodeModule
composedFile = comp.Name & vbNewLine
For i = 1 To code.CountOfLines
composedFile = composedFile & code.Lines(i, 1) & vbNewLine
Next
MsgBox composedFile
Next
End Sub
نصائح أخرى
هل يمكن تصدير رمز الملفات ثم قراءتها مرة أخرى.
لقد تم استخدام رمز أدناه أن تساعدني في الحفاظ على بعض Excel وحدات الماكرو ضمن التحكم بالمصادر (باستخدام التخريب & TortoiseSVN).أساسا صادرات كل رمز إلى ملفات نصية أي وقت الحفظ مع محرر VBA مفتوحة.أضع ملفات نصية في التخريب حتى أستطيع أن تفعل ديفس.يجب أن تكون قادرة على التكيف/سرقة بعض من هذا العمل في Word.
التسجيل تحقق في CanAccessVBOM() يتوافق مع "الثقة الوصول إلى مشروع Visual Basic" في إعداد الأمان.
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