Loại bỏ các dòng trống trong Sub

Liên hệ QC

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,061
Được thích
175
Các anh chị & các bạn giúp cách loại bỏ các dòng trống trong sub
Trong quá trình thử nghiệm code thì dễ tạo ra các dòng trống trong Sub hay các dòng trống giữa các sub
Ví dụ:

Sub Macro1 ()
Dim


End Sub



Sub Macro2 ()

With...
.Range ("A1").Clear


End With


End Sub

Cho hỏi có cách nào để loại nhanh các dòng trống nói trên cho 1 File có nhiều Module
Mặc khác có cách nào để cân đối lại các dòng code hay không?
Ví dụ:Dòng Sub Macro1() và dòng End Sub bị so le nhau, không thẳng hàng)
Sub Macro1 ()
....
End Sub
Em muốn cho cân đối lại như sau
Sub Macro1 ()
....
End Sub
P/s: em đang sử dụng Win 7 và Office 2010
Em cảm ơn!
 
Lần chỉnh sửa cuối:
Ctrl + a
Copy qua một file Word
Trong file Word, Ctrl + h
Find what ^p^p, replace with ^p, replace all (Alt + a) cho đến khi hết
Copy trở lại.
 
Upvote 0
Cách khác: Ctrl +a, mở sheet mới, paste vào, autofilter, bỏ chọn blank, copy bỏ vào lại vba.
 
Upvote 0
Dùng Code của tôi thử xem
Chạy Sub Test_CleanCode_AddToModule để thử

Sử dụng:
Tạo module tên là "zTemp" để copy code vào hoặc viết code vào. Sau đó
Chạy Sub Test_CleanCode_AddToModule để thực hiện.

(copy Test_CleanCode_AddToModule vào cửa sổ Immediate (Ctrl + G để mở ) và ấn Enter
(Đặt lại tên của Sub ngắn hơn để đánh bằng tay trong cửa sổ Immediate)
Thay đổi ModName để thực hiện trên một Module Khác
Thay đổi tham chiếu đến module thành ActiveVBProject để thực hiện ngay trên Module đang viết code

CleanCode(<Code>, False, True, True, True)
1. imStr
- nhập code
2. Protruding - Loại bỏ khoảng trống phía trước dòng hay không
3 .clearLinesBlank - Xóa dòng trống hay không
4. clearCommentApostrophe - xóa comment ( ' ) hay không
5. ClearCommentRem - xóa comment "Rem" hay không

Góp ý thêm: Tạo thêm Code tự động thụt lề để thụt lề Code (Keyword Search Google: Indent Code VBA)


Copy code vào code của module và save thành .xlsm hoặc .xlsb:
PHP:
Sub Test_CleanCode_AddToModule()
  Dim codeStr$, ModName$
  ModName = "zTemp"
  codeStr = getCodeModule(ModName)
  If codeStr = "" Then Exit Sub
  codeStr = CleanCode(codeStr, False, True, True, True)
  AddCodeModule ModName, codeStr, True
End Sub

Sub Test_CleanCode_str()
  Debug.Print CleanCode(ExamStringCode, False, True, True, True)
End Sub
    Function CleanCode(Optional ByVal imStr, _
                        Optional ByVal Protruding As Boolean = True, _
                        Optional ByVal clearLinesBlank As Boolean = True, _
                        Optional ByVal clearCommentApostrophe As Boolean = False, _
                        Optional ByVal ClearCommentRem As Boolean = False) As String
        If Not imStr Like "*" & vbNewLine & "*" Then: CleanCode = imStr: Exit Function
        Dim Str$: Str = imStr
        Dim Arr() As String: Arr = Split(Str, vbNewLine)
        Dim blankArr() As String, k: k = 0
        Dim i&, bBCm As Boolean
        If Protruding Then
          For i = 0 To UBound(Arr)
            Arr(i) = Application.WorksheetFunction.Clean(Trim$(Arr(i)))
          Next i
        End If
        If clearLinesBlank Then
            For i = 0 To UBound(Arr)
                If k <> 0 Then
                  If Right$(Trim$(blankArr(k - 1)), 2) = " _" And Arr(i) = vbNullString Then
                    blankArr(k - 1) = Left$(blankArr(k - 1), Len(blankArr(k - 1)) - 1)
                  End If
                End If
                If Arr(i) <> vbNullString Then
                    ReDim Preserve blankArr(k)
                    blankArr(k) = Arr(i)
                    k = k + 1
                End If
            Next i
        Else
            blankArr = Arr
        End If
        Dim atpArr() As String, bMul As Boolean, bO1 As Boolean, bO2 As Boolean
        k = 0
        If clearCommentApostrophe Then
            For i = 0 To UBound(blankArr)
              If i <> 0 Then
                If bMul = True _
                   And Right$(Trim$(blankArr(i - 1)), 2) = " _" Then
                  bMul = True
                Else
                  bMul = False
                End If
              End If
              bO1 = False: bO2 = False
              If bMul = False Then
                If Left$(Trim$(blankArr(i)), 1) = "'" Then
                  bO1 = True
                  If Right$(Trim$(blankArr(i)), 2) <> " _" Then
                    bMul = False
                  Else
                    bMul = True
                  End If
                Else
                  If blankArr(i) Like "*'*" Then
                    bO2 = True
                    If Right$(Trim$(blankArr(i)), 2) <> " _" Then
                      bMul = False
                    Else
                      bMul = True
                    End If
                  End If
                End If

                If bO1 = False And bO2 = False Then
                  ReDim Preserve atpArr(k)
                  atpArr(k) = blankArr(i)
                  k = k + 1
                ElseIf bO2 = True Then
                  ReDim Preserve atpArr(k)
                  If Not blankArr(i) Like "*""*'*""*" Then 'scarce - Handle
                    atpArr(k) = Split(blankArr(i), "'")(0)
                  Else
                    atpArr(k) = blankArr(i)
                  End If
                  k = k + 1
                End If
              End If
            Next i
        Else
            atpArr = blankArr
        End If

        Dim remArr() As String, bRMul As Boolean, bRO1 As Boolean, bRO2 As Boolean
        k = 0
        If ClearCommentRem Then
            For i = 0 To UBound(atpArr)
              If i <> 0 Then
                If bRMul = True And Right$(Trim$(atpArr(i - 1)), 2) = " _" Then
                  bRMul = True
                Else
                  bRMul = False
                End If
              End If
              bRO1 = False: bRO2 = False
              If bRMul = False Then
                If LCase$(Left(Trim$(atpArr(i)), 4)) = "rem " Then
                  bRO1 = True
                  If Right$(Trim$(atpArr(i)), 2) <> " _" Then
                    bRMul = False
                  Else
                    bRMul = True
                  End If
                Else
                  If LCase$(atpArr(i)) Like "*: rem*" Then
                    bRO2 = True
                    If Right$(Trim$(atpArr(i)), 2) <> " _" Then
                      bRMul = False
                    Else
                      bRMul = True
                    End If
                  End If
                End If

                If bRO1 = False And bRO2 = False Then
                  ReDim Preserve remArr(k)
                  remArr(k) = atpArr(i)
                  k = k + 1
                ElseIf bRO2 = True Then
                  ReDim Preserve remArr(k)
                  remArr(k) = Split(atpArr(i), ": Rem")(0)
                  k = k + 1
                End If
              End If
            Next i
        Else
            remArr = atpArr
        End If
        CleanCode = Join(remArr, vbNewLine)
    End Function
Function ExamStringCode() As String
    Dim Str As String
    Str = "Sub Test_zTemp_code_()"
    Str = Str + vbNewLine
    Str = Str + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "Rem comment" + vbNewLine
    Str = Str + "Rem comment _" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "Dim a As String" + vbNewLine
    Str = Str + "Rem comment _" + vbNewLine
    Str = Str + "         Rem comment _" + vbNewLine
    Str = Str + "comment" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "Rem comment _" + vbNewLine
    Str = Str + "comment _" + vbNewLine
    Str = Str + "            comment _" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "'comment" + vbNewLine
    Str = Str + "  ' _" + vbNewLine
    Str = Str + "  ' _" + vbNewLine
    Str = Str + "  ' _" + vbNewLine
    Str = Str + "  'comment _" + vbNewLine
    Str = Str + "            comment _" + vbNewLine
    Str = Str + "             comment _" + vbNewLine
    Str = Str + "comment _" + vbNewLine
    Str = Str + "comment" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "Dim b As String 'comment" + vbNewLine
    Str = Str + "             Dim c As String 'comment _" + vbNewLine
    Str = Str + "comment _" + vbNewLine
    Str = Str + "comment" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "             Dim d As String 'comment _" + vbNewLine
    Str = Str + "comment _" + vbNewLine
    Str = Str + vbNewLine
    Str = Str + vbNewLine
    Str = Str + "         Dim e As String" + vbNewLine
    Str = Str + "         e = ""hello'hello"" 'comment" + vbNewLine
    Str = Str + "Dim f As String: Rem _" + vbNewLine
    Str = Str + "comment _" + vbNewLine
    Str = Str + "comment" + vbNewLine
    Str = Str + "Call Test_AddCodeModule" + vbNewLine
    Str = Str + "End Sub"
    ExamStringCode = Str
  End Function
Sub Test_AddCodeModule()
    AddCodeModule , ExamStringCode, True
End Sub
    Function AddCodeModule(Optional ByVal mdName As String = "zTemp", _
                            Optional ByVal StrCode As String, _
                            Optional ByVal bNewCode As Boolean = False)
        addModule (mdName)
        Dim CodeMod: Set CodeMod = ActiveWorkbook.VBProject.VBComponents.Item(mdName).CodeModule
        With CodeMod
          If bNewCode And .CountOfLines > 1 Then .DeleteLines 1, .CountOfLines
          .InsertLines .CountOfLines + 1, StrCode
        End With
    End Function

    Function getCodeModule(Optional ByRef codeName As String = "zTemp", _
                            Optional ByRef arrLines As Variant, _
                            Optional ByRef strNLine As String, _
                            Optional ByRef arrNLine As Variant) As String
        If IsMissing(codeName) Or codeName = vbNullString Or _
            IsNumeric(Left(codeName, 1)) Then getCodeModule = vbNullString: Exit Function
        Dim CodeMod: Set CodeMod = ThisWorkbook.VBProject.VBComponents.Item(codeName).CodeModule
        On Error Resume Next
        Dim codeStr As String: codeStr = CodeMod.Lines(1, CodeMod.CountOfLines)
        Dim i As Long, Arr As Variant, rArr As Variant
        Arr = Split(codeStr, vbNewLine)
        ReDim rArr(UBound(Arr))
        For i = 0 To UBound(Arr)
          rArr(i) = i + 1
        Next i
        getCodeModule = Join(Arr, vbNewLine)
        arrLines = Arr
        strNLine = Join(rArr, vbNewLine)
        arrNLine = rArr
        Set CodeMod = Nothing
    End Function
Sub test_addModule()
  addModule
End Sub
    Function addModule(Optional addName$ = "zTemp") As Boolean
        If addName = vbNullString Then addModule = False: Exit Function
        If findModule(addName) Then addModule = False: Exit Function
        Dim VBProj As Object, Wb As Workbook
        Set Wb = ThisWorkbook
        Set VBProj = Wb.VBProject
        VBProj.VBComponents.Add(1).Name = addName
        VBProj.VBComponents(addName).Activate
        Application.VBE.MainWindow.Visible = True
        addModule = True
    End Function
    Function findModule(mdName) As Boolean
        Dim VBProj As Object, Wb As Workbook
        Set Wb = ThisWorkbook
        Set VBProj = Wb.VBProject
        Dim Obj
        For Each Obj In VBProj.VBComponents
            If UCase(mdName) = UCase(Obj.Name) Then
                findModule = True
                Exit Function
            End If
        Next Obj
    End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Bạn ơi! Cho mình hỏi mình tải về khi ADD nó vào thì nó báo lỗi, Mình đang dùng Win 10 pro+64bit.View attachment 210499
Trong cảnh báo có nói rõ, có thể hiểu là:
Ứng dụng đó được viết tương thích 32bit
Bạn cần xử dụng tính tương thích ngược của Win API, vì bạn đang ở Win64
Thay đổi các Hàm API bằng cách thêm PtrSafe, Nếu biến nào gọi một hàm thực thi thì đổi Data-Type thành LongLong / LongPtr / Any.
 
Upvote 0
Trong cảnh báo có nói rõ, có thể hiểu là:
Ứng dụng đó được viết tương thích 32bit
Bạn cần xử dụng tính tương thích ngược của Win API, vì bạn đang ở Win64
Thay đổi các Hàm API bằng cách thêm PtrSafe, Nếu biến nào gọi một hàm thực thi thì đổi Data-Type thành LongLong / LongPtr / Any.
Anh có sửa giúp em vấn đề này được không?
https://www.giaiphapexcel.com/diend...ác-dòng-trống-trong-sub.140095/post-900011
trong file có nhiều hàm API em không biết sửa như thế nào?
 
Upvote 0
Dùng Code của tôi thử xem
Sử dụng:
CleanCode(<Code>, False, True, True, True)
1. imStr
- nhập code
2. Protruding - Loại bỏ khoảng trống phía trước dòng hay không
3 .clearLinesBlank - Xóa dòng trống hay không
4. clearCommentApostrophe - xóa comment ( ' ) hay không
5. ClearCommentRem - xóa comment "Rem" hay không

Góp ý thêm:
1. Tạo thêm Code tự động thụt lề để thụt lề Code (Keyword Search Google: Indent Code VBA)
2. Có thể tạo thêm một code VBproject để Save Code đã Clean vào Module. (Keyword Search Google: Add Code to Module VBA)

Copy code vào code của module và save thành .xlsm hoặc .xlsb:
Cách thức làm như thế nào vậy bạn
Chay code Test_CleanCode_str
Hay chạy công thức, nếu công thức thì đặt đối số như thế nào
Cảm ơn bạn
 
Upvote 0
Anh có sửa giúp em vấn đề này được không?
https://www.giaiphapexcel.com/diendan/threads/loại-bỏ-các-dòng-trống-trong-sub.140095/post-900011
trong file có nhiều hàm API em không biết sửa như thế nào?
Bạn có thể sửa theo cách tôi hướng dẫn:
"Public Declare Function" --> "Public Declare PtrSafe Function"

ByVal lpTimerFunc As Long là một Callback Function nên nó phải là LongLong / LongPtr / Any
Nên: ByVal lpTimerFunc As LongLong

Vì sao nó là Callback Function:
Trong code sẽ có một Function được gọi bởi Hàm API, Hàm này gọi là hàm thực thi của Hàm API
Thì biến gọi hàm này trong Hàm API phải có giá trị là 8byte cho Win64 (LongLong / LongPtr / Any)

PHP:
#If VBA7 And Win64 Then
'Public / Private
    Public Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hWnd As LongLong, ByVal nIDEvent As LongLong, _
        ByVal uElapse As LongLong, ByVal lpTimerFunc As LongLong) As LongLong
#Else
    'Chứa các Hàm API bị lỗi ở Win64 để chạy trên Win32 / Office 32'
# End If
 
Lần chỉnh sửa cuối:
Upvote 0
Các anh chị & các bạn giúp cách loại bỏ các dòng trống trong sub
Trong quá trình thử nghiệm code thì dễ tạo ra các dòng trống trong Sub hay các dòng trống giữa các sub
Ví dụ:

Sub Macro1 ()
Dim


End Sub



Sub Macro2 ()

With...
.Range ("A1").Clear


End With


End Sub

Cho hỏi có cách nào để loại nhanh các dòng trống nói trên cho 1 File có nhiều Module
Mặc khác có cách nào để cân đối lại các dòng code hay không?
Ví dụ:Dòng Sub Macro1() và dòng End Sub bị so le nhau, không thẳng hàng)
Sub Macro1 ()
....
End Sub
Em muốn cho cân đối lại như sau
Sub Macro1 ()
....
End Sub
P/s: em đang sử dụng Win 7 và Office 2010
Em cảm ơn!
Nếu bạn là người trực tiếp viết code thì:
- Trân trọng từng dòng code
- Có thể phải đọc đi đọc lại vài lần
Khi đó thì việc chỉnh chu , xóa dòng trống , dịch khối cho code là việc đơn giản và làm dễ dàng

Còn kiểu đã code tự động mọi việc, giờ lại cần việc tự động cho code nữa thì còn nói chi

trừ khi bạn là người copy hay lấy code ở đâu đó , code đó loạn lên - vậy khi đó lại càng nên bỏ đi, vì code đó chỉnh lại có đáng giá không?
 
Upvote 0
Đã copy code vào module rồi chạy Test_CleanCode_str
Kiểm tra lại các code có dòng trống nó không nhúc nhít!
Sub Sub Sub đó bạn
"Test_CleanCode_AddToModule"
"Test_CleanCode_AddToModule"
"Test_CleanCode_AddToModule"
"Test_CleanCode_AddToModule"
Tôn trọng người giúp đỡ mình bằng cách đọc kĩ hướng dẫn
 
Lần chỉnh sửa cuối:
Upvote 0
Vì sao nó là Callback Function:
Trong code sẽ có một Function được gọi bởi Hàm API, Hàm này gọi là hàm thực thi của Hàm API
Thì biến gọi hàm này trong Hàm API phải có giá trị là 8bit cho Win64 (LongLong / LongPtr / Any)
Đã có 1 lần bạn viết nhưng tôi cho là bạn gõ nhầm, chuyện thường ở huyện, nên không ý kiến. Nhưng do lặp lại thì cũng nên nói lại. 8 bai chứ không phải 8 bit. 8 bai = 8*8 bit = 64 bit.
 
Upvote 0
Đã có 1 lần bạn viết nhưng tôi cho là bạn gõ nhầm, chuyện thường ở huyện, nên không ý kiến. Nhưng do lặp lại thì cũng nên nói lại. 8 bai chứ không phải 8 bit. 8 bai = 8*8 bit = 64 bit.
Em hay nhớ 64bit với 32bit nên quen tay gõ bit. Cảm ơn anh đã nhắc nhỡ
 
Upvote 0
Web KT

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

Back
Top Bottom