Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình dịch theo nghĩa đen nha, muốn có nghĩa bống cần đưa đối tượng của macro này lên!

PHP:
Option Explicit
Sub VanDoi()            'Activate Sheet Truóc Tien'
'Dòng lệnh không cập nhật màn hình - nhằm tăng tốc:'
 Application.DisplayAlerts = False
'2 dòng tiếp theo là khai báo các biến, mà dòng sau là mình khai thêm:'
2 Dim xMax As Object, xDiem As Object
 Dim A, B, C, R, VT, VT1, Diem, Diem1, Diem2
'Gán Trang tính dang được kích hoạt vô biến:'
4 Set xDiem = ThisWorkbook.ActiveSheet
'Áp dụng fương thúc Copy:'
 xDiem.Copy After:=xDiem
'(Bạn hay ai đó đã diễn dịch:)'
6 ActiveSheet.Name = "VanDoi_TrichDiem"    'Sua Ten Sheet Vùa Duoc Copy'
'Gán Trị cho 2 biến đã khai báo; Kì thực các biến này hoàn toàn để chơi hay lòe nhau mà thôi:'
 A = 0:                                   B = 0
'Gán trang tính đang kích hoạt vô biến:'
8 Set xMax = ActiveSheet
'Gán trị =7 cho biến (có lẻ biến này ghi lại dòng tiêu đề của trang tính:'
 R = 7
'Tạo vòng lặp Do . . . Loop để xử lý dữ liệu:'
10 Do
'Tạo vòng lặp For. . .Next để xử lý dữ liệu theo cột (?):'
   For C = 6 To 62
'Lập D/Kiện, nếu trị trong ô có tọa độ r,c khác rỗng:'
12      If Cells(R, C) <> "" Then
'Fần dòng lệnh đầu: gàn trị vô biến VT; Fần sau: Gán trị chứa trong ô tọa độ đang khảo sát & ";" vô biến:'
         VT = 1:                          Diem = Cells(R, C) & ";"
'Tìm độ dài của chuỗi (Cách này chưa fải hay) & đem gán vô biến:'
14         VT1 = InStr(1, Diem, ";")
'Lập Đ/kiện Với trị trong biến VT1; Thực ra đ/k này là vô nghĩa vì hiễn nhi6n là vậy!:'
         If VT1 > 0 Then
'Dùng hàm để biến dạng chuỗi thành dạng số; Hình như có cách khác hay hơn!:'
16            Diem1 = Val(Mid(Diem, VT, VT1 - VT))
' Gán trị mới cho biến; Nhưng mình chưa rõ để làm gì???:'
            VT = VT1 + 1
 'Những dòng sau: bạn tham khảo các dòng tương tự đã dịch bên trên:'
18            Do
               VT1 = InStr(VT, Diem, ";")
20               A = 0
               If VT1 > 0 Then
22                  Diem2 = Val(Mid(Diem, VT, VT1 - VT))
                  VT = VT1 + 1
24                  If Diem1 < Diem2 Then Diem1 = Diem2
               Else
26                  Cells(R, C) = Diem1:    Exit Do
               End If
28               B = 0:                     A = 0
            Loop
30         End If
      End If
   Next
32   R = R + 1
   If Cells(R, 1) = "" Then Exit Do
34 Loop
End Sub
Nhận xét cuối cùng: Viết chương trình còn chưa tường minh; Không cô gọn & chỉnh sửa khi viết xong;
 
Upvote 0
Rất cảm ơn bạn TQ@ đã có câu trả lời cho mình. Lần này mình gửi theo cả file excel
http://www.giaiphapexcel.com/forum/a...1&d=1292552607
để làm việc với code, mời bạn xem lại code mìhn đã tích hợp trong VBA của file. Code này không phải do mình viết nên mình muốn hỏi code này có thể được chỉnh sửa theo cách như thế nào để ngán gọn hơn, cái nào lược đi được thi bạn lược giúp. Mục đích của code này có thể bạn cũng biết nhưng mình nói thế này: Nó dùng để trích ra điểm lớn nhất trong những ô có dấu ";", dấu này được dùng để tách điểm của những lần thi lại và/hoặc học lại. Mình rất quan tâm đến VBA nhưng bây giờ mới tập tẹ. Rất mong bạn quan tâm và giúp đỡ để mình hiểu nhiều hơn. Nếu có thể, mail của mình là: chipsandcrisps@gmail.com
 
Upvote 0
Sorry. Mình up lại đây.
Có phải bạn muốn:
- Những cell điểm nào có dấu ";" thì lấy điểm lớn nhất?
- Tạo một sheet giống như sheet "TieuhocK6" rồi chép tất cả điểm sửa & không sửa vào?
Bạn thử chạy code này rồi kiểm tra thử giúp mình xem chứ mình nhìn một hồi chóng mặt quá chẳng "kiểm cha kiểm mẹ" gì được
Thân
Mã:
Public Sub laydiemlon()
    Dim Vung, Tam, aMax, I, iCot, iHang, Mg(1 To 53, 1 To 52)
    Set Vung = [f10:f62].Resize(, 52)
        For iHang = 1 To 53
            For iCot = 1 To 52
                If InStr(1, Vung(iHang, iCot), ";") Then
                    Tam = Split(Vung(iHang, iCot), ";")
                        For I = 0 To UBound(Tam)
                            aMax = Application.WorksheetFunction.Max(aMax, Tam(I))
                        Next
                            Mg(iHang, iCot) = aMax
                            aMax = 0
                Else
                    Mg(iHang, iCot) = Vung(iHang, iCot)
                End If
            Next
        Next
    Sheets("TieuHocK6").Copy Before:=Sheets(1)
    Sheets("TieuHocK6 (2)").Name = "TieuhocK6-Trich"
    Sheets("TieuhocK6-Trich").[f10].Resize(iHang, iCot) = Mg
End Sub
 
Upvote 0
Cảm ơn bạn. Về cơ bản là ổn. Nhưng không biết so row cuối cùng và cột điểm Thực tập sư phạm và các cột có công thức đều hiện #N/A vậy?
 
Upvote 0
Cảm ơn bạn. Về cơ bản là ổn. Nhưng không biết so row cuối cùng và cột điểm Thực tập sư phạm và các cột có công thức đều hiện #N/A vậy?
Do mình đếm thiếu 1 cột.
Vậy mình mới nhờ bạn "kiểm cha" chứ
Bạn chạy code này nhé:
Mã:
Public Sub laydiemlon()
    Dim Vung, Tam, aMax, I, iCot, iHang, Mg(1 To 53, 1 To 53)
    Set Vung = [f10:f62].Resize(, 53)
        For iHang = 1 To 53
            For iCot = 1 To 53
                If InStr(1, Vung(iHang, iCot), ";") Then
                    Tam = Split(Vung(iHang, iCot), ";")
                        For I = 0 To UBound(Tam)
                            aMax = Application.WorksheetFunction.Max(aMax, Tam(I))
                        Next
                            Mg(iHang, iCot) = aMax
                            aMax = 0
                Else
                    Mg(iHang, iCot) = Vung(iHang, iCot)
                End If
            Next
        Next
    Sheets("TieuHocK6").Copy Before:=Sheets(1)
    Sheets("TieuHocK6 (2)").Name = "TieuhocK6-Trich"
    Sheets("TieuhocK6-Trich").[f10].Resize(53, 53) = Mg
End Sub
Số cột là 53 chứ "hổng" phải 52
Hihi
Thân
 
Upvote 0
MÌnh không rành về VB, chỉ có nhu cầu quản lý văn bản và thấy được code của 1 bạn trên diễn dàn nên đưa vào sử dụng. Nhân tiện các bạn có thể giúp mình làm sao để khi thực hiện các lệnh xong thì bật luôn chức năng share file lại được không. Cám ơn nhiều nha.
 
Lần chỉnh sửa cuối:
Upvote 0
Mấy hôm bận quá, nay mới lên diễn đàn được. Cảm ơn concogia nhiêù nhé. Mình thấy rất ổn. Nhưng vì mình mới bắt đầu tìm hiểu về VBA nên còn chưa hiểu đoạn code đó lắm. Theo mình nghĩ, trước khi xây dựng đoạn code nào đó người viết phải có tư duy về quy trình code đó làm việc thế nào kiểu như muốn nấu cơm thì phải vo gạo, cho gạo vào nồi, đổ nước cho vừa rồi đặt lên bếp .... Vậy thi lô gíc của đoạn code bạn viết là như thế nào vậy? Cho mình biết với đươck k? Hiện nay mình cũng đang đọc 1 cuốn của Anh Phan Tự Hướng nhưng cũng chưa được hiểu lắm, rất mong bạn giúp đỡ.
 
Upvote 0
PHP:
Public Sub xx()
 Dim dic, I As Long, Tg, Vung
 Tg = Timer
     Vung = Range([a5], [a50000].End(xlUp)).Value
     Set dic = CreateObject("Scripting.Dictionary")
         For I = 1 To UBound(Vung)
             If Not dic.Exists(Vung(I, 1)) Then
                 dic.Add Vung(I, 1), ""
             End If
         Next
 [c5].Resize(dic.Count) = Application.WorksheetFunction.Transpose(dic.keys)
MsgBox "Tg: " & Timer - Tg 
End Sub

các bác cho em hỏi tại sao đoạn code này khi dữ liệu càng nhiều thì chạy càng nhanh nhỉ ? mong các bác giải thích
trân trọng
lê duy thương
 
Upvote 0
Phải nói là dữ liệu càng nhiều thì cành nhanh hơn so với code xử lý trên sheet hoặc xử lý trên mảng thuần túy.
Thí dụ 100 dòng thì nhanh gấp 1.5, 1000 dòng nhanh gấp 3, 10.000 dòng nhanh gấp 10 (so với code khác)

Nhưng nhiều vẫn chậm hơn ít chứ.
 
Upvote 0
Phải nói là dữ liệu càng nhiều thì cành nhanh hơn so với code xử lý trên sheet hoặc xử lý trên mảng thuần túy.
Thí dụ 100 dòng thì nhanh gấp 1.5, 1000 dòng nhanh gấp 3, 10.000 dòng nhanh gấp 10 (so với code khác)

Nhưng nhiều vẫn chậm hơn ít chứ.
vâng đúng rồi ạ. nhanh hơn so với code khác chứ không nhanh hơn với chính nó ạ. tại cái tiếng việt nhiều nghĩa quá làm em không chú ý đến ý nghĩa của câu hỏi
 
Upvote 0
MÌnh không rành về VB, mong bạn giải thích chi tiết ý nghĩa của đoạn code này

Sub Loc()
[c7:c1000].SpecialCells(2).Offset(, -1) = "=COUNTIF(R7C7:RC7,RC7)"
[b7:b1000].AutoFilter: Selection.AutoFilter 1, 1
[b7].CurrentRegion.Copy
[l7].Select: ActiveSheet.Paste: Application.CutCopyMode = False
ActiveSheet.AutoFilterMode = False
[o7] = "=SUMIF(R7C7:R1000C7,RC17,R7C[-10]:R1000C[-10])"
[o7].Copy [o7].Resize(1000, 2)
Selection = Selection.Value
Union([b:b], [l:l]).Clear
[p:p].Select
Selection.NumberFormat = "#,##0.00"
Selection.Copy
Range("P1:p1000").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
[p1].Select
End Sub

Cảm ơn bạn nhiều
 
Upvote 0
Nhờ các cao thủ viết cho câu lệnh thay thế số a trong công thức thành một số khác (ví dụ là b) đã biết. Số a có thể từ 1 đến 3 ký tự (vd: a=1 hoặc a=1,5, ...) và nằm giữa dấu "*" và dấu "%" cố định.
Công thức đó có dạng:
=SUM(G...:G...)*a%
 
Lần chỉnh sửa cuối:
Upvote 0
Mình tự làm được rồi nhưng có vẻ chậm nếu dữ liệu nhiều, xin được góp ý.
Mã:
Sub ...
.......
For i = 5 To Endrow
    Range("C" & i).Select
    If ActiveCell = "+ Chi phí tröïc tieáp khaùc" Then
     ctc = ActiveCell.Offset(0, 4).Formula ' công thức cũ
    ctm = Left(ctc, InStr(ctc, "*")) & b & "%" ' công thức mới
    ActiveCell.Offset(0, 4).Formula = ctm
    End If
Next
...
End Sub
 
Upvote 0
Tôi có cảm giác code của bạn còn hoàn thiện được, nhưng tốn gì đâu vài dòng ví dụ. Anh em làm rồi không không đúng có phí công không?
(Cái này có lẽ dùng Replace nhanh hơn nhiều lần)
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi có cảm giác code của bạn còn hoàn thiện được, nhưng tốn gì đâu vài dòng ví dụ. Anh em làm rồi không không đúng có phí công không?
(Cái này có lẽ dùng Replace nhanh hơn nhiều lần)
Mình đang đang làm Sheett("Chtinh")
Thay đổi chi phí trực tiếp khác cho tất cả các dòng (nhiều lắm)
Vì mình không đưa file lên được nên đành diễn giải, Bạn cố hiểu nha!:
- Duyệt qua các dòng có dữ liệu tại cột C
- Nếu dòng nào có dòng text "Chi phí trực tiếp khác" thì sửa tỉ lệ a% thành b% trong công thức (=SUM(G...:G...)*a%) tại cột G tương ứng.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đang đang làm Sheett("Chtinh")
Thay đổi chi phí trực tiếp khác cho tất cả các dòng (nhiều lắm)
Vì mình không đưa file lên được nên đành diễn giải, Bạn cố hiểu nha!:
- Duyệt qua các dòng có dữ liệu tại cột C
- Nếu dòng nào có dòng text "Chi phí trực tiếp khác" thì sửa tỉ lệ a% thành b% trong công thức (=SUM(G...:G...)*a%) tại cột G tương ứng.
Cái này bạn làm bằng tay cũng được mà:
- Dùng AutoFilter lọc ra những dòng dữ liệu cần thay đổi công thức (Cột C là Chi phí trực tiếp khác)
- Chọn vùng dữ có công thức cần sửa
- Nhấn Alt + ; cho chắc ăn
- Nhấn Ctrl + H hiện ra hộp thoại Find and Replace
- Nhập vào như sau:
+ Find what: ~**%
+ Replace with: *b% (b là số mới nha)
- Bấm vào nút Options >>, chỗ Look in chọn Formulas (Thông thường mặc định đã là
Formulas rồi)
- Bấm vào Replace All

 
Upvote 0
Cái này bạn làm bằng tay cũng được mà:
- Dùng AutoFilter lọc ra những dòng dữ liệu cần thay đổi công thức (Cột C là Chi phí trực tiếp khác)
- Chọn vùng dữ có công thức cần sửa
- Nhấn Alt + ; cho chắc ăn
- Nhấn Ctrl + H hiện ra hộp thoại Find and Replace
- Nhập vào như sau:
+ Find what: ~**%
+ Replace with: *b% (b là số mới nha)
- Bấm vào nút Options >>, chỗ Look in chọn Formulas (Thông thường mặc định đã là
Formulas rồi)
- Bấm vào Replace All


Rất cảm ơn Bạn!
Cách của bạn hay ở chỗ dùng ký tự đại diện, mình đã ghi Macro được và sẽ sửa lại (vùng chọn, giá trị thay thế cũng xác định được từ code).
Chắc là sẽ cải thiện được tốc độ
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom