프로그래밍 방식으로 추출물 매크로(VBA)코드에서 Word 문서 2007
-
09-06-2019 - |
문제
은 그것을 가능하물의 모든 VBA 코드에서"말씀 2007docm"문서를 사용하 API?
내가 찾는 방법을 삽입 VBA 에 코드를 런타임,그리고 어떻게 삭제하는 모든 VBA 코드,하지만 당기지 실제 코드 스트림으로 또는 문자열을 저장할 수 있는(삽입하고 다른 문서에서 미래).
어떤 조언이나 자원에 감사하겠습니다.
편집:모두에게 감사합니다, Aardvark's 답했다 정확히 무엇을 찾고 있었습니다.나는 변환된 그의 코드는 C#,전화기에서 클래스 라이브러리를 사용하여 Visual Studio2008.
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 기본적인 응용을 위한 확장성 5.3(또는 어떤 버전이 있습니다).가 VBA SDK 그리고 이러한 나란-그래서 이것이 정확히 일치하지 않을 수 있습니다 어떤 사무실 선박니다.
또한 당신은에 액세스할 수 있도록 설정합니다 VBA 객체 모델을 구체적으로 보면"믿 센터에서"단어는 옵션이 있습니다.이에 더하여 다른 모든 매크 보안 설정 Office 제공합니다.
이 예제 코드를 추출물로서 현재 문서의 그 생활에서-그것은 그 자체가 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 편집기로 열려 있습니다.을 넣어 텍스트 파일을 파괴할 수 있도록 하 diff.당신이해야에 적응할 수 있/훔치는 일부의 이 작업에는 단어입니다.
레지스트리에서 확인 CanAccessVBOM()에 해당하"신뢰각 기본적인 프로젝트에서"보안 설정입니다.
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