首页 > 解决方案 > 为什么我的 vba 脚本在逐行执行(在调试中)时有效,但在运行时无效?

问题描述

我的一个朋友需要一个 Microsoft Word 脚本 - 我创建了一个脚本......但它有一些非常奇怪的错误...... :) 含义 - 当我在 Debug [逐行] 上运行它时它可以工作,但是当我作为一个完整的脚本运行它......它只是不这样做......

它可能与“搜索部分”有关 - 因为,当正常运行时,它只是停留在第一个查找位置并不断替换那里的文本,一遍又一遍。但是 - 令我惊讶的是 - 在调试的“步骤”选项下逐行运行时它确实有效......

它应该在文档中搜索一些文本,将其存储在一些字符串数组中,然后在其他一些(已经打开的)文档中替换所需的文本...... [为了在正确的位置插入所需的文本,我正在搜索对于某些特定文本,然后稍微移动光标,然后插入文本]

它实际上是在将参考文献的圣经书籍名称从一种语言替换为另一种语言。

链接:脚本 - https://paste.ee/p/P7nqv 文档 - https://drive.google.com/open?id=1xPcFesAQZ1Zal1XWAmhOCMMTEr1WWkGP

这是脚本:

Public oneyearbible(31) As String
Public twoyearbible(31) As String
Public furtherstudy(31) As String
Public cateziletrebuie As Integer


Sub extractandfixverses()
    Dim pathName, numefisier As String
    Dim acatazi, zisaptamana, ziua, lunacurenta, ancurent, annecesar, lunanecesara, lunaplus As Integer
    Dim documente, rapsodie, rhapsody As Document
    Dim numedocorig, tempstring, whichmonth As String
    Dim i, n As Integer
    Dim rapsodieorig As Boolean

    For i = 1 To 31
        furtherstudy(i) = ""
        oneyearbible(i) = ""
        twoyearbible(i) = ""
    Next

    rapsodieorig = False
    rapsodie = ActiveDocument
    n = Application.Documents.Count
    lunacurenta = Val(Format(Now, "mm"))
    ancurent = Val(Format(Now, "yyyy"))
    numefisier = ActiveDocument.Name
    lunanecesara = lunadec(numefisier)
    If lunacurenta > lunanecesara Then
        annecesar = ancurent + 1
    Else
        annecesar = ancurent
    End If
    acatazi = DatePart("y", Date)
    cateziletrebuie = Val(Format(DateSerial(annecesar, lunanecesara + 1, 0), "dd"))

    whichmonth = monthname(lunanecesara)
    For Each documente In Application.Documents
        tempstring = UCase(documente.Name)
        If ((Not (InStr(tempstring, whichmonth) = 0)) _
            And (Not (InStr(tempstring, "INNER") = 0)) _
            And (Not (InStr(tempstring, "LAYOUT") = 0))) Then
                numedocorig = documente.Name
                Set rhapsody = documente
                rapsodieorig = True
        End If
    Next documente
    If rapsodieorig Then
        Documents(rhapsody).Activate
    Else
        MsgBox ("Rapsodia originala, in engleza, in format doc, nu este deschisa!")
        Exit Sub
    End If

    'Selection.InsertBefore Text:="test new text "

    'ActiveDocument.Content.InsertBefore Text:="test The beginning."
    'ActiveDocument.Content.InsertAfter Text:="test The end."

    Call gaitherverses

    Documents(rapsodie).Activate

    Call fixverses







End Sub


Sub gaitherverses()
    Dim ziua As Integer

    Selection.HomeKey wdStory
    Selection.Find.ClearFormatting

    ziua = 0
    Do While ziua < cateziletrebuie
        ziua = ziua + 1
        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "FURTHER STUDY"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        With Selection.Find
            .MatchWildcards = True
            .Text = "[a-zA-Z]"  '[A-Z] if you only want upper case
            .Forward = True
            .Wrap = wdFindStop
        End With
        Selection.Find.Execute
        Selection.HomeKey
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        furtherstudy(ziua) = replacebooknames(Selection.Text)

        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "1-YEAR BIBLE READING PLAN"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        With Selection.Find
            .MatchWildcards = True
            .Text = "[a-zA-Z]"  '[A-Z] if you only want upper case
            .Forward = True
            .Wrap = wdFindStop
        End With
        Selection.Find.Execute
        Selection.HomeKey
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        oneyearbible(ziua) = replacebooknames(Selection.Text)



        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "2-YEAR BIBLE READING PLAN"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        With Selection.Find
            .MatchWildcards = True
            .Text = "[a-zA-Z]"  '[A-Z] if you only want upper case
            .Forward = True
            .Wrap = wdFindStop
        End With
        Selection.Find.Execute
        Selection.HomeKey
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend

        twoyearbible(ziua) = replacebooknames(Selection.Text)
    Loop

    MsgBox (oneyearbible(ziua - 2) & oneyearbible(ziua - 1) & oneyearbible(ziua))

End Sub

Function replacebooknames(ByVal booknamesin As String) As String
    Dim wrdsarray() As String
    Dim resulte, tempstring As String
    Dim i As Integer

    resulted = ""
    wrdsarray() = Split(booknamesin)
    resulted = convertbiblebooks(wrdsarray(LBound(wrdsarray)))
    For i = (LBound(wrdsarray) + 1) To UBound(wrdsarray)
        tempstring = convertbiblebooks(wrdsarray(i))
        Select Case tempstring
            Case "SKIP_WORD"
                resulted = resulted
            Case Else
                resulted = resulted & tempstring
        End Select
    Next i
replacebooknames = Application.CleanString(resulted)
End Function

Function convertbiblebooks(ByVal bookname As String) As String
    Dim booknameup, skipword, rezultat As String
    skipword = "SKIP_WORD"
    booknameup = UCase(bookname)
    'booknameup = Replace(booknameup, Chr(59), "")
    Select Case booknameup
    Case "GENESIS"
        rezultat = "Geneza"
    Case "EXODUS"
        rezultat = "Exod"
    Case "LEVITICUS"
        rezultat = "Levitic"
    Case "NUMBERS"
        rezultat = "Numeri"
    Case "DEUTERONOMY"
        rezultat = "Deuteronom"
    Case "JOSHUA"
        rezultat = "Iosua"
    Case "JUDGES"
        rezultat = "Judec" & ChrW(259) & "tori"
    Case "RUTH"
        rezultat = "Rut"
    Case "SAMUEL"
        rezultat = "Samuel"
    Case "KINGS"
        rezultat = "Împ" & ChrW(259) & "ra" & ChrW(539) & "i"
    Case "CHRONICLES"
        rezultat = "Cronici"
    Case "EZRA"
        rezultat = "Ezra"
    Case "NEHEMIAH"
        rezultat = "Neemia"
    Case "ESTHER"
        rezultat = "Estera"
    Case "JOB"
        rezultat = "Iov"
    Case "PSALMS"
        rezultat = "Psalmii"
    Case "PROVERBS"
        rezultat = "Proverbe"
    Case "ECCLESIASTES"
        rezultat = "Eclesiastul"
    Case "SONG"
        rezultat = "C" & ChrW(226) & "ntarea C" & ChrW(226) & "nt" & ChrW(259) & "rilor"
    Case "SONGS"
        rezultat = "C" & ChrW(226) & "ntarea C" & ChrW(226) & "nt" & ChrW(259) & "rilor"
    Case "ISAIAH"
        rezultat = "Isaia"
    Case "JEREMIAH"
        rezultat = "Ieremia"
    Case "LAMENTATIONS"
        rezultat = "Pl" & ChrW(226) & "ngerile lui Ieremia"
    Case "EZEKIEL"
        rezultat = "Ezechiel"
    Case "DANIEL"
        rezultat = "Daniel"
    Case "HOSEA"
        rezultat = "Osea"
    Case "JOEL"
        rezultat = "Ioel"
    Case "AMOS"
        rezultat = "Amos"
    Case "OBADIAH"
        rezultat = "Obadia"
    Case "JONAH"
        rezultat = "Iona"
    Case "MICAH"
        rezultat = "Mica"
    Case "NAHUM"
        rezultat = "Naum"
    Case "HABAKKUK"
        rezultat = "Habacuc"
    Case "ZEPHANIAH"
        rezultat = ChrW(538) & "efania"
    Case "HAGGAI"
        rezultat = "Hagai"
    Case "ZECHARIAH"
        rezultat = "Zaharia"
    Case "MALACHI"
        rezultat = "Maleahi"
    Case "MATTHEW"
        rezultat = "Matei"
    Case "MARK"
        rezultat = "Marcu"
    Case "LUKE"
        rezultat = "Luca"
    Case "JOHN"
        rezultat = "Ioan"
    Case "ACTS"
        rezultat = "Faptele Apostolilor"
    Case "ROMANS"
        rezultat = "Romani"
    Case "CORINTHIANS"
        rezultat = "Corinteni"
    Case "GALATIANS"
        rezultat = "Galateni"
    Case "EPHESIANS"
        rezultat = "Efeseni"
    Case "PHILIPPIANS"
        rezultat = "Filipeni"
    Case "COLOSSIANS"
        rezultat = "Coloseni"
    Case "THESSALONIANS"
        rezultat = "Tesaloniceni"
    Case "TIMOTHY"
        rezultat = "Timotei"
    Case "TITUS"
        rezultat = "Tit"
    Case "PHILEMON"
        rezultat = "Filimon"
    Case "HEBREWS"
        rezultat = "Evrei"
    Case "JAMES"
        rezultat = "Iacov"
    Case "PETER"
        rezultat = "Petru"
    Case "JUDE"
        rezultat = "Iuda"
    Case "REVELATION"
        rezultat = "Apocalipsa"
    Case "NKJV;", "AMP;", "AMPC;", "TANT;", _
            "TLB;", "CEV;", "NASB;", "ISV;", "NIV;", _
            "MSG;", "WEB;", "TNLT;", "ASV;", _
            "TEV;", "RSV;", "GNB;", "WNT;", _
            "NRSV;", "MOFFAT;", "WESNT;"
        rezultat = ";"
    Case "NKJV", "AMP", "AMPC", "TANT", _
            "TLB", "CEV", "NASB", "ISV", "NIV", _
            "MSG", "WEB", "TNLT", "ASV", _
            "TEV", "RSV", "GNB", "WNT", _
            "NRSV", "MOFFAT", "WESNT"
        rezultat = skipword
    Case Else
        rezultat = bookname
    End Select
    Select Case rezultat
        Case skipword, ";"
            rezultat = rezultat
        Case Else
            rezultat = Chr(32) & rezultat
    End Select
convertbiblebooks = rezultat
End Function

Function monthname(ByVal careluna As Integer) As String
    Select Case careluna
        Case 1
            monthname = "JANUARY"
        Case 2
            monthname = "FEBRUARY"
        Case 3
            monthname = "MARCH"
        Case 4
            monthname = "APRIL"
        Case 5
            monthname = "MAY"
        Case 6
            monthname = "JUNE"
        Case 7
            monthname = "JULY"
        Case 8
            monthname = "AUGUST"
        Case 9
            monthname = "SEPTEMBER"
        Case 10
            monthname = "OCTOBER"
        Case 11
            monthname = "NOVEMBER"
        Case 12
            monthname = "DECEMBER"
    End Select
End Function

Sub fixverses()
    Dim ziua As Integer

    Selection.HomeKey wdStory
    Selection.Find.ClearFormatting

    ziua = 0
    Do While ziua < cateziletrebuie
        ziua = ziua + 1
        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "STUDIU SUPLIMENTAR"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        'Selection.TypeBackspace
        With Selection.Range
             .Text = furtherstudy(ziua)
        End With
        'Selection.InsertBefore furtherstudy(ziua)

        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "PLAN DE CITIRE A BIBLIEI " & ChrW(206) & "NTR-UN AN"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        'Selection.TypeBackspace
        'Selection.InsertAfter oneyearbible(ziua)
        With Selection.Range
            .Text = oneyearbible(ziua)
        End With


        With Selection.Find
            .ClearFormatting
            .MatchWildcards = False
            .Text = "PLAN DE CITIRE A BIBLIEI " & ChrW(206) & "N DOI ANI"
            .Forward = True
            .Wrap = WdFindWrap.wdFindContinue
        End With
        Selection.Find.Execute
        Selection.MoveDown
        Selection.HomeKey
        Selection.TypeText twoyearbible(ziua)
        Selection.EndKey Unit:=wdLine, Extend:=wdExtend
        Selection.TypeBackspace
        'With Selection.Range
        '    .Text = twoyearbible(ziua)
        'End With

    Loop

    MsgBox (oneyearbible(ziua - 2) & oneyearbible(ziua - 1) & oneyearbible(ziua))





End Sub

以防万一 - 这是我运行脚本的 2 个文档 https://drive.google.com/open?id=1xPcFesAQZ1Zal1XWAmhOCMMTEr1WWkGP

标签: vbams-word

解决方案


该脚本完美运行。我将它应用到错误的文档上,对不起!... :) 谢谢大家,祝大家有美好的一天!...


推荐阅读