Nhờ giải nghĩa code VBA

Liên hệ QC

Đỗ Đức Tuấn

Thành viên mới
Tham gia
14/4/18
Bài viết
12
Được thích
1
Giới tính
Nam
Chào cả nhà.

Mình đang gặp chục chặc 1 chút về đọc code VBA

đó là:

Có 1 số đoạn code như sau:

có đoạn code viết sau đó thêm dấu ":" mình không hiểu rõ lắm về ý nghĩa của dấu 2 chấm này.

mong các Cao thủ chỉ giáo


Code:

Dim lb_file, cur_file, tg, func As String
Dim check As Boolean 'bien xac nhan tim thay ma trong bang tong hop
Dim Filename As String
Dim PathName As String
Dim sHostName As String

If Range("A8") = "" Then GoTo empty_data

Call Backup_data

sHostName = Environ$("computername")
With Sheets("Barcode list")
For i = 1 To .Range("Z100").End(xlUp).Row
If sHostName = .Cells(i, 26) Then
PathName = .Cells(i, 27).Value & "\" 'thay doi path tai day
GoTo out_path
End If
Next i
out_path: ( ý nghĩa của dấu":".......... )
End With
If PathName = "" Then GoTo missing_Link
..........
 
Cụm lệnh:
PHP:
With Sheets("Barcode list")
   For i = 1 To .Range("Z100").End(xlUp).Row
      If sHostName = .Cells(i, 26) Then
         PathName = .Cells(i, 27).Value & "\" 'thay doi path tai day
         GoTo out_path
      End If
 Next i
End With
Tương đương với:
Mã:
For i = 1 To Sheets("Barcode list").Range("Z100").End(xlUp).Row
   If sHostName = Sheets("Barcode list").Cells(i, 26) Then
      PathName = Sheets("Barcode list").Cells(i, 27).Value & "\" 'thay doi path tai day
      GoTo out_path
   End If
Next i
 
Trong trường hợp này dấu : cho biết out_path là một "line label", nôm na là một vị trí được đánh dấu. Khi gặp dòng lệnh GoTo out_path thì code sẽ nhảy tới vị trí này để thực thi tiếp.
 
Dấu ':" (hai chấm) còn được dùng để ngăn cách 2 dòng lệnh ngắn nằm trên 1 dòng, như:
PHP:
If sArr(J, Col) = StrFilter Then
            W = W + 1:                      dArr(W, 1) = W
            For Cot = 1 To 4
                dArr(W, 1 + Cot) = sArr(J, Cot)
            Next Cot
            dArr(W, 6) = sArr(J, 8)
        End If

Còn câu lệnh dài quá, khó coi thì người ta cho phép ngắt ra làm 2 hay nhiều dòng bỡi "_"

Chúc vui!
 
Mình đang gặp chục chặc 1 chút về đọc code VBA
đó là:
Có 1 số đoạn code như sau:
có đoạn code viết sau đó thêm dấu ":" mình không hiểu rõ lắm về ý nghĩa của dấu 2 chấm này
Như thế là bạn chỉ gặp 1 cái chặc chứ có gặp 10 cái chặc đâu nhỉ. :D
 
Trong trường hợp này dấu : cho biết out_path là một "line label", nôm na là một vị trí được đánh dấu. Khi gặp dòng lệnh GoTo out_path thì code sẽ nhảy tới vị trí này để thực thi tiếp.
Goto là lệnh rẽ nhánh vô điều kiện.
Ngày xưa, BASIC bắt buộc mỗi dòng phải bắt đầu bằng một con số, tức là địa chỉ của dòng. Lệnh Goto chạy thẳng đến dòng ấy.
Về sau này BASIC cải tiến, không cần sô để đánh địa chỉ dòng nữa. Muốn đi thẳng đến dòng nào thì đặt một Label trên dòng ấy và cho lệnh Goto chỉ thẳng vào Label ấy. Dùng Label sẽ được compiler/interprter định địa chỉ giùm.

Trong code trên, dấu ":" xác định rằng out_path là một Label. Lênh Goto trên chủ yếu là để thoát cái vòng lặp For.
Dấu ':" (hai chấm) còn được dùng để ngăn cách 2 dòng lệnh ngắn nằm trên 1 dòng, như:
...
Cũng là do chuyện lịch sử.
Ngày xưa, máy tính có bộ nhớ và số địa chỉ giới hạn. Điển hình máy PDP-11 bộ nhớ chỉ có 32 k words, hệ thống điều hành chiếm hết một mớ. Tiết kiệm bộ nhớ rất quan trọng.
Mỗi dòng BASIC thì số định vị trí dòng chiếm 12 bytes. Vì vậy người ta phải tìm cách giới hạn cái số dòng này.
Giải pháp lúc ấy là đặt cấu trúc lệnh sao cho nhiều lệnh có thể chia nhau một dòng. Và dấu ":" ra đời
Về sau này, bộ nhớ nhiều hơn, và BASIC cũng cải tiến hơn, không cần số dẫn dòng nữa. Nhưng người ta vẫn giữ ý nghĩa của dấu ":"

Chú thích:
Người viết code dạng cấu trúc thường tránh lệnh rẽ nhánh vôn điều kiện (Goto). Họ gọi code sử dụng Goto là "spaghetti code" (code lằng ngoằng)
Và dân cấu trúc cũng tránh gom lệnh với ":". Họ gọi code sử dụng ":" để gom lệnh là "grape fruit code" (code chùm bưởi)
Lý luận của họ là khi debug, người ta dò code từ dưới lên trên để tìm xem một biến bị gán lúc nào. Lúc ấy chỉ cần xem bên trái lệnh, trừ lệnh For và If thôi. Nếu sử dụng ":" thì mỗi dòng lại phải dò hết qua bên phải mới biết là mình không sót gì cả. Tiết kiệm số dòng cứng nhưng dò debug rất cực.
 
(riêng mình thì:)) Cố làm sao cho 1 macro nằm gọn trên màn hình VT (nếu được), đễ dễ bề quán xuyến (lỗi, hướng vận dộng, cách rẽ nhánh, trị của các tham biến,. . . . )
 
(riêng mình thì:)) Cố làm sao cho 1 macro nằm gọn trên màn hình VT (nếu được), đễ dễ bề quán xuyến (lỗi, hướng vận dộng, cách rẽ nhánh, trị của các tham biến,. . . . )
Nếu dùng cách gộp một đống lệnh vào dòng với mục đích tăng chiều ngang và giảm chiều dọc, thì JavaScript là ngôn ngữ có thể viết được việc này hữu hiệu nhất.
Mỗi lệnh JavaScript cách nhau bởi một dấu ";' hoặc "}". Và lúc nào muốn xuống hàng cũng được, chả cần phải ký hiệu nối. Đối với JavaScript, xuống hàng tương đương như dấu cách. Trừ phi cuối dòng có ghi chú.
Nhưng tại sao người viết JavaScript lại không làm như thế? Họ tránh "code bưởi bòng" vậy.
 
(riêng mình thì:)) Cố làm sao cho 1 macro nằm gọn trên màn hình VT (nếu được), đễ dễ bề quán xuyến (lỗi, hướng vận dộng, cách rẽ nhánh, trị của các tham biến,. . . . )
Mắt bác vẫn tinh thật, nhìn theo chùm mà không lộn.

Code kiểu 1 màn hình có vẻ hợp với upload lên diễn đàn cho gọn mắt
Thực ra code dài và viết cho người khác đọc thì tốt nhất cứ tách mỗi lệnh 1 dòng là tốt nhất, Lệnh dài thì có thể 1 lệnh nhiều dòng
 
cảm ơn cả nhà đã hỗ trợ mình nhé

Chân thành cảm ơn mọi người
 
Mắt bác vẫn tinh thật, nhìn theo chùm mà không lộn.
Tôi không bao giờ, nhắc lại - không bao giờ, viết nhiều lệnh trong 1 dòng. Không bao giờ khai báo biến với %, & hay gì đó. Cái đầu đâu phải chỗ nhồi nhét. Một thời gian không dùng liệu có còn nhớ? Cứ Long, Double, String thôi. Hay ho gì mấy chuyện ":", % hay &.
 
Em chào cả nhà ạ!!
Em tìm trên mạng thấy 1 đoạn code vba đánh số kế tiếp Phiếu nhập xuất để đỡ bị trùng,
Nhưng trong quá trình chạy, nó chạy rất ì ạch,
Xin các cao thủ giúp em tăng tốc nó được không ạ,
...
Trả lời ngắn gọn: không được.
Trả lời dài dòng giải thích: vấn dề của bạn chra iên quan gì đến vấn đề của thớt này. Bạn chen ngang thế này lfa bất lịch sự. Tự mở một thớt khác mà hỏi.
 
Web KT
Back
Top Bottom