使用Ms-WORD将VBA宏代码更改为VB express 2010项目的问题

时间:2012-08-13 16:34:48

标签: vb6 ms-word

我正在开发一个VB表单,它将word文档作为用户的输入,并将逐段拆分文档并为每个部分创建一个新文档。我面临以下问题。 1.我正在将word doc中作为宏运行的代码调整为新项目。我收到了像

这样的错误
'Application' is ambiguous, imported from the namespaces or types 'Microsoft.Office.Interop.Word, System.Net.Mime.MediaTypeNames'.
'wdStory' is not declared. It may be inaccessible due to its protection level.
Reference to a non-shared member requires an object reference.
'wdStyleHeading1' is not declared. It may be inaccessible due to its protection level.
'wdFindStop' is not declared. It may be inaccessible due to its protection level.
Reference to a non-shared member requires an object reference.
Reference to a non-shared member requires an object reference.
'wdSectionBreakContinuous' is not declared. It may be inaccessible due to its protection level.
'Application' is ambiguous, imported from the namespaces or types 'Microsoft.Office.Interop.Word, System.Net.Mime.MediaTypeNames'.
Reference to a non-shared member requires an object reference.
Reference to a non-shared member requires an object reference.
'wdLine' is not declared. It may be inaccessible due to its protection level.
'wdExtend' is not declared. It may be inaccessible due to its protection level.
'wdCharacter' is not declared. It may be inaccessible due to its protection level.
'ChangeFileOpenDirectory' is not declared. It may be inaccessible due to its protection level.
'Application' is ambiguous, imported from the namespaces or types 'Microsoft.Office.Interop.Word, System.Net.Mime.MediaTypeNames'.

我觉得他们都是类似的错误,我错过了sm导入库? 请告诉我任何必须明确导入的库/类。 还可以找到代码beloow。

Imports System.Net.Mime.MediaTypeNames
Imports System.Runtime.InteropServices
Imports Word = Microsoft.Office.Interop.Word
Imports Microsoft.Office.Interop.Word

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If TextBox1.Text = "" Then
        MessageBox.Show("Enter a valid file Name", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End If
    Dim filextn As String = Nothing
    Dim myfile As String = Nothing

    myfile = TextBox1.Text ' not working

    Dim oWord As New Word.Application
    Dim odoc As New Word.Document
    Dim DocNum As Integer
    Dim onewword As Word.Application
    Dim onewdoc As Word.Document

    'Start Word and open the document template.
    odoc = oWord.Documents.Open("C:\Users\jy11125t\Desktop\MachineLearning\Doc\1.docx")
    oWord.WindowState = Word.WdWindowState.wdWindowStateNormal
    oWord.Visible = True

    ' Used to set criteria for moving through the document by section.
    Dim iParagraph As Word.Paragraph
    Dim sel As Word.Selection

    ' Inserting section break after every section in the open word doc
    Application.ScreenUpdating = False
    Selection.HomeKey(Unit:=wdStory)
    With Selection.Find
    .ClearFormatting()
    .Replacement.ClearFormatting()
    .Format = True
    ' You can specify another style if you like
    .Style = odoc.Styles(wdStyleHeading1)
    .Forward = True
    .Wrap = wdFindStop
    Do While .Execute
        Selection.Collapse()
        If Selection.Start > 0 Then
            Selection.InsertBreak(Type:=wdSectionBreakContinuous)
            End If
            .Execute()
        Loop
    End With
    Application.ScreenUpdating = True


    ' Application.Browser.Target = wdBrowseSection

    'A mail merge document ends with a section break next page.
    'Subtracting one from the section count stop error message.
    For i = 1 To ((onewdoc.Sections.Count) - 1)

        'Note: If a document does not end with a section break,
        'substitute the following line of code for the one above:
        'For I = 1 To ActiveDocument.Sections.Count

        'Select and copy the section text to the clipboard.
        onewdoc.Bookmarks("\Section").Range.Copy()
        'For Each iParagraph In Word.Selection.Paragraphs
        'If iParagraph.Style = ActiveDocument.Styles("Heading 1") Then
        ' filenam = iParagraph.Range.Text
        ' filenam = Left(filenam, Len(filenam) - 1)
        ' End If

        'Create a new document to paste text from clipboard.
        onewword = CreateObject("Word.Application")
        onewword.Visible = True
        onewdoc = onewword.Documents.Add
        onewdoc.paste()

        Documents.Add()
        Selection.Paste()

        ' Removes the break that is copied at the end of the section, if any.
        Selection.MoveUp(Unit:=wdLine, Count:=1, Extend:=wdExtend)
        Selection.Delete(Unit:=wdCharacter, Count:=1)
        ChangeFileOpenDirectory("C:\Users\jy11125t\Desktop\MachineLearning\Doc\Split_files")
        DocNum = DocNum + 1
        onewdoc.SaveAs(FileName:=DocNum & ".doc")
        onewdoc.Close()
        ' Move the selection to the next section in the document.
        Application.Browser.Next()
        'Next iParagraph
    Next i
    ' ActiveDocument.Close savechanges:=wdDoNotSaveChanges

    'Me.Close()

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    OpenFileDialog1.ShowDialog()
    TextBox1.Text = OpenFileDialog1.FileName

End Sub

1 个答案:

答案 0 :(得分:0)

与VB6不同,在.NET中,Word常量(wdExtend,WdStory等)不会仅通过添加引用自动变为可用。它们 仍然可用,但您必须使用它们派生自的命名空间来限定它们,并且它们不是全部在同一个地方。找出它们所在位置的最简单方法是使用对象浏览器进行搜索(按F2)。例如:wdStory位于Microsoft.Office.Interop.Word.wdUnits.wdStory

您可以通过在类代码之外导入公共部分来跳过符合条件的命名空间的大多数

Imports Microsoft.Office.Interop.Word 

然后你只需要知道每个项目属于哪个分支:

WdUnits.wdStory
WdBuiltinStyle.wdStyleHeading
WdFindWrap.wdFindStop
WdBreakType.wdSectionBreakContinuous
WdUnits.wdLine
WdMovementType.wdExtend
WdUnits.wdCharacter

当然这看起来仍然很麻烦,所以另一种方法是自己定义常量,分配可以在对象浏览器中找到的值:

Const wdStory As Integer = 6
Const wdStyleHeading1 As Integer = -2
Const wdFindStop As Integer = 0
Const wdSectionBreakContinuous As Integer = 3
Const wdLine As Integer = 5
Const wdExtend As Integer = 1
Const wdCharacter As Integer = 1