2015-06-22 11 views
5

Để đối phó với this câu hỏi tôi nghĩ rằng nó sẽ là thú vị để viết một macro VBE đó sẽ tự động thay thế dòng mà trông giống nhưphương pháp ReplaceLine trong VBE chỉ thay thế một phần của dòng

DimAll a, b, c, d As Integer 

bởi

Trong bản nháp đầu tiên của tôi, tôi chỉ muốn sửa đổi một dòng được chọn. Sau khi thiết lập các tài liệu tham khảo phù hợp để có được mô hình VBE đối tượng (xem http://www.cpearson.com/excel/vbe.aspx) và chơi xung quanh một chút tôi đã đưa ra:

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 

Trong một mô-đun mã tôi đã:

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 

Đây là phần kỳ lạ. Khi tôi làm nổi bật dòng mà bắt đầu DimAll một, và gọi tôi ngượng nghịu tên tiểu DimAll, trong cửa sổ ngay lập tức tôi thấy

được như mong đợi, nhưng trong mô-đun mã tự dòng được thay đổi để

Dim a, b, c, d As Integer 

DimAll đã được thay thế bằng Dim - nhưng phần còn lại của dòng chưa được sửa đổi. Tôi nghi ngờ rằng các dấu phẩy gây nhầm lẫn cho phương thức ReplaceLine. Bất kỳ ý tưởng nào về cách sửa lỗi này?

+4

1. Hãy cẩn thận với sửa đổi ActiveCodePane. Tôi chỉ vô tình sửa đổi mã đang thực hiện sửa đổi ... Để biết thêm về điều đó, tôi khuyên bạn nên đăng trên http://codereview.stackexchange.com/ VBIDE là nỗi ám ảnh của tôi. Tôi rất sẵn lòng giúp bạn đánh bóng nó ở đó. 2. Bạn có thể muốn xem [this] (https://github.com/rubberduck-vba/Rubberduck/wiki/MultipleDeclarationsInspection) là một phần của [this] (https://github.com/rubberduck-vba/Rubberduck). (Disclaimer: Tôi là một trong những devs.) – RubberDuck

+0

@RubberDuck Tôi nghĩ rằng [đoạn mã này có liên quan chặt chẽ hơn đến những gì OP đang làm] (https://github.com/rubberduck-vba/Rubberduck/blob/next/RetailCoder .VBE/Inspections/VariableTypeNotDeclaredInspectionResult.cs # L28-L46) –

+0

@RubberDuck Đây chủ yếu là bằng chứng về khái niệm. Nó chắc chắn cần đánh bóng. Đối với một điều, có lẽ không ai viết Dim a, b, c, d As Integer với ý định khai báo a, b, c dưới dạng Biến thể. Nó sẽ có ý nghĩa hơn để bỏ qua phần đó về DimAll và chỉ mở rộng tất cả những thứ giống như Dim a, b, c, d As Integer trong toàn bộ dự án. Cuối cùng, tôi muốn tìm ra cách biến nó thành một bổ trợ VBE với các phím tắt. Tôi sẽ xem liên kết đó –

Trả lời

4

Khi tôi chạy với trình gỡ lỗi, myLine thay đổi giá trị giữa hai cuộc gọi. Các DimAll trở thành Dim vào lần thứ hai thông qua.

Điều này là do bạn đang thay thế giá trị codeLine sau khi bạn nhập chính If điều kiện bên trong ExpandDim Function.

Tạo một biến mới trong chức năng đó và bạn nên sử dụng tốt ... hoặc vượt qua nó ByVal và bạn tốt:

Function ExpandDim(ByVal codeLine As String) As String 
+0

Tôi hiểu - đó là lỗi byRef đơn giản (chức năng ExpandDim của tôi có tác dụng phụ). Vấn đề cũng được sửa nếu tôi đặt công cụ sửa đổi byVal trước đối số trong định nghĩa hàm đó.Tôi gần như không có kinh nghiệm viết VBE vì vậy tôi nghi ngờ một sự hiểu lầm sâu sắc về mô hình đối tượng của nó trên phần của tôi chứ không phải là một vấn đề ngữ nghĩa đi qua đơn giản. Cảm ơn. –

Các vấn đề liên quan