Nhờ giúp code xóa dòng ghi chú trong vba

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Thường khi viết code mình hay viết thêm các dòng ghi chú (có dấu <'> đằng trước)
vd
PHP:
Sub doiten()
'ghi chu so 1 - doi ten sheet
Sheets(1).Name = "Mot" 'ghi chu so 2


Sheets(2).Name = "Hai"
Sheets(3).Name = "Ba3"      'ghi cho so 3
'   ghi chu so 1
End Sub
Mình muốn dồn các hàng lại (không còn hàng trống), và xóa hết các ghi chú, nhưng xóa từng cái lâu quá, mong các bạn có cách nào xóa nhanh ko? Cảm ơn các bạn nhiều
 
Thường khi viết code mình hay viết thêm các dòng ghi chú (có dấu <'> đằng trước)
vd
PHP:
Sub doiten()
'ghi chu so 1 - doi ten sheet
Sheets(1).Name = "Mot" 'ghi chu so 2


Sheets(2).Name = "Hai"
Sheets(3).Name = "Ba3"      'ghi cho so 3
'   ghi chu so 1
End Sub
Mình muốn dồn các hàng lại (không còn hàng trống), và xóa hết các ghi chú, nhưng xóa từng cái lâu quá, mong các bạn có cách nào xóa nhanh ko? Cảm ơn các bạn nhiều
Ghi chú người ta ghi lại để sau này có xem lại hoặc chỉnh sửa thì có thể hiểu code và thuật toán một cách nhanh chóng. Sao bạn lại muốn xóa đi. Nhất là khi code đó không phải là của bạn. Hơn nữa nó cũng chẳng ảnh hưởng gì đến code mà.

Nếu bạn muốn xóa thì chạy Sub() này:
PHP:
Sub DelNoteOfCode()
Dim Line As Long, i As Long, j As Long
On Error Resume Next
    Dim MyCode
    Set MyCode = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    For i = MyCode.CountOfLines To 1 Step -1
        If Trim(MyCode.Lines(i, 1)) = "" Then MyCode.Deletelines i
        If Right(Trim(MyCode.Lines(i - 1, 1)), 2) = " _" And Line = 0 Then Line = i
        If Left(Trim(MyCode.Lines(i, 1)), 1) = "'" Then
            If Line = 0 Then
                MyCode.Deletelines i
            Else
                For j = Line To i Step -1
                    MyCode.Deletelines j
                Next
                Line = 0
            End If
        End If
    Next
End Sub
 
Upvote 0
Ghi chú người ta ghi lại để sau này có xem lại hoặc chỉnh sửa thì có thể hiểu code và thuật toán một cách nhanh chóng. Sao bạn lại muốn xóa đi. Nhất là khi code đó không phải là của bạn. Hơn nữa nó cũng chẳng ảnh hưởng gì đến code mà.

Thực tế là mình làm việc này với code của mình. Ghi chú nhiếu qua, thấy lộn xộn, định xóa hết cho nó đẹp trước khi cho bạn bè.

Code của bạn nó xoa được dòng trống và ghi chú đầu tiên (ghi chu so 1), còn ghi chú ở phía sau (ghi chú số 2 ở bài #1) thì nó không xóa được, mình không hiểu MyCode.Lines(i, 1) nên không biết sửa lại
với lại
PHP:
If Right(Trim(MyCode.Lines(i - 1, 1)), 2) = " _" And Line = 0 Then Line = i
, mình chưa hiểu ý bạn khi dùng " _"
Mong bạn giúp mình xóa ghi chú số 2, 3 nhé, cảm ơn bạn.

Mình là người bình định, mình ở hoài nhơn, không biết bạn huuthang o dau?
 
Lần chỉnh sửa cuối:
Upvote 0
Thực tế là mình làm việc này với code của mình. Ghi chú nhiếu qua, thấy lộn xộn, định xóa hết cho nó đẹp trước khi cho bạn bè.

Code của bạn nó xoa được dòng trống và ghi chú đầu tiên (ghi chu so 1), còn ghi chú ở phía sau (ghi chú số 2 ở bài #1) thì nó không xóa được, mình không hiểu MyCode.Lines(i, 1) nên không biết sửa lại
với lại
PHP:
If Right(Trim(MyCode.Lines(i - 1, 1)), 2) = " _" And Line =  0 Then Line = i
, mình chưa hiểu ý bạn khi dùng " _"
Mong bạn giúp mình xóa ghi chú số 2, 3 nhé, cảm ơn bạn.

Mình là người bình định, mình ở hoài nhơn, không biết bạn huuthang o dau?
Tôi quên trường hợp đó, sửa lại như thế này.
PHP:
Sub DelNoteOfCode()
Dim Line As Long, i As Long, j As Long
On Error Resume Next
    Dim MyCode
    Set MyCode = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    For i = MyCode.CountOfLines To 1 Step -1
        If Trim(MyCode.Lines(i, 1)) = "" Then MyCode.Deletelines i
        If Right(Trim(MyCode.Lines(i - 1, 1)), 2) = " _" Then
            If Line = 0 Then Line = i
        ElseIf InStr(MyCode.Lines(i, 1), "'") = 0 Then
            Line = 0
        End If
        If InStr(MyCode.Lines(i, 1), "'") Then
            If Line <> 0 Then
                For j = Line To i + 1 Step -1
                    MyCode.Deletelines j
                Next
                Line = 0
            End If
            If InStr(Trim(MyCode.Lines(i, 1)), "'") = 1 Then
                MyCode.Deletelines i
            Else
                MyCode.Replaceline i, Left(MyCode.Lines(i, 1), InStr(MyCode.Lines(i, 1), "'") - 1)
            End If
        End If
    Next
End Sub
Cái đoạn mà có " _" là để tìm những ghi chú nhiều dòng. Ví dụ như thế này:
Mã:
    'Code nay toi suu tam tu trang web giaiphapexcel.com _
    Neu ai do su dung code nay vao mot chuong trinh khac _
    vui long ghi ro nguon goc xuat su _
    Chan thanh cam on
Nếu không muốn người khác xem code sao bạn không khóa lại. Nếu khóa mà họ vẫn xem được thì tôi nghĩ họ dư khả năng đọc hiểu code của bạn.

Chào người đồng hương. Tôi cũng là người Bình Định, tôi ở An Nhơn.
 
Upvote 0
Không xét đến mục đích cá nhân, chỉ nói về mặt kỹ thuật thì tôi nghĩ việc xử lý bài toán này không đơn giản tí nào
- Ta dựa vào cái gì để biết đấy là 1 GHI CHÚ ---> Nếu nói rắng đấy là dấu nháy (') thì cũng không đúng
Ví dụ:
Range("A1") = "'" & Range("B1").Value
Cũng có dấu nháy đấy thôi nhưng nó đâu phải là GHI CHÚ
Không biết bác Bill dựa vào cái gì mà phát hiện được ghi chú nhỉ? (Bác tô màu xanh khi phát hiện)
 
Upvote 0
Không xét đến mục đích cá nhân, chỉ nói về mặt kỹ thuật thì tôi nghĩ việc xử lý bài toán này không đơn giản tí nào
- Ta dựa vào cái gì để biết đấy là 1 GHI CHÚ ---> Nếu nói rắng đấy là dấu nháy (') thì cũng không đúng
Ví dụ:
Range("A1") = "'" & Range("B1").Value
Cũng có dấu nháy đấy thôi nhưng nó đâu phải là GHI CHÚ
Không biết bác Bill dựa vào cái gì mà phát hiện được ghi chú nhỉ? (Bác tô màu xanh khi phát hiện)
Tôi nghĩ MS dựa vào số dấu nháy kép (") trước dấu nháy đơn (') trong câu lệnh vì dấu nháy đơn (') chi có thể xuất hiện trong câu lệnh dưới dạng chuỗi.

Gọi số dấu nháy kép (") trước dấu nháy đơn (') trong câu lệnh là n thì: Nếu n là số lẻ thì đó không phải là ghi chú. Còn ngược lại, n là số chẵn thì đó là ghi chú. Từ quy tắc này có thể sửa lại code xem dấu nháy đơn (') trong code có phải là ký tự bắt đầu của dòng ghi chú hay không.

Có thể dùng thuật toán như thế này:
Duyệt qua các dòng lệnh (từ dưới lên trên)
Nếu không tìm thấy dấu nháy đơn thì bỏ qua, nếu tìm thấy thì xét tiếp
Duyệt qua các dấu nháy đơn (') trong câu lệnh. Nếu trước dấu nháy đơn (') là số chẵn dấu nháy kép (") thì từ dấu nháy đơn (') đó trở về sau của câu lệnh là ghi chú, thoát vòng lặp.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể dùng thuật toán như thế này:
Duyệt qua các dòng lệnh (từ dưới lên trên)
Nếu không tìm thấy dấu nháy đơn thì bỏ qua, nếu tìm thấy thì xét tiếp
Duyệt qua các dấu nháy đơn (') trong câu lệnh. Nếu trước dấu nháy đơn (') là số chẵn dấu nháy kép (") thì từ dấu nháy đơn (') đó trở về sau của câu lệnh là ghi chú, thoát vòng lặp.
Cái này hôm trước mình có thử xóa cái ghi chú đối với code của bạn và bị xóa nhầm tứ (') có trong công thức if, nhưng mình nghĩ bình thường thì code sẽ không có gặp trường hợp như bạn nên mình bỏ qua. Giờ anh ndu nói lên vấn đề này mình nghỉ lại thì cũng có lúc cần cái dấu (') như câu lệnh của ndu (dùng cho trường hợp cần viết '001)
Bạn hữu thắng ơi, nếu có thể thì bạn hãy bổ xung phần này vào code của bạn được không, mình ko có rành về code bạn viết nên ko sửa được. Cảm ơn bạn nhiều
 
Upvote 0
Cái này hôm trước mình có thử xóa cái ghi chú đối với code của bạn và bị xóa nhầm tứ (') có trong công thức if, nhưng mình nghĩ bình thường thì code sẽ không có gặp trường hợp như bạn nên mình bỏ qua. Giờ anh ndu nói lên vấn đề này mình nghỉ lại thì cũng có lúc cần cái dấu (') như câu lệnh của ndu (dùng cho trường hợp cần viết '001)
Bạn hữu thắng ơi, nếu có thể thì bạn hãy bổ xung phần này vào code của bạn được không, mình ko có rành về code bạn viết nên ko sửa được. Cảm ơn bạn nhiều
Vậy thì hãy sửa lại như thế này:
PHP:
Sub DelNoteOfCode()
Dim Line As Long, i As Long, j As Long, k As Long
On Error Resume Next
    Dim MyCode
    Set MyCode = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule
    For i = MyCode.CountOfLines To 1 Step -1
        If Trim(MyCode.Lines(i, 1)) = "" Then MyCode.Deletelines i
        If Right(Trim(MyCode.Lines(i - 1, 1)), 2) = " _" Then
            If Line = 0 Then Line = i
        ElseIf InStr(MyCode.Lines(i, 1), "'") = 0 Then
            Line = 0
        End If
        If InStr(MyCode.Lines(i, 1), "'") Then
            k = InStr(MyCode.Lines(i, 1), "'")
            For j = 1 To (Len(MyCode.Lines(i, 1)) - Len(Replace(MyCode.Lines(i, 1), "'", "")))
                If ((Len(Left(MyCode.Lines(i, 1), k)) - Len(Replace(Left(MyCode.Lines(i, 1), k), """", ""))) Mod 2) = 0 Then GoTo Del
                k = InStr(k + 1, MyCode.Lines(i, 1), "'")
            Next
            GoTo DontDel
Del:
            If Line <> 0 Then
                For j = Line To i + 1 Step -1
                    MyCode.Deletelines j
                Next
                Line = 0
            End If
            If InStr(Trim(MyCode.Lines(i, 1)), "'") = 1 Then
                MyCode.Deletelines i
            Else
                MyCode.Replaceline i, Left(MyCode.Lines(i, 1), k - 1)
            End If
        End If
DontDel:
    Next
End Sub
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom