Để đố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?
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
@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) –
@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 đó –