VBE中的ReplaceLine方法仅替换部分行

Joh*_*man 5 excel vba excel-vba vbe

在回答这个问题时,我认为编写一个能自动替换外观的VBE宏会很有趣

DimAll a, b, c, d As Integer
Run Code Online (Sandbox Code Playgroud)

通过

Dim a As Integer, b As Integer, c As Integer, d As Integer
Run Code Online (Sandbox Code Playgroud)

在我的初稿中,我只想修改一个选定的行.在建立了适当的参考资料以获得VBE对象模型(参见http://www.cpearson.com/excel/vbe.aspx)并玩了一下之后我想出了:

Function ExpandDim(codeLine As String) As String
    Dim fragments As Variant
    Dim i As Long, n As Long, myType As String
    Dim last As Variant
    Dim expanded As String

    If UCase(codeLine) Like "*DIMALL*AS*" Then
        codeLine = Replace(codeLine, "dimall", "Dim", , , vbTextCompare)
        fragments = Split(codeLine, ",")
        n = UBound(fragments)
        last = Split(Trim(fragments(n)))
        myType = last(UBound(last))
        For i = 0 To n - 1 'excludes last fragment
            expanded = expanded & IIf(i = 0, "", ",") & fragments(i) & " As " & myType
        Next i
        expanded = expanded & IIf(n > 0, ",", "") & fragments(n)
        ExpandDim = expanded
    Else
        ExpandDim = codeLine
    End If
End Function

Sub DimAll()
    Dim myVBE As VBE
    Dim startLine As Long, startCol As Long
    Dim endLine As Long, endCol As Long
    Dim myLine As String
    Set myVBE = Application.VBE
    myVBE.ActiveCodePane.GetSelection startLine, startCol, endLine, endCol
    myLine = myVBE.ActiveCodePane.CodeModule.Lines(startLine, 1)
    Debug.Print ExpandDim(myLine)
    myVBE.ActiveCodePane.CodeModule.ReplaceLine startLine, ExpandDim(myLine)
End Sub
Run Code Online (Sandbox Code Playgroud)

在另一个代码模块中,我有:

Sub test()
    DimAll a, b, c, d As Integer
    Debug.Print TypeName(a)
    Debug.Print TypeName(b)
    Debug.Print TypeName(c)
    Debug.Print TypeName(d)
End Sub
Run Code Online (Sandbox Code Playgroud)

这是奇怪的部分.当我突出显示开始DimAll a的行,并调用我的笨拙名称sub DimAll时,在我看到的即时窗口中

Dim a As Integer, b As Integer, c As Integer, d As Integer
Run Code Online (Sandbox Code Playgroud)

这是预期的,但在代码模块本身,行更改为

Dim a, b, c, d As Integer
Run Code Online (Sandbox Code Playgroud)

DimAll已被Dim取代 - 但其余部分未经修改.我怀疑逗号混淆了ReplaceLine方法.有关如何解决此问题的任何想法?

Byr*_*all 5

当我使用调试器运行时,myLine会更改两个调用之间的值。第二次通过就变成DimAll了。Dim

这是因为一旦您在 中codeLine输入主条件,您就会替换 的值。IfExpandDim Function

在该函数中创建一个新变量,你应该没问题......或者传递它ByVal,你就很好:

Function ExpandDim(ByVal codeLine As String) As String
Run Code Online (Sandbox Code Playgroud)