Nhờ dịch code ra tiếng Việt

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,469
Nghề nghiệp
Công chức
Tôi vẫn biết rằng muốn học VBA tốt thì trước hết phải biết tiếng Anh. Nhưng tôi vẫn muốn nhờ các bạn GPE giúp đỡ những người không biết tiếng Anh (như Tôi chẳng hạn) tiếp cận với VBA bằng cách Dịch code ra tiếng Việt như ví dụ sau:


Nhờ các bạn dịch giúp ra tiếng Việt đoạn code trong file đính kèm:
[FONT=&quot]Xin cảm ơn![/FONT]
PHP:
Option Explicit
Sub TongHop()
Dim Sh As Worksheet
 Dim Rng As Range, Clls As Range, SRng As Range, bRng As Range
 Dim Tong As Single
 Dim bJ As Byte, DgCuoi As Long, Lrow As Long
 
 
 Application.ScreenUpdating = False
 Sheets("Tong Hop").[it1] = "ChuHo"
1 ' Them Cac Dong Phu Tro Vo Cac Sheet:'
 For Each Sh In Worksheets
   If Sh.Name <> "Tong hop" Then
      Sh.Select:  Lrow = [a65500].End(xlUp).Row
      Range("B2:B" & Lrow).Copy Destination:=Sheets("Tong hop").Range("IT" & _
         Sheets("Tong Hop").[it65500].End(xlUp).Row + 1)
      Columns("A:A").Select
      Selection.SpecialCells(xlCellTypeConstants, 1).Select
      Set Rng = Selection
      For bJ = 1 To 2
         For Each Clls In Rng
            If bJ = 1 Then
               Clls.Offset(1).EntireRow.Insert
            Else
               Clls.Offset(1, 1) = Sh.Name
               Clls.Offset(1, 6) = Clls.Offset(, 6)  '<<=='
            End If
      Next Clls, bJ
   End If
 Next Sh
2 ' Tao Danh Sach Khach Hang Duy Nhat:'
 Sheets("Tong hop").Select:               DgCuoi = [b1].CurrentRegion.Rows.Count
 Range("A2:J" & DgCuoi + 9).Clear:        Columns("IT:IT").Select
 Selection.SpecialCells(xlCellTypeBlanks).Select
 Selection.Delete Shift:=xlUp
 Range("IT:IT").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
   "IV1"), Unique:=True
 Columns("IT:IT").Clear
3 ' Chep Du Lieu Vo Sheets("Tong hop"): '
 Lrow = [iV65500].End(xlUp).Row
 For bJ = 2 To Lrow    'Chu I bJ Khi Khach Hang Nhieu'
   For Each Sh In Worksheets
      If Sh.Name <> "Tong hop" Then
         Set Rng = Sh.Columns("B:B").Find(what:=Cells(bJ, "IV"), LookIn:=xlValues)
         If Not Rng Is Nothing Then
            DgCuoi = Rng.Offset(1).End(xlDown).Row
            If DgCuoi > 65500 Then DgCuoi = Sh.[a65500].End(xlUp).Row + 1
 
            If Tong = 0 Then
               Set SRng = [a65500].End(xlUp).Offset(1, 6)  '<<=='
            Else
               Set bRng = [a65500].End(xlUp).Offset(1, 6)  '<<=='
            End If
            Rng.Offset(, -1).Resize(DgCuoi - Rng.Row, 9).Copy _
               Destination:=[a65500].End(xlUp).Offset(1)
            Tong = Tong + Rng.Offset(, 5)                   '<<=='
         End If
 
      End If
   Next Sh
   SRng.Value = Tong:               Tong = 0       '<<=='
   bRng.Value = ""                                 '<<=='
 Next bJ
 Columns("IV:Iv").Clear
4 ' Xoa Cac Dong Phu Tro:'
 For Each Sh In Worksheets
   If Sh.Name <> "Tong hop" Then
      Do
      Set Rng = Sh.Columns("B:B").Find(what:=Sh.Name, LookIn:=xlValues)
         If Rng Is Nothing Then
            Exit Do
         Else
            Rng.EntireRow.Delete
         End If
      Loop
   End If
 Next Sh
End Sub
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
PHP:
Option Explicit 
Sub TongHop() 
 Dim Sh As Worksheet 
 Dim Rng As Range, Clls As Range, SRng As Range, bRng As Range 
 Dim Tong As Single 
 Dim bJ As Byte, DgCuoi As Long, Lrow As Long 
    
 Application.ScreenUpdating = False 
 Sheets("Tong Hop").[it1] = "ChuHo" 
1 ' Them Cac Dong Phu Tro Vo Cac Sheet:' 
3 For Each Sh In Worksheets 
   If Sh.Name <> "Tong hop" Then 
5      Sh.Select:  Lrow = [a65500].End(xlUp).Row 
      Range("B2:B" & Lrow).Copy Destination:=Sheets("Tong hop").Range("IT" & _ 
         Sheets("Tong Hop").[it65500].End(xlUp).Row + 1) 
7      Columns("A:A").Select 
9      Selection.SpecialCells(xlCellTypeConstants, 1).Select 
      Set Rng = Selection 
11      For bJ = 1 To 2 
         For Each Clls In Rng 
13            If bJ = 1 Then 
                       Clls.Offset(1).EntireRow.Insert 
15            Else 
                        Clls.Offset(1, 1) = Sh.Name 
17                     Clls.Offset(1, 6) = Clls.Offset(, 6)  '<<==' 
            End If 
19      Next Clls, bJ 
   End If 
21  Next Sh 
2 ' . . . '
Dòng lệnh từ 3 - 21: Tạo vòng lặp khảo sát các sheet của bảng tính
D4: Điều kiện khảo sát là: Không xét đến trang tính có tên là "Tong hop". Nói thêm: Ta không nên đặt tên trang tính có chứa khoảng trống; Lý do: Bất tiện khi xài với VBA!
D5: Kích hoạt (từng) trang tính;
Lấy trị dòng cuối chứa dữ liệu (DL) của cột 'A' gán vô biến đã khai báo trên. Nói thêm: Biến này phải có kiểu DL là Long, chỉ có vậy nó mới chứa được biến mà ta gán; Nếu ta khai báo thấp hơn (như kiểu Interger) thì có khi VBA báo lỗi!
D6: Là câu lệnh trãi dài qua 2 dòng lệnh (Chúng được nối với nhau bằng dấu '_' theo quy ước)
Câu lệnh buộc ta Copy DL cột 'B' của trang tính đang khảo sát sang ô trống đầu tiên của cột 'IT' của trang tính 'Tong hop'. Như vậy ta sẽ thấy trong vòng lặp lệnh này được thực thi n-1 lần, một khi ta có n trang tính.
Một chú í nữa là: Câu lệnh trước dòng 1 đã gán chuỗi 'ChuHo' lên ô đầu của cột này.
D7 Chọn cột 'A'. Vậy các bạn biết cột 'A' này thuộc trang tính nào không? Chỉ lưu ý một tẹo, các bạn sẽ thấy tuyệt nhiên không phải là trang tính có tên 'Tong hop'
D9: Trên vùng đã chọn, ta lựa ra &chỉ chọn những ô chứa số trị (Isnumeric ()=True)
D10: Các ô thỏa đem gán vô biến có tên Rng đã khai báo trên & đã định kiểu DL là Range;
D11 (đến D19) tạo vòng 2 lần lặp lại
D12 (đến D19) Tạo vòng lặp khảo sát tất thẩy các ô trong biến Rng
D13 (đến D18) Điều kiện rẽ nhánh của vòng lặp D11;
Nếu biến lặp =1;
D14: Thêm dòng trống ngay dưới kề ô đang khảo sát. Ví dụ cho rõ thêm: Nếu ô đang khảo sát là A35 thì dòng 36 sẽ được thêm;
D15: Nếu điều kiện D13 không thỏa;
D16: (Lần 1 đã thêm dòng) thì lần này gán vô ô cột 'B' của dòng trống đó tên của trang tính;
D17: Giá trị tại cột thứ 6 của dòng trống được gán bỡi giá trị của dòng trên liền kè có cùng cột;
D18 - đã nêu (Kết thúc điều kiện D13)
D19: Kết thúc cùng lúc 2 vòng lặp For ... Next
D20: Kết thúc điều kiện D3
D21: Kết thúc câu chuyện khảo sát các trang tính
. . . . .

PHP:
Sub TongHop()
 
2 ' Tao Danh Sach Khach Hang Duy Nhat:'
22  Sheets("Tong hop").Select:               DgCuoi = [b1].CurrentRegion.Rows.Count
 Range("A2:J" & DgCuoi + 9).Clear:        Columns("IT:IT").Select
24  Selection.SpecialCells(xlCellTypeBlanks).Select
 Selection.Delete Shift:=xlUp
26 Range("IT:IT").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
   "IV1"), Unique:=True
27 Columns("IT:IT").Clear
3 '

D22: Câu lệnh đầu dòng: Chọn Sheets("Tong hop")
Câu sau: (Để hiểu câu lệnh này, chúng ta phải xem như ta đang dùng chuột chọn ô [B1] & tiếp theo vô menu Edit -> Goto -> Nhấn vô nút ' Special. . .' Cửa sổ Go to Special hiện ra, ta chọn nút Current Region).
Sau khi ta thành thục các tác động này, thì mở bộ thu macro & thực hiện những tác động đã thuộc nằm lòng đó, ta sẽ có câu lệnh trong macro thu được như sau:
Mã:
Sub GoToCurrentRegion()
    Range("B1").Select
    Selection.CurrentRegion.Select
End Sub
Phần tiếp của câu lệnh này là: Đếm số dòng của vùng hiện hành này & đem gán vô biến có tên là DgCuoi
D23: Câu lệnh đầu: Xóa dữ liệu (DL) trong vùng từ A2 cho đến cột 'J' với số dòng = trị chứa trong biến DgCuoi +9 ( Cộng 9 cho chắc ăn & vui thôi!). Thực ra câu lệnh này nhằm xóa kết quả do chạy macro lần trước đó.
Câu lệnh sau: Chọn cột 'IT'. Cần nhớ rằng cột này đang chứa toàn bộ DL do phần I chép sang từ tất cả các trang tính khác (trừ 'Tong hop';
D24: Chọn toàn bộ các ô trống trong cột này
D25: Xóa toàn bộ các ô đã chọn.
Ta có thể đoán rằng, trong vùng được chép sang có những ô trống. Và chúng cần được Delete đi (để chỉ còn các ô liên tục chứa DL)
D26: Đây là trái tim của phần này: Dùng câu lệnh AdvancedFilter trong VBA để lập danh sách duy nhất từ cột 'IT' chép sang cột cuối (Excel 2003)
Để hiểu được câu lệnh này, chúng ta hoàn toàn có thể dùng bộ thu macro của excel giống như phương thức hiểu câu lệnh goto CurentRegion như trên.
(Chúng ta nên thực hiện nhiều lần để hiểu hơn về câu lệnh này)
D27: Xong việc rồi, nên dọn rác do mình tạo ra; Để khỏi ảnh hưởng đến mọi người
Đó là xóa DL trong cột 'IT' đi; Tất nhiện DL trong cột iV chưa thể xóa vì ta đang & sẽ cần. Tất nhiên sau khi xài xong thì cũng sẽ xóa thôi! Vì lý do mội trường í mà!


Chúc vui!@$@!^%
 
Upvote 0
Cảm ơn Bác SA_DQ đã giúp.
Nhờ các bạn dịch tiếp phần còn lại và dịch theo từng câu cho dễ nghiên cứu vdụ:

If Sh.Name <> "Tong hop" Then
Điều kiện khảo sát là: Không xét đến trang tính có tên là "Tong hop". Nói thêm: Ta không nên đặt tên trang tính có chứa khoảng trống; Lý do: Bất tiện khi xài với VBA!

Sh
.Select: Lrow = [a65500].End(xlUp).Row
Kích hoạt (từng) trang tính;
Lấy trị dòng cuối chứa dữ liệu (DL) của cột 'A' gán vô biến đã khai báo trên. Nói thêm: Biến này phải có kiểu DL là Long, chỉ có vậy nó mới chứa được biến mà ta gán; Nếu ta khai báo thấp hơn (như kiểu Interger) thì có khi VBA báo lỗi!

Range("B2:B" & Lrow).Copy Destination:=Sheets("Tong hop").Range("IT" & _
Sheets("Tong Hop").[it65500].End(xlUp).Row + 1)
Là câu lệnh trãi dài qua 2 dòng lệnh (Chúng được nối với nhau bằng dấu '_' theo quy ước)
Câu lệnh buộc ta Copy DL cột 'B' của trang tính đang khảo sát sang ô trống đầu tiên của cột 'IT' của trang tính 'Tong hop'. Như vậy ta sẽ thấy trong vòng lặp lệnh này được thực thi n-1 lần, một khi ta có n trang tính.
...
Thanks !
 
Lần chỉnh sửa cuối:
Upvote 0
Thích từng dòng, thì từng dòng, nhưng sẽ không bao quát

3 ' Chep Du Lieu Vo Sheets("Tong hop"): '
Lrow = [iV65500].End(xlUp).Row
Trị số dòng cuối (có dữ liệu (DL)) của cột 'iV' được đem gán vô biến Lrow

For bJ = 2 To Lrow 'Chu I bJ Khi Khach Hang Nhieu'
Tạo vòng lặp duyệt toàn bộ các ô chứa DL trong cột kể từ [iV2]

For Each Sh In Worksheets
Tạo vòng lặp duyệt toàn bộ các sheets

If Sh.Name <> "Tong hop" Then
Áp đặt điều kiện cho vòng lặp là loại trừ Sheets ("Tong hop")

Set Rng = Sh.Columns("B:B").Find(what:=Cells(bJ, "IV"), LookIn:=xlValues)
Tìm trong (mỗi) trang tính tại cột 'B', trị cần tìm đang chứa trong ô dòng bJ của cột 'iV'

If Not Rng Is Nothing Then
Nếu tìm thấy, thì

DgCuoi = Rng.Offset(1).End(xlDown).Row
Chọn ô dưới ô tìm thấy, di chuyển xuống dòng cuối có DL kể từ ô chọn; Dòng đích đến được gán vô biến DgCuoi; Lưu ý biến DgCuoi này giờ ta dùng vào việc khác bêb trên rồi

If DgCuoi > 65500 Then DgCuoi = Sh.[a65500].End(xlUp).Row + 1
Nếu biến DgCuoi=65536 (>65500), thì nó phải nhận trị mới, đó là dòng cuối chứa DL của cột 'A'

If Tong = 0 Then
Rẽ nhánh theo điều kiện: Nếu biến có tên là Tong = 0 , thì

Set SRng = [a65500].End(xlUp).Offset(1, 6) '<<=='
Ô chứa DL cuối cùng của cột 'A', dịch chuyển xuống 1 dòng & qua phải 6 cột được đem gán vô biến SRng có kiểu dạng Range

Else
Rẽ nhánh thứ hai (Tong >0)

Set bRng = [a65500].End(xlUp).Offset(1, 6) '<<=='
Ô chứa DL cuối cùng của cột 'A', dịch chuyển xuống 1 dòng & qua phải 6 cột được đem gán vô biến bRng có kiểu dạng Range

End If
Kết thúc điều kiện

Rng.Offset(, -1).Resize(DgCuoi - Rng.Row, 9).Copy _
Destination:=[a65500].End(xlUp).Offset(1)

Copy vùng, xuất phát từ Rng, dịch chuyển qua trái 1 cột (,dòng không đổi); Mở rọng số dòng bằng với trị trong biến DgCuoi trừ đi trị dòng hiện hữu của Rng & số cột (mở rọng) là 9. Vùng Copy đem dán vô dòng đầu tiên không chứa DL của cột 'A' trang tính 'Tong hop'

Tong = Tong + Rng.Offset(, 5) '<<=='
Biến Tong được tăng lên trị chứa trong ô cùng dòng, cách 5 cột về phía phải

End If
End If

Kết thúc hai điều kiện If

Next Sh
Kết thúc khảo sát các trang tính

SRng.Value = Tong: Tong = 0 '<<=='
Ô SRng được gán trị chứa trong biến Tong; Sau khi gán xong thì xóa trị trong biến. Để làm chi vậy? Để chuẩn bị tiếp nhận trị mới (kể từ 0)

bRng.Value = "" '<<=='
Ô bRng được gán trị rỗng

Next bJ
Kết thúc vòng lặp với biến bJ

Columns("IV:Iv").Clear
Xong việc rồi, trả lại môi trường sạch cho đẹp (xóa DL) trong cột 'iV'

4
 
Upvote 0
}}}}}Cám ơn Bác SA_DQ đã chiếu cố viết lại bài này. Bài trước của Bác thì quá rõ rồi nhưng do trí nhớ của em tồi quá nên xem được câu dưới thì quên mất câu trên, đọc lại câu trên thì chả nhớ nó là câu nào bên dưới vì vậy em mới "thích" kiểu mực hệt này để học theo kiểu "o tròn giống quả trứng gà, ô thì...thì... thì... giống quả trứng gà đội nón". Rất mong được Bác và mọi người thông cảm.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom