문제

은 그것을 가능하물의 모든 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top