Căn lề code VBA cho phần mềm khác.

Thanh Binh PV

Yêu THVBA
Em được biết bác vothanhthu có viết 1 công cụ để căn lề code cho Excel trong bài viết " ".
Cũng vì trình độ em có hạn nên em đọc code căn lề của bác vothanhthu chỉ hiểu được 1 ít .
Yêu cầu:
1. tách code căn lề trong bài viết của bác vothanhthu ở trong Userform sang module của file khác.
Bạn cần đăng nhập để thấy hình ảnh

- Hiện tại bác vothanhthu đang sử dụng Userform cho code căn lề và em muốn chuyển code trong Userform sang module của file khác.
Bạn cần đăng nhập để thấy hình ảnh

2. Code sẽ thực hiện lệnh ngay trong File mình đang mở và căn lề toàn bộ không sử dụng Userform (căn lề trực tiếp). Của bác Vothanhthu là sẽ cần phải dùng Userform để chọn một dự án để căn lề ( căn lề toàn dự án hoặc căn lề module) (căn lề gián tiếp)
Bạn cần đăng nhập để thấy hình ảnh


Để biết thêm về công cụ của bác vothanhthu , truy cập vào bài viết " ".

Em sẽ tìm hiểu và sau đó tùy biến lại cho phù hợp với VBA của phần mềm em đang làm. Em cảm ơn.
 
Sửa lần cuối:
B

bvtvba

Guest
Input là cái gì?
Căn lề cho code VBA trong phần mềm Inventor. Vậy phần mềm Inventor là phần mềm như thế nào? Phần mềm này có sử dụng code VBA à?
Làm thế nào để giúp được bạn trong khi người ta không biết Inventor là cái gì. Code của Inventor trông như thế nào?

Bạn mặc định người khác phải biết những điều trên cho nên không có hình ảnh giải thích hay demo file gì, thì cứ ngồi đấy đợi tới mùa quýt sẽ có người giúp.
Theo ngu ý của tôi, bạn cứ copy code của Inventor, cho vào Module bất kỳ của excel rồi dùng tool trên mà căn lề.

Căn lề là hành động như thế nào? Cũng cần định nghĩa và minh họa ra bằng hình ảnh. Cứ thò ra thụt vào là căn lề thì cứ code ngẫu nhiên, dòng 1 thò ra, dòng 2 thụt vào, dòng 3 thò ra, dòng 4 thụt vào... hay là phải dựa trên điều kiện như thế nào để thò ra thụt vào cho đúng?

Bạn đưa ra một dự án, sử dụng các ngôn từ chuyên ngành chỉ mình bạn hiểu, không rõ input, không rõ hành động mong muốn là như thế nào-thì không ai code được cả.

Lời khuyên: Hãy đặt mình vào vị trí người đọc, giả định rằng mình là người ngu nhất xã hội. Vậy phải trình bày như thế nào để cho người ngu nhất xã hội cũng hiểu được là thành công. Nếu trình bày còn lơ mơ , ý tưởng còn chưa rõ ràng, chính bản thân mình còn tù mù thì sao người khác hiểu hơn để mà giúp được.
 

Thanh Binh PV

Yêu THVBA
Căn lề cho code VBA trong phần mềm Inventor. Vậy phần mềm Inventor là phần mềm như thế nào? Phần mềm này có sử dụng code VBA à?
Em đã có nói là "em đang lập trình VBA cho phần mềm Inventor". Vậy nên phần mềm này có VBA. Chứ em cũng không nói em lập trình VBA Excel cho phần mềm này.
Làm thế nào để giúp được bạn trong khi người ta không biết Inventor là cái gì. Code của Inventor trông như thế nào?
Em nghĩ không cần ai cũng phải biết Inventor là cái gì. Nhưng theo em được biết thì VBA cho Excel hay Inventor hay cho bất kỳ phần mềm khác thì cơ bản đều giống nhau ( chỉ khác nhau cách truy cập vào cấu trúc phần mềm)
Input là cái gì?
không hiểu anh có đọc bài viết của em không.
Vì vậy nên em đăng bài này mong anh/chị có thể giúp em tách code căn lề thành sub trong module ( không sử dụng Userform) và hoạt động trực tiếp trong dự án mình đang làm không ạ. (tách ra trong Excel để em tìm hiểu và tùy biến sử dụng cho phù hợp với phần mềm Inventor).
Căn lề là hành động như thế nào? Cũng cần định nghĩa và minh họa ra bằng hình ảnh. Cứ thò ra thụt vào là căn lề thì cứ code ngẫu nhiên, dòng 1 thò ra, dòng 2 thụt vào, dòng 3 thò ra, dòng 4 thụt vào... hay là phải dựa trên điều kiện như thế nào để thò ra thụt vào cho đúng?
Anh có thể xem bài viết của anh vothanhthu để biết chi tiết về điều này.
Lời khuyên: Hãy đặt mình vào vị trí người đọc, giả định rằng mình là người ngu nhất xã hội. Vậy phải trình bày như thế nào để cho người ngu nhất xã hội cũng hiểu được là thành công. Nếu trình bày còn lơ mơ , ý tưởng còn chưa rõ ràng, chính bản thân mình còn tù mù thì sao người khác hiểu hơn để mà giúp được.
Không biết hàm ý của anh muốn đả kích em hay gì nhưng cảm thấy anh rất nóng trong vấn đề này.
 

tuhocvba

Administrator
Thành viên BQT
Thay vì ngồi quote từng câu chữ như ở #3, bạn thử ngồi suy nghĩ xem có cách nào diễn đạt cho dễ hiểu hơn hay không? Một bài viết toàn chữ là một bài viết khó đọc.
Thế giới bây giờ hướng tới sự tiện lợi, bạn đọc ở trên diễn đàn này chỉ thích đọc cái gì dễ hiểu. Cái gì khó hiểu là cáu nhặng lên.
Bạn thử suy nghĩ xem, có cách nào để dễ hiểu, sử dụng hình minh họa như thế nào cho trực quan, dễ đi vào lòng người.

Trình bày dễ hiểu là một nghệ thuật, tuy khó, nhưng nên khiêm nhường tiếp thu và cải thiện khả năng này dần dần, cái đó ai cũng lý giải được, nếu phản ứng lại bằng thái độ xấu sẽ trở thành hành vi phản cảm trên diễn đàn. Mong bạn sớm quen với yêu cầu kiểu này ở trên diễn đàn này. Và đừng coi đó là thiếu thiện chí hay kiếm cớ cà khịa. Ai cũng thích đọc một bài dễ hiểu.
 

Thanh Binh PV

Yêu THVBA
Thay vì ngồi quote từng câu chữ như ở #3, bạn thử ngồi suy nghĩ xem có cách nào diễn đạt cho dễ hiểu hơn hay không? Một bài viết toàn chữ là một bài viết khó đọc.
Thế giới bây giờ hướng tới sự tiện lợi, bạn đọc ở trên diễn đàn này chỉ thích đọc cái gì dễ hiểu. Cái gì khó hiểu là cáu nhặng lên.
Bạn thử suy nghĩ xem, có cách nào để dễ hiểu, sử dụng hình minh họa như thế nào cho trực quan, dễ đi vào lòng người.

Trình bày dễ hiểu là một nghệ thuật, tuy khó, nhưng nên khiêm nhường tiếp thu và cải thiện khả năng này dần dần, cái đó ai cũng lý giải được, nếu phản ứng lại bằng thái độ xấu sẽ trở thành hành vi phản cảm trên diễn đàn. Mong bạn sớm quen với yêu cầu kiểu này ở trên diễn đàn này. Và đừng coi đó là thiếu thiện chí hay kiếm cớ cà khịa. Ai cũng thích đọc một bài dễ hiểu.
Em công nhận là em diễn đạt chưa dễ hiểu. Nhưng nếu đã đọc bài viết của em thì anh ở bài #2 đã không nói như vậy rồi mà thay vì đọc thì lại đi nhận xét người khác như vậy. Và em cũng không có thái độ phản ứng lại thái quá về việc đó.
Em sẽ sửa lại bài viết.
 
V

vothanhthu

Guest
@Thanh Binh PV Thứ biết Inventor là phần mềm chuyên bên thiết kế cơ khí nhưng Thứ hơi thắc mắc chút xíu. Như bvtvba nói, sao bạn không copy code từ Inventor vào trong 1 module nào đó, rồi dùng code của mình căn lề nhỉ?. Vậy sẽ tiện, không cần đầu tư và tốn thời gian.
 

Thanh Binh PV

Yêu THVBA
@Thanh Binh PV Thứ biết Inventor là phần mềm chuyên bên thiết kế cơ khí nhưng Thứ thắc mắc chút xíu. Như bvtvba nói, sao bạn không copy code từ Inventor vào trong 1 module nào đó rồi mình căn lề nhỉ?
Dạ. Vì trong Inventor em viết nhiều module ( tầm khoảng 20 module để quản lí. ) nên em muốn tìm cách để làm một lần và quan trọng nhất là cũng để em học hỏi thêm về cấu trúc trong Inventor cũng như Excel ạ.
 
V

vothanhthu

Guest
@Thanh Binh PV Vì nhu cầu của bạn học hỏi là chính, nên Thứ gợi ý cho bạn dễ hiểu hơn code của mình để có thể tùy ý bạn sử dụng.

Để chuyển từ Userform sang Sub, thì bạn cần chú ý vị trí các biến được nạp vào nút cbOK, chỉ cần bạn thay đổi các biến này không còn phụ thuộc vào Userform thì bạn có thể chuyển thành sub rất dễ dàng.

Trong Code bạn chú ý 2 biến cbxProjects là tên Project và cbxComponents là tên Module. Hãy thử cố định và tùy biến sao cho 2 biến này, và một số biến liên quan khác không còn phụ thuộc vào Userform. Bạn sẽ có thể chuyển code trên thành Sub.
 
Sửa lần cuối bởi điều hành viên:

tuhocvba

Administrator
Thành viên BQT
Chúng ta thảo luận trên tinh thần công việc nhé.

1. tách code căn lề trong bài viết của bác vothanhthu thành sub trong module ( không sử dụng Userform).
Cần nêu hiện trạng đang là gì, muốn cải tiến thành cái gì.
UserForm ở đây là UserForm của file nào.
Người dùng sẽ có hai khả năng hiểu:

1.1 Inventor có UserForm trên đó có code, thì không cần căn lề code cho cái này.
1.2 File của vothanhthu có UserForm và không muốn dùng UserForm này

Chú ý: Người đọc chưa down file của vothanhthu, và không nên có suy nghĩ là người ta hãy down về đã rồi nói chuyện. Người đọc cũng không biết Inventor là cai gì.

2. Chỉ hoạt động căn lề trực tiếp trong dự án mình đang làm.
Cần giải thích rõ hơn. Căn lề gián tiếp là như thế nào.

Hãy thử trình bày lại một lần nữa cho dễ hiểu hơn.
 

Euler

Administrator
Thành viên BQT
Lờ mờ đoán ra ý định của bạn ấy như sau, chủ topic xác nhận xem tôi hiểu đúng không nhé.
===========================================================
1. Mục đích muốn căn lề Code.
Căn lề code là gì?
Ví dụ:
Code chưa được căn lề như sau:
Mã:
Private Sub Add_Addin()
With Excel.Application
With .CommandBars("Cell").Controls.Add(Temporary:=True)
.FaceId = 271
.BeginGroup = True
.Caption = conAddinNameSaveImage
.OnAction = "SaveImage"
End With
With .CommandBars("Column").Controls.Add(Temporary:=True)
.FaceId = 271
.BeginGroup = True
  .Caption = conAddinNameSaveImage
  .OnAction = "SaveImage"
  End With
End With
End Sub
Code được căn lề thì có dạng như sau:
Mã:
Private Sub Add_Addin()
    With Excel.Application
        With .CommandBars("Cell").Controls.Add(Temporary:=True)
            .FaceId = 271
            .BeginGroup = True
            .Caption = conAddinNameSaveImage
            .OnAction = "SaveImage"
        End With
        With .CommandBars("Column").Controls.Add(Temporary:=True)
            .FaceId = 271
            .BeginGroup = True
            .Caption = conAddinNameSaveImage
            .OnAction = "SaveImage"
        End With
    End With
End Sub
2. Hiện trạng:
Tool của vothanhthu đã làm điều này cho Excel:
Download ở đây:

Bạn cần đăng nhập để thấy hình ảnh

Code hiện nay đang được viết trên UserForm: UserForm Name = UFIndexModule.
Tên thủ tục là: Private Sub cbOK_Click()

3. Nội dung nhờ vả:
Mong muốn chuyển thủ tục căn lề này ra Module, không để ở UserForm. // Private Sub cbOK_Click()
Lý do: Hiện tại căn lề đang xử lý cho các project của VBA Excel. Tuy nhiên tôi muốn học hỏi và áp dụng cho code trên phần mềm Inventor của cá nhân tôi đang sử dụng.

============================
Nếu diễn đạt như thế này thì ai cũng hiểu.
 

Thanh Binh PV

Yêu THVBA
@Thanh Binh PV Vì nhu cầu của bạn học hỏi là chính, nên Thứ gợi ý cho bạn dễ hiểu hơn code của mình để có thể tùy ý bạn sử dụng.

Để chuyển từ Userform sang Sub, thì bạn cần chú ý vị trí các biến được nạp vào nút cbOK, chỉ cần bạn thay đổi các biến này không còn phụ thuộc vào Userform thì bạn có thể chuyển thành sub rất dễ dàng.

Trong Code bạn chú ý 2 biến cbxProjects là tên Project và cbxComponents là tên Module. Hãy thử cố định và tùy biến sao cho 2 biến này, và một số biến liên quan khác không còn phụ thuộc vào Userform. Bạn sẽ có thể chuyển code trên thành Sub.
cảm ơn anh về điều này ạ. Ngày mai em sẽ thử chuyển code xem sao.

Chúng ta thảo luận trên tinh thần công việc nhé.
Cần nêu hiện trạng đang là gì, muốn cải tiến thành cái gì.
UserForm ở đây là UserForm của file nào.
Người dùng sẽ có hai khả năng hiểu:
1.1 Inventor có UserForm trên đó có code, thì không cần căn lề code cho cái này.
1.2 File của vothanhthu có UserForm và không muốn dùng UserForm này
Chú ý: Người đọc chưa down file của vothanhthu, và không nên có suy nghĩ là người ta hãy down về đã rồi nói chuyện. Người đọc cũng không biết Inventor là cai gì.
Cần giải thích rõ hơn. Căn lề gián tiếp là như thế nào.
Hãy thử trình bày lại một lần nữa cho dễ hiểu hơn.
Em đã sửa lại bài viết theo ý của mình. admin xem lại được chưa ạ.
Về vấn đề 1.1 của admin thì em nghĩ không cần thiết nêu ra vì em chỉ cần tách code sang file Excel khác. Còn việc tùy biến em sẽ tự nghiên cứu để tùy biến cho phù hợp với phần mềm em đang làm.

Lờ mờ đoán ra ý định của bạn ấy như sau, chủ topic xác nhận xem tôi hiểu đúng không nhé.
===========================================================
1. Mục đích muốn căn lề Code.
Căn lề code là gì?
Ví dụ:
Code chưa được căn lề như sau:
Mã:
Private Sub Add_Addin()
With Excel.Application
With .CommandBars("Cell").Controls.Add(Temporary:=True)
.FaceId = 271
.BeginGroup = True
.Caption = conAddinNameSaveImage
.OnAction = "SaveImage"
End With
With .CommandBars("Column").Controls.Add(Temporary:=True)
.FaceId = 271
.BeginGroup = True
  .Caption = conAddinNameSaveImage
  .OnAction = "SaveImage"
  End With
End With
End Sub
Code được căn lề thì có dạng như sau:
Mã:
Private Sub Add_Addin()
    With Excel.Application
        With .CommandBars("Cell").Controls.Add(Temporary:=True)
            .FaceId = 271
            .BeginGroup = True
            .Caption = conAddinNameSaveImage
            .OnAction = "SaveImage"
        End With
        With .CommandBars("Column").Controls.Add(Temporary:=True)
            .FaceId = 271
            .BeginGroup = True
            .Caption = conAddinNameSaveImage
            .OnAction = "SaveImage"
        End With
    End With
End Sub
2. Hiện trạng:
Tool của vothanhthu đã làm điều này cho Excel:
Download ở đây:

Bạn cần đăng nhập để thấy hình ảnh

Code hiện nay đang được viết trên UserForm: UserForm Name = UFIndexModule.
Tên thủ tục là: Private Sub cbOK_Click()

3. Nội dung nhờ vả:
Mong muốn chuyển thủ tục căn lề này ra Module, không để ở UserForm. // Private Sub cbOK_Click()
Lý do: Hiện tại căn lề đang xử lý cho các project của VBA Excel. Tuy nhiên tôi muốn học hỏi và áp dụng cho code trên phần mềm Inventor của cá nhân tôi đang sử dụng.

============================
Nếu diễn đạt như thế này thì ai cũng hiểu.
Em cảm ơn ạ. Diễn đạt như anh rất là dễ hiểu. Khả năng em có hạn nên không diễn đạt tốt được như vậy. Em có thử diễn đạt lại theo ý của mình, anh có thể xem giúp em và cho nhận xét được không ạ.
 

Euler

Administrator
Thành viên BQT
Hiện tại bài viết #1 là đã dễ hiểu rồi. Sẽ có vài vấn đề như sau:
Nó không thể căn lề chính nó, là điều mình có thể hình dung được.
Tuy nhiên có thể tách ra:
Module main: Là phần chứa code căn lề.
Modue 1
Moduel 2
...
Code chạy từ Module main để căn lề toàn bộ các Module 1, Module 2,... là việc có thể làm được.
Việc code này tự nhiên sẽ tốn khá nhiều thời gian nếu chỉ là để tìm hiểu, vậy bạn cứ thử tìm hiểu rồi làm. Làm xong chia sẻ thì tốt.

Với mình, luôn có thói quen sử dụng phím Tab để căn lề khi viết code, cho nên việc này là không cần thiết. Tính năng này của vothanhthu đối với mình là cũng không cần thiết.
 

Thanh Binh PV

Yêu THVBA
Hiện tại bài viết #1 là đã dễ hiểu rồi. Sẽ có vài vấn đề như sau:
Nó không thể căn lề chính nó, là điều mình có thể hình dung được.
Tuy nhiên có thể tách ra:
Module main: Là phần chứa code căn lề.
Modue 1
Moduel 2
...
Code chạy từ Module main để căn lề toàn bộ các Module 1, Module 2,... là việc có thể làm được.
Việc code này tự nhiên sẽ tốn khá nhiều thời gian nếu chỉ là để tìm hiểu, vậy bạn cứ thử tìm hiểu rồi làm. Làm xong chia sẻ thì tốt.

Với mình, luôn có thói quen sử dụng phím Tab để căn lề khi viết code, cho nên việc này là không cần thiết. Tính năng này của vothanhthu đối với mình là cũng không cần thiết.
Ý tưởng hiện tại của em là sẽ thiết lập chuỗi ở đầu mỗi Module và dùng hàm InStr để tạo vòng lặp đối với chuỗi đó.
Ví dụ như :
Module 1 -----> CD-Module 1
Module 2 -----> CD-Module 2...
Em thì cẩu thả hay code kiểu nghĩ gì làm nấy nên đôi khi dòng code không được đẹp và khó nhìn . Tính năng của bác vothanhthu thì em cũng không sài mà em thấy nó khá hay nên muốn tìm hiểu. Thường thì em sài trực tiếp trên các trang web căn lề online như : , .

Không biết trong diễn đàn có mấy anh/chị nào đang và đã đang dùng VBA cho phần mềm Inventor không nhỉ?
 

Thanh Binh PV

Yêu THVBA
@Thanh Binh PV Vì nhu cầu của bạn học hỏi là chính, nên Thứ gợi ý cho bạn dễ hiểu hơn code của mình để có thể tùy ý bạn sử dụng.

Để chuyển từ Userform sang Sub, thì bạn cần chú ý vị trí các biến được nạp vào nút cbOK, chỉ cần bạn thay đổi các biến này không còn phụ thuộc vào Userform thì bạn có thể chuyển thành sub rất dễ dàng.

Trong Code bạn chú ý 2 biến cbxProjects là tên Project và cbxComponents là tên Module. Hãy thử cố định và tùy biến sao cho 2 biến này, và một số biến liên quan khác không còn phụ thuộc vào Userform. Bạn sẽ có thể chuyển code trên thành Sub.
- Em xem giúp em lỗi này được không ạ. Em đã chuyển code sang sub nhưng khi chạy thì bị báo lỗi như hình dưới. ( dòng 24)
Lưu ý: Em chưa bẫy lỗi cho trường hợp căn lề cho chính nó.

Bạn cần đăng nhập để thấy hình ảnh

- Em thắc mắc ở dòng code sau, sao lại phải nhân 2 ạ. Em hiểu là đếm số dòng trong Module nhưng không hiểu tại sao phải nhân 2.
Mã:
lNumLines = .CountOfLines * 2
Mã:
Option Explicit
Private oVBProj     As VBIDE.VBProject
Private oVBComp     As VBIDE.VBComponent
Private oVBMod      As VBIDE.CodeModule
Private lNumLines   As Long
Private lCntr       As Long
Private sTabs       As String
Private sCodeString As String
Private bTrustAccess As Boolean
Private bRunCode    As Boolean
Private sIndentOption As String

Sub test_indent_vba()
Dim wb As Workbook
Set wb = ActiveWorkbook
Set oVBProj = wb.VBProject
            For Each oVBComp In oVBProj.VBComponents 'Vong lap Module
                With oVBComp.CodeModule
                    sTabs = ""
                    lNumLines = .CountOfLines * 2

                    For lCntr = 1 To lNumLines
                       
                        .ReplaceLine lCntr, LTrim(.Lines(lCntr, 1))
                       
                        sCodeString = .Lines(lCntr, 1)
                       
                        Select Case sCodeString
                           
                            Case "End Sub", "End Function", "End Type", "End Enum", "End Property"
                                sTabs = ""
                               
                            Case "End If", "#End If", "End Select", "End With", "Else", "#Else", "Loop"
                                sTabs = Replace(sTabs, vbTab, "", 1, 1)
                               
                        End Select
                       
                        If Left(sCodeString, 4) = "Next" Then sTabs = Replace(sTabs, vbTab, "", 1, 1)
                       
                        If InStr(sCodeString, "Loop Until") > 0 Then sTabs = Replace(sTabs, vbTab, "", 1, 1)
                       
                        If InStr(sCodeString, "Loop While") > 0 Then sTabs = Replace(sTabs, vbTab, "", 1, 1)
                       
                        If InStr(sCodeString, "Wend") > 0 Then sTabs = Replace(sTabs, vbTab, "", 1, 1)
                       
                        .ReplaceLine lCntr, sTabs & .Lines(lCntr, 1)
                       
                        '//Tab theo tung Thuoc tinh
                        If Left(sCodeString, 4) = "Sub " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 12) = "Private Sub " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 11) = "Public Sub " Then sTabs = sTabs & vbTab
                       
                        If Left(sCodeString, 9) = "Function " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 17) = "Private Function " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 16) = "Public Function " Then sTabs = sTabs & vbTab
                       
                        If Left(sCodeString, 5) = "Type " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 13) = "Private Type " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 12) = "Public Type " Then sTabs = sTabs & vbTab
                       
                        If Left(sCodeString, 5) = "Enum " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 13) = "Private Enum " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 12) = "Public Enum " Then sTabs = sTabs & vbTab
                       
                        If Left(sCodeString, 9) = "Property " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 17) = "Private Property " Then sTabs = sTabs & vbTab
                        If Left(sCodeString, 16) = "Public Property " Then sTabs = sTabs & vbTab
                       
                        sCodeString = Left(sCodeString, InStr(sCodeString, " ") - 1)
                       
                        Select Case sCodeString
                            Case "For", "With", "Select", "Else", "#Else", "Do"
                                sTabs = sTabs & vbTab
                        End Select
                       
                        If sCodeString = "If" And Right(.Lines(lCntr, 1), 4) = "Then" Then
                            sTabs = sTabs & vbTab
                        End If
                       
                        If sCodeString = "#If" And Right(.Lines(lCntr, 1), 4) = "Then" Then
                            sTabs = sTabs & vbTab
                        End If
                       
                        If sCodeString = "If" And Right(.Lines(lCntr, 1), 1) = "_" And Right(.Lines(lCntr + 1, 1), 4) = "Then" Then
                            sTabs = sTabs & vbTab
                        End If
                       
                        If sCodeString = "#If" And Right(.Lines(lCntr, 1), 1) = "_" And Right(.Lines(lCntr + 1, 1), 4) = "Then" Then
                            sTabs = sTabs & vbTab
                        End If
                    Next lCntr
                End With
             Next
            End Sub
 
T

thanhphong

Guest
Tự hỏi cũng tự trả lời được luôn, bạn có thể kiểm chứng, đó là sửa lại dòng code đó:
Mã:
lNumLines = .CountOfLines '* 2
Cho commentout cái phần *2 đi, sẽ thấy chương trình vẫn thực thi đúng.
Có lẽ trong một số trường hợp nào đó, có xảy ra output không mong muốn, cho nên tác giả vothanhthu muốn xử lý thừa hơn thiếu. Điều này cũng thường thấy trong xử lý lỗi, khi không biết nguyên nhân rõ ràng, thì người code có xu hướng hành động: Cho xử lý thừa hơn thiếu hoặc vừa đủ. Cho xóa hết những gì không cần thiết trên sheet nháp thì không tốt bằng khởi tạo sheet mới...

Điều bạn muốn là có tương tác của tác giả để trả lời lý do, trong trường hợp này theo tôi là không cần thiết, bạn có thể bỏ *2 đi.
 
B

bvtvba

Guest
Hình thành thói quen sử dụng phím Tab thì tốt hơn. Đây là cách giải quyết vấn đề nhanh nhất.
Trước đây tôi cứ dùng phím Space, rồi một anh chị trên diễn đàn này khuyên tôi nên sử dụng phím Tab, code rất tiện và đẹp mắt.
Tool chỉ là phương tiện, bao quát được vài trường hợp như trong code bạn vothanhthu đã xử lý.
Ta có ví dụ sau:
Code không căn lề:
Sub test()
MsgBox "OK" & _
"Hihi"
End Sub
Và:
Kết quả Tool chỉnh sửa lại:
Sub test()
    MsgBox "OK" & _
    "Hihi"
End Sub
Trong khi đó thói quen của tôi mong muốn là dòng "Hihi" thụt vào thêm nữa:
Mã:
Sub test()
    MsgBox "OK" & _
                "Hihi"
End Sub
 
Top