Word VBA 宏尝试将值插入书签时出错

发布于 2024-07-22 04:18:38 字数 2078 浏览 3 评论 0原文

我正在尝试编写一个 Word 宏,它将注册表中当前用户的数据插入到文档中的预定义书签中。 我有一个 ini 文件,它规定了每个注册表项的名称,然后将该值导入到 Word 宏中的循环中。 这工作得很好(我认为),但是 Word 宏也需要将数据插入到文档中。 如果书签存在,则效果很好,但如果不存在,则宏似乎无论如何都会插入数据。 我不想要这样。 我只希望宏在有与该名称对应的书签时插入数据。 我已经做到了,每个书签都需要被称为““Bookmark”& sBookMarkname”。

这是代码..

Sub MalData()
    ''
    ''// MalData Macro
    ''

    Dim objShell
    Dim strShell
    Dim strDataArea
    Dim Verdier() As String
    Dim regPath
    Dim regString
    Dim Felter
    Dim WScript

    Dim sFileName As String
    Dim iFileNum As Integer
    Dim sBuf As String


    sFileName = "C:\felter.ini"
    If Len(Dir$(sFileName)) = 0 Then
        MsgBox ("Can't find " & sFileName)
    End If

    ''//Load values from ini-file which is later used to query the registry

    Set objShell = CreateObject("Wscript.Shell")

    With New Scripting.FileSystemObject
    With .OpenTextFile(sFileName, ForReading)

        If Not .AtEndOfStream Then regPath = .ReadLine
        If Not .AtEndOfStream Then regString = .ReadLine

        Do Until .AtEndOfStream
            Felter = .ReadLine

            On Error Resume Next
            Dim sBookMarkName, sVerdi
            sBookMarkNametemp = "Bookmark" & Felter
            MsgBox (sBookMarkNametemp)
            sVerdi = objShell.RegRead(regPath & "\" & Felter) ''"

            sBookMarkName = ""
            sBookMarkName = (sBookMarkNametemp)

            If sVerdi <> Felter Then
                Selection.GoTo What:=wdGoToBookmark, Name:=sBookMarkName
                Selection.Delete Unit:=wdCharacter, Count:=0
                Selection.InsertAfter sVerdi
                ActiveDocument.Bookmarks.Add Range:=Selection.Range, Name:=sBookMarkName
            End If
        Loop

        On Error GoTo 0
    End With
    End With

End Sub

现在,错误发生在此处:

sVerdi = objShell.RegRead(regPath & "\" & Felter) ''"

sBookMarkName = ""
sBookMarkName = (sBookMarkNametemp)

If sVerdi <> Felter Then

即使注册表仅包含三个键,宏也会遍历从文本文件获取的每个名称并多次插入最后一个注册表键。

I'm trying to write a Word macro which inserts data from the Current User in Registry into predefined bookmarks in the document. I've got an ini-file which dictates what the names of each registry entry is, and that value is then imported into a loop in the Word Macro. This works fine (I think), but the Word macro needs to insert the data into the document as well. And this works fine if the bookmarks are there, but if they aren't, the macro seems to insert data anyway. I don't want that. I just want the macro to insert the data IF there's a bookmark coresponding to the name. I've made it so that each bookmark needs to be called ""Bookmark" & sBookMarkname".

And here's the code..

Sub MalData()
    ''
    ''// MalData Macro
    ''

    Dim objShell
    Dim strShell
    Dim strDataArea
    Dim Verdier() As String
    Dim regPath
    Dim regString
    Dim Felter
    Dim WScript

    Dim sFileName As String
    Dim iFileNum As Integer
    Dim sBuf As String


    sFileName = "C:\felter.ini"
    If Len(Dir$(sFileName)) = 0 Then
        MsgBox ("Can't find " & sFileName)
    End If

    ''//Load values from ini-file which is later used to query the registry

    Set objShell = CreateObject("Wscript.Shell")

    With New Scripting.FileSystemObject
    With .OpenTextFile(sFileName, ForReading)

        If Not .AtEndOfStream Then regPath = .ReadLine
        If Not .AtEndOfStream Then regString = .ReadLine

        Do Until .AtEndOfStream
            Felter = .ReadLine

            On Error Resume Next
            Dim sBookMarkName, sVerdi
            sBookMarkNametemp = "Bookmark" & Felter
            MsgBox (sBookMarkNametemp)
            sVerdi = objShell.RegRead(regPath & "\" & Felter) ''"

            sBookMarkName = ""
            sBookMarkName = (sBookMarkNametemp)

            If sVerdi <> Felter Then
                Selection.GoTo What:=wdGoToBookmark, Name:=sBookMarkName
                Selection.Delete Unit:=wdCharacter, Count:=0
                Selection.InsertAfter sVerdi
                ActiveDocument.Bookmarks.Add Range:=Selection.Range, Name:=sBookMarkName
            End If
        Loop

        On Error GoTo 0
    End With
    End With

End Sub

Now, the error happens at about here:

sVerdi = objShell.RegRead(regPath & "\" & Felter) ''"

sBookMarkName = ""
sBookMarkName = (sBookMarkNametemp)

If sVerdi <> Felter Then

Even if the registry only contains three keys, the macro goes through every name gotten from the text file and inserts the last registry key multiple times.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

安静 2024-07-29 04:18:38

为什么不在插入名称之前检查书签是否存在?

If ActiveDocument.Bookmarks.Exists(sBookmarkName) Then
    ... insert using your code
End If

Why don't you check if the bookmark exists before inserting the name?

If ActiveDocument.Bookmarks.Exists(sBookmarkName) Then
    ... insert using your code
End If
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文