vba - 为什么我的 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
解决方案
该脚本完美运行。我将它应用到错误的文档上,对不起!... :) 谢谢大家,祝大家有美好的一天!...
推荐阅读
- python - Django 疯狂的 URL 重写
- laravel - 如何在 Laravel 中获取(解析)这个 JSON?
- javascript - 如何使用虚拟现实 Javascript 库 - Marzipano?
- javascript - Django Chart.js ajax javascript“字符串数据解析错误”
- math - CIELab 到 CIELCh(ab) 的转换没有产生正确的结果
- python - python double for循环属性问题
- excel - 创建 Excel 工作簿副本并删除查询连接
- c# - 使用 LINQ 从 ListBox 填充 ComboBox
- javascript - 制作移动键盘时遇到问题
- r - Use a list of subset indices in a for loop or function