Những bài tập VBA đơn giản dành cho những người mới bắt đầu

Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,324
Được thích
22,367
Nghề nghiệp
Nuôi ba ba & trùn quế

Bài 01

Macro to merge values from one column into one cell and retain source formatting.
Example:

Source:
A1= "It is going to cost "
A2= "$1000.00" (A2 is formatted to underline value)

Destination: (desired result)
B2= "It is going to cost $1000.00" (A2 value is still underlined)

Đề bài có thể tóm gọn lại như sau:

Trên cột [A:A] ta có những dòng thuyết minh & dưới nó là những con số đã được định dạng bằng nhiều cách khác nhau để fân biệt như chữ in nghiên, chữ số được tô đậm hay Font có màu đỏ,. . . .

Macro có nhiệm vụ: Hễ dòng nào có số thì ô bên fải liền kề cần được mang nội dung cũa ô trên ô có số & bản thân số của ô đang xét; Mặt khác định dạng ô giống với ô mang số liệu

Chúc thành công
--=0
--=0

Bảng liệt kê:

TT | Tên bài | Tại | Diễn giải
01|Bài tập 01|#1|Nối chuỗi & định dạng
02|Bài tập 02 | #11|Thống kê số lần lặp
03|Bài tập 03|#19|Trích lọc danh sách theo năm
04|Bài tập 04|#27|Thêm dòng theo số liệu tháng - năm
05|Bài tập 05|#31|Tổng hợp số liệu hoạt động theo từng kỳ (tháng)
06|Bài tập 06|#73|Ghí chú ngày có chi fí lớn nhất trong từng tháng khảo sát
07|Bài tập 07|#84|Thêm dòng tính tổng, sau khi đã thống kê số liệu
08|Bài tập 08|#103|Kẻ dòng, viền khung & format báo cáo hoàn chỉnh
09| BT Fần B | #206 | (Ở đây có bảng liệt kê riêng)


Rất mong các bạn ủng hộ & hỗ trợ tối đa.

! --=0 --=0 --=0
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cũng gần đúng ý mình, nhưng giả sử trong cột B có chứa các ô "'" hoặc " ", hoặc các ô số nhưng định dạng Text thì ... tèo!
Rất nguy hiểm khi lại dùng STT đó cho việc khác, ví dụ dùng cho hàm Vlookup.
Mà Quang Hải đâu phải người mới học VBA nhỉ? nhưng kệ coi như anh em mình bàn luận cho em út nó học, còn các cao thủ thì giám sát lại mình.
-----------------
Dùng vòng lặp không chỉ xa xỉ mà rất chậm, phải không?
Nếu code ra kết quả sai thì xử tiếp. Sợ nhất là hỏng có dữ liệu rồi cứ đoán già đoán non rồi mần ẩu vì thất nghiệp.
 
Upvote 0
Bài tập ngoại khóa 2: Copy dữ liệu, đánh số thứ tự

Tiếp bài đánh số thứ tự của ThanhLanh, tôi đưa một bài căn bản về copy dữ liệu:

Có 3 sheet trong 1 file, sheet đầu có 2 bảng: BẢNG 1, BẢNG 2, 2 sheet tiếp theo là BẢNG 3 và BẢNG 4

Yêu cầu: COPY CÁC BẢNG QUA BẢNG 1:

1) Copy BẢNG 2 và BẢNG 4 tất cả nội dung, kể cả định dạng

2) Copy BẢNG 3 chỉ lấy giá trị (paste special value)

3) Đánh số thứ tự tại BẢNG 1 những mục đã copy.

=============================================

MỜI CÁC BẠN THAM GIA.
 

File đính kèm

  • CopyData.xls
    19.5 KB · Đọc: 22
Upvote 0
Tôi thấy Code của XuanNguyen vẫn chưa đúng đề, vì đánh sô TT cả chữ số . Các bạn thử text lại, hay mình sai chỗ nào nhỉ ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Tiếp bài đánh số thứ tự của ThanhLanh, tôi đưa một bài căn bản về copy dữ liệu:

Có 3 sheet trong 1 file, sheet đầu có 2 bảng: BẢNG 1, BẢNG 2, 2 sheet tiếp theo là BẢNG 3 và BẢNG 4

Yêu cầu: COPY CÁC BẢNG QUA BẢNG 1:

1) Copy BẢNG 2 và BẢNG 4 tất cả nội dung, kể cả định dạng

2) Copy BẢNG 3 chỉ lấy giá trị (paste special value)

3) Đánh số thứ tự tại BẢNG 1 những mục đã copy.

=============================================

MỜI CÁC BẠN THAM GIA.
Em đưa bài lên code hơi dài dòng, nhờ các anh chị góp ý thêm
PHP:
Sub paste1()
'PASTE VAO BANG 1
Dim iRow As Long
Dim wS As Worksheets
Set sw = Worksheets("HOANG")
Sheets("HOANG").Activate
iRow = sw.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row          
 sw.Cells(iRow, 2).Select        
   ActiveSheet.Paste        
   Application.CutCopyMode = False
End Sub
------------------------
Sub paste2()'
PASTE VAO BANG 1
Dim iRow As Long
Dim wS As Worksheets
Set sw = Worksheets("HOANG")
Sheets("HOANG").Activate
iRow = sw.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row   
        sw.Cells(iRow, 2).PasteSpecial 3     
      Application.CutCopyMode = False
End Sub
----------------------------------------------
Sub copy()
Dim iRow As Long
Dim wS As Worksheets
'Y THU NHAT
'COPY SO LIEU BANG 2
Set sw = Worksheets("HOANG")
 Sheets("HOANG").Activate
 iRow = sw.Cells(Rows.Count, 9).End(xlUp).Row
 Range(Cells(3, 9), Cells(iRow, 14)).copy
'PASTE VAO BANG 1
paste1
'COPY SO LIEU BANG 4
Set sw = Worksheets("NGHIA")
 Sheets("NGHIA").Activate 
iRow = sw.Cells(Rows.Count, 1).End(xlUp).Row
 Range(Cells(3, 1), Cells(iRow, 6)).copy
 'PASTE VAO BANG 1
paste1
' Y THU HAI
'COPY SO LIEU BANG 3
Set sw = Worksheets("TRONG") 
Sheets("TRONG").Activate
 iRow = sw.Cells(Rows.Count, 1).End(xlUp).Row 
Range(Cells(3, 1), Cells(iRow, 6)).copy
'PASTE VAO BANG 1
paste2
'Y THU 3
With Range([B3], [B65536].End(3)).SpecialCells(2)     
 .Offset(, -1) = 1      
.Offset(, -1).DataSeries   
End With
End Sub
 

File đính kèm

  • CopyData.rar
    8.2 KB · Đọc: 18
Upvote 0
Em đưa bài lên code hơi dài dòng, nhờ các anh chị góp ý thêm

Bạn thử làm gọn hơn trong một Sub xem sao! Bài bạn cũng rất kỳ công đó!

Chắc mình không theo được nữa rồi, ra "chầu rìa" thôi .

Bạn đã nghe hoặc đã từng hát bài "Tôi ơi đừng tuyệt vọng" chưa nhỉ! Cố lên bạn nhé!
 
Upvote 0
Bạn thử làm gọn hơn trong một Sub xem sao! Bài bạn cũng rất kỳ công đó!



Bạn đã nghe hoặc đã từng hát bài "Tôi ơi đừng tuyệt vọng" chưa nhỉ! Cố lên bạn nhé!
Cám ơn bạn!
Mình sẽ không ra, vẫn phải học chứ! Mình sẽ theo đến cùng, nhưng mình mới "va"vào VBA, kiến thức còn có hạn, nên ngồi cạnh xem và học theo các bạn thôi.
 
Upvote 0
Để cho các bạn mới tiếp cận mau chóng vấn đề tên gọi của các vấn đề liên quan đến sheet tôi khái quát một số mục như sau:

1) Sheet:

Tại một sheet mà chúng ta thấy, ngay chổ sheet tab là tên của sheet mà ta gọi là Sheet Name, nhưng với môi trường VBA nó có thêm một cái tên nữa ta gọi nó là Sheet Code (giống như ta có tên và một biệt danh vậy).

attachment.php


Vậy thì khi ta chọn sheet đó ta có thể dùng các cấu trúc sau:

Worksheets ("TenSheet").Select
Sheets("TenSheet").Select
Sheet1.Select

Như vậy đều đúng cả các bạn nhé! 2 mục trên là gọi tên <Sheet>.Name và mục đỏ gọi tên <Sheet>.CodeName các bạn nhé!

2) Range:

Với ô A1, thông thường ta viết Range("A1"), nhưng một cách khác ngắn gọn hơn ta viết [A1]

Nhưng theo tôi, khuyến khích các bạn dùng kiểu Range("A1") này hơn, bởi vì sau khi đặt dấu chấm (.) thì các List Constants sẽ được show ra để mình chọn lựa các thuộc tính, phương thức ... của nó.

3) Cells:

Ô A1 để gọi nó ta cũng có thể viết như Range, ngoài ra ta cũng còn viết theo cách khác đó là

Cells(1,1) với phương thức Cells(row,column) ta có thể điều chỉnh theo số hàng và cột để tìm địa chỉ tại ô đó.

Một số vấn đề liên quan như vậy, tôi mong các bạn hỏi thêm về các vấn đề liên quan đến mọi lĩnh vực trên sheet.
1/ 3 cách viết này :
Worksheets ("TenSheet").Select
Sheets("TenSheet").Select
Sheet1.Select

là giống nhau nhưng để hạn chế người dùng đổi tên sheet lung tung thì người ta sẽ phải viết Sheet1.Select thay vì viết theo 2 cách kia.

2/ Câu này : Cells(1,1) với phương thức Cells(row,column) ta có thể điều chỉnh theo số hàng và cột để tìm địa chỉ tại ô đó.

Theo tôi cells(....) nói chung là 1 đối tượng không phải phương thức cells gì gì đó...
 
Lần chỉnh sửa cuối:
Upvote 0
1/ 3 cách viết này :
Worksheets ("TenSheet").Select
Sheets("TenSheet").Select
Sheet1.Select

là giống nhau nhưng để hạn chế người dùng đổi tên sheet lung tung thì người ta sẽ phải viết Sheet1.Select thay vì viết theo 2 cách kia.

2/ Câu này : Cells(1,1) với phương thức Cells(row,column) ta có thể điều chỉnh theo số hàng và cột để tìm địa chỉ tại ô đó.

Theo tôi cells(....) nói chung là 1 đối tượng không phải phương thức cells gì gì đó...

Không ai tham gia giải câu hỏi của tôi nhỉ?
Ví dụ tiếp theo :

Cho 1 dãy số nguyên từ A2 : A14. Viết code để tìm giá trị max của A1 : A14, không dùng các hàm có sẵn trong excel.


Chắc khó quá, hic hic

Vâng, cám ơn bạn đã góp ý thêm cho Sheet.Select, riêng việc ghi chưa đúng, đôi khi viết vội nên tôi cũng không chú ý câu từ. Xin cám ơn bạn đã nhắc nhở.

À chắc tôi nghĩ mọi người cho rằng bài VD của bạn hơi qua so với trình độ của họ nên chưa ai có đáp án, thôi thì tôi đưa ra lời giải luôn nha:

PHP:
Sub RangeMax()
    Dim n As Long, cel As Range
    For Each cel In Sheet1.Range("A2:A14")
        If Val(cel) > n Then n = cel
    Next
    MsgBox n
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin làm "nghĩa vụ" của người ra đề là giải đề, đúng, sai, hay, dở ... mọi người góp ý, không nhất thiết phải theo cách của mình.

Tóm tắt lại đề: Đánh số TT các ô có chữ (trừ ô có số, có rác) của cột B (bắt đầu từ B4) vào cột A

Mã:
Sub SoTT()
    Dim EndRow As Long
    With Sheets("Sheet1")
        EndRow = .Range("B65536").End(xlUp).Row
        If EndRow > 3 Then
            With .Range("A4:A" & EndRow)
                .FormulaR1C1 = "=IF(AND(LEN(TRIM(RC[1]))>0,ISERROR(RC[1]*1)),MAX(R3C:R[-1]C)+1,"""")"
                .Value = .Value
            End With
        End If
    End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thực ra bài này XuanNguyen82 đã làm ở #159 rồi mà;

Ví dụ tiếp theo :
Cho 1 dãy số nguyên từ A2 : A14. Viết code để tìm giá trị max của A1 : A14, không dùng các hàm có sẵn trong excel.


Chỉ khác là XN82 kết xuất ra ngày có số liệu MAX, chứ không fải số liệu MAX đó mà thôi.
 
Upvote 0
Từ bài 1 đến bài tạp 8 rất hệ thống. Cùng 1 file dữ liệu từ dễ đến khó, và cũng trong file đó đưa ra các yêu cầu đề bài.
Ngay cả bài tập nhỏ của bạn manuchungtinh nếu ra đề là:
Với dữ liệu như bài tập 8 . Viết code để tìm giá trị max của cột chi phí, không dùng các hàm có sẵn trong excel. thì hay hơn. Các bạn mới cũng có thể hiểu (đã và đang hiểu từ file đó làm tiếp như thế nào). Và cũng tiện file đó để mà làm.

Ở đây mỗi người ra đề, đề người này ra chưa kịp giải đã ra đề khác cứ lộn tùng phèo cả lên.
Ví dụ như bài của bạn thanhlanh mình thấy nhiều học viên mới giải, mấy đề sau cứ ít dần.

Cảm thấy hơi lộn xộn không theo hệ thống được như ban đầu. Mình theo dõi học tập cũng cảm thấy không được hệ thống

Vài lời góp ý chân thành, mong các bạn thứ lỗi.
 
Upvote 0
Mình xin làm "nghĩa vụ" của người ra đề là giải đề, đúng, sai, hay, dở ... mọi người góp ý, không nhất thiết phải theo cách của mình.

Tóm tắt lại đề: Đánh số TT các ô có chữ (trừ ô có số, có rác) của cột B (bắt đầu từ B4) vào cột A

Mã:
Sub SoTT()
    Dim EndRow As Long
    With Sheets("Sheet1")
        EndRow = .Range("B65536").End(xlUp).Row
        If EndRow > 3 Then
            With .Range("A4:A" & EndRow)
                .FormulaR1C1 = "=IF(AND(LEN(TRIM(RC[1]))>0,ISERROR(RC[1]*1)),MAX(R3C:R[-1]C)+1,"""")"
                .Value = .Value
            End With
        End If
    End With
End Sub
Xin lỗi anh, em không biết thuật ngữ "có rác" có nghĩa là gì ạ?
 
Upvote 0
Xin lỗi anh, em không biết thuật ngữ "có rác" có nghĩa là gì ạ?

Hì, Xin lỗi vì nói tắt, ý mình nói các ô chỉ chứa ký tự không nhìn thấy: "'", hoặc " ", theo cách của các bạn ở trên thì các ô này cũng được đánh STT.
Mà tại Nghĩa không đọc bài trước, hay lại thích thọt lét mình. Ẹc ... ẹc
"Thuật ngữ" này mình đã đọc được đâu đó trên diễn đàn.
 
Upvote 0
Chỉ khác là XN82 kết xuất ra ngày có số liệu MAX, chứ không fải số liệu MAX đó mà thôi.
[/B]
Cám ơn thầy HYen, và nhà em nghĩ Bạn XuanNguyen đã giải đúng yêu cầu của đề.
Nhưng code
Sub RangeMax()
Dim n As Long, cel As Range
For Each cel In Sheet1.Range("A2:A14")
If
Val(cel) > n Then n = cel
Next
MsgBox n
End Sub
là tìm giá trị Max của bài #185, nhưng tôi text thử thấy báo lỗi.
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng, cám ơn bạn đã góp ý thêm cho Sheet.Select, riêng việc ghi chưa đúng, đôi khi viết vội nên tôi cũng không chú ý câu từ. Xin cám ơn bạn đã nhắc nhở.

À chắc tôi nghĩ mọi người cho rằng bài VD của bạn hơi qua so với trình độ của họ nên chưa ai có đáp án, thôi thì tôi đưa ra lời giải luôn nha:

PHP:
Sub RangeMax()
    Dim n As Long, cel As Range
    For Each cel In Sheet1.Range("A2:A14")
        If Val(cel) > n Then n = cel
    Next
    MsgBox n
End Sub

Cảm ơn bạn, đúng là khó thật @ @.

Mới chập chững VBA mà các bác bắt người ta xắn quần lội vào cái bài #159 để tìm thì thật là khổ, khác nào bảo người ta "go die go". Haizzzzzz

Mà code này chưa ổn bạn Hoàng Trọng Nghĩa nhỉ??? Nếu vùng từ A2 đến A14 toàn số âm (<0) thì kết quả CODE cho ra bằng 0 vì bạn đang so sánh từng phần tử trong vùng từ A2 : A14 với n và n khi vào đầu thủ tục = 0 luôn lớn hơn mọi số âm mất rồi.

Max của dãy đó sẽ luôn bằng 0 nếu nó chỉ chứa những số ÂM. Code trên của bạn chỉ áp dụng được với những phần tử thuộc từ A2 : A114 mà >=0 thôi.

Ôi lại phải chập chững tiếp... hic
 
Lần chỉnh sửa cuối:
Upvote 0
Thử đưa macro ở #149 lên thớt xem sao

Nội dung của nó, sau khi tự tiện chỉnh sửa, như sau:
PHP:
Option Explicit
Public Sub Xuan5()
 Application.ScreenUpdating = False
 Dim Rng As Range, Cls As Range, Dau As Long, Cuoi As Long
 Dim Tmp As Long, SoThg As Long, Thang As Long, Mx As Double, TC As Double, I As Long
 Dim Tong As String, Xuan As String

 With Sheets("ChiFi")
2    Set Rng = .Range(.[A4], .[A65000].End(xlUp))
 End With
 With Sheets("sheet1")
5    Xuan = .[B7].Value: Tong = .[H1].Value
    With .[A8:D1000]
        .ClearContents
        .Interior.ColorIndex = 0
        .Borders.LineStyle = xlNone
    End With
11  Dau = DateSerial(Year(.[C4]), Month(.[C4]), 1)
    Cuoi = DateSerial(Year(.[C5]), Month(.[C5]), 1)
    SoThg = DateDiff("m", Dau, Cuoi) + 1
14  For I = 1 To SoThg
        Mx = 0
        Thang = DateSerial(Year(Dau), Month(Dau) + I - 1, 1)
        .Cells(I + 7, 1).Value = I
        .Cells(I + 7, 2).Value = Xuan & " " & Format(Thang, "mm/yyyy")
        For Each Cls In Rng
            If Cls >= .[C4] And Cls <= .[C5] Then
                Tmp = DateSerial(Year(Cls), Month(Cls), 1)
                If Tmp = Thang Then
                    .Cells(I + 7, 3).Value = .Cells(I + 7, 3).Value + Cls.Offset(, 4).Value
                    TC = TC + Cls.Offset(, 4).Value
                    If Mx < Cls.Offset(, 4).Value Then
                        Mx = Cls.Offset(, 4).Value
                        .Cells(I + 7, 4).Value = Cls.Value
                    End If
                End If
            End If
31        Next
    Next I
'Format Report:'
    With .Range("B65000").End(xlUp)
        .Offset(1, -1).Resize(, 4).Interior.ColorIndex = 6
        .Borders.LineStyle = xlNone:                .Offset(4) = [H3]
        .Offset(1).Value = Tong:                    .Offset(1, 1).Value = TC
        .Offset(3, 1) = [H2]:                       .Offset(4, 2) = [H4]
38    End With
    .Range(.[B8], .[B8].End(xlDown)).Offset(, -1).Resize(, 4).Borders.LineStyle = xlContinuous
 End With
 Set Rng = Nothing
 Application.ScreenUpdating = True
End Sub


Bước đầu mình có vài nhận xét như sau:

(1*) Cần đề fòng nhập ngày đầu khảo sát nhỏ hơn ngày đầu tiên có dữ liệu trong 'Chifi'
hay ngày cuối vượt ngày cuối vừa nhập dữ liệu;

Chuyện này có thể khắc fục bằng hàm MIN() & MAX() trong Excel: Tại các ô tương ứng kề fải của 2 ô chứa các ngày mút của thời hạn khảo sát ta nhập =MAX(ChiFi!A:A) & format như bạn đang thấy;
Nghĩa là làm sao người dùng ta thấy, nhưng khi in máy sẽ không thấy!

(2*) Nên đánh số trong các dòng lệnh; Chí ít fân biệt khối các dòng lệnh, như khối xử lý số liệu, khối format form,. . .

Những con số vô tri này sẽ giúp chúng ta trao đổi thông tin giữa cộng đồng VBA trong GPE.COM; Sau này các bạn còn biết thêm rằng, giúp ta trao đổi thông tin với máy thông qua hàm Erl(), một khi ta gặp bất trắc hay lỗi;

(3*) Dòng lệnh "With Sheets("sheet1")" là quá lạm dụng, nếu xét về mặt sử dụng chương trình;
Cụ thể hơn: Bình thường muốn có kỳ báo cáo nào, ta cũng sẽ nhập ngày đầu & ngày cuối; Nhập xong 2 ngày này ta cho chạy ngay macro;
Chứ không điên khùng gì đi qua 'ChiFi' hay trang nào khác & cho chạy macro.
Í mình muốn nói là trang Sheet1 đang hay fải đang được kích hoạt; Thậm chí ta nói vầy cũng đúng: Khi mở workbook này lên luôn bao giờ cũng fải có 1 trang tính nào đó được kích hoạt & trước khi cần chạy macro, thì trang kích hoạt đó là trang Sheet1 là chuyện bình thường;
(Nói vui: Chuyện này giống như bảo bà lão trước khi ra đường rằng cần bận quần dài vô!)
Vì chuyện lạm dụng này mà câu lệnh trong With này dài thêm, như

.Range(.[B8], .[B8].End(xlDown)).Offset(, -1).Resize(, 4).Borders.LineStyle = xlContinuous


(4*) Bạn xem thêm đoạn mã lệnh từ dòng 6 đến dòng 10; Bạn thử ghi macro Clear All 1 vùng báo cáo xem răng?

. . . . . .

Tạm vài í kiến như vậy, mong tác giả chỉnh chu thêm.
 
Lần chỉnh sửa cuối:
Upvote 0
(4*) Bạn xem thêm đoạn mã lệnh từ dòng 6 đến dòng 10; Bạn thử ghi macro Clear All 1 vùng báo cáo xem răng?

. . . . . .

Tạm vài í kiến như vậy, mong tác giả chỉnh chu thêm.
Thưa thầy, nhà em thấy ý(4*) từ dòng 6 đến dòng 10 bỏ hết chỉ cần để lại :
.[A8:D1000].Clear
là được, không biết đúng không ạ ?
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn thầy HYen, và nhà em nghĩ Bạn XuanNguyen đã giải đúng yêu cầu của đề.
Nhưng code
Sub RangeMax()
Dim n As Long, cel As Range
For Each cel In Sheet1.Range("A2:A14")
If
Val(cel) > n Then n = cel
Next
MsgBox n
End Sub
là tìm giá trị Max của bài #185, nhưng tôi text thử thấy báo lỗi.
Thuật toán của bai này phải là :
- Khai báo 1 biến Rng gán giá trị từ A2 : A14
- Khai báo 1 biến maxV chẳng hạn gán maxV = giá trị của ô đầu tiên trong vùng A2 : A14 (ở đây chính là A2)
- Dùng 1 vòng For duyệt từ giá trị từ dòng thứ 3 đến dòng thứ 14
- So sánh nếu giá trị từ dòng thứ 3 đến dòng 14 giá trị nào lớn hơn maxV thì gán maxV = giá trị đó
- Gọi giá trị maxV vừa tìm được qua Msgbox

Phát triển lên thì viết Function thuật toán cũng tương tự.
 
Upvote 0
Thuật toán của bai này phải là :
- Khai báo 1 biến Rng gán giá trị từ A2 : A14
- Khai báo 1 biến maxV chẳng hạn gán maxV = giá trị của ô đầu tiên trong vùng A2 : A14 (ở đây chính là A2)
- Dùng 1 vòng For duyệt từ giá trị từ dòng thứ 3 đến dòng thứ 14
- So sánh nếu giá trị từ dòng thứ 3 đến dòng 14 giá trị nào lớn hơn maxV thì gán maxV = giá trị đó
- Gọi giá trị maxV vừa tìm được qua Msgbox

Phát triển lên thì viết Function thuật toán cũng tương tự.
Thực ra về phần thuật toán, mình chưa đủ kiến thức để lĩnh hội. Nhưng mình nói về bài toán và đáp án :
Đề:Ví dụ tiếp theo
Cho 1 dãy số nguyên từ A2:A14. Viết code để tìm giá trị max của A1:A14, không dùng các hàm có sẵn trong excel.
tức là từ A2 đến A14 ta nhập một dãy số bất kỳ và không được dùng hàm có sẵn của excel để tìm số lớn nhất của dãy số, mà phải viết code(thay hàm Max) để tìm Max của dãy số này (Mình hiểu vậy, chả biết đúng không ? mung lung quá). Mình coppy đáp án dán vào module, nhưng nó không chạy.Tập tin đính kèm
 

File đính kèm

  • Max1.xls
    19.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề cải thiện tốc độ xử lí khi áp dụng vòng lặp trong #159

Như chúng ta đã nói với nhau, bài này có rất nhiều cách làm khác nhanh gọn hơn nhiều;
Nhưng với fương thức xài vòng lặp như vầy, ta có thể tìm cách cải thiện tốc độ hơn, một khi vùng mà vòng lặp fải chạy được thu hẹp ở cả 2 đầu.

Như có bài trên đã nói, cứ mỗi kỳ hay mỗi tháng số liệu, vòng lặp đang fải xuôi ngược giáp vòng từ đầu đến cuối; (Vùng đó đang được đưa vô biến Rng trong câu lệnh

Set Rng = .Range(.[A4], .[A65000].End(xlUp))

Ta có thể nhở fương thức nào đó để mỗi lần lặp, vòng này không bắt đầu từ .[A4], mà bắt đầu từ ô [Ax] nào đó chứa dòng dữ liệu đầu tiên của ngày đầu tiên cần khảo sát.

Khi đó các bạn mường tượng thời lượng giảm đáng kể, nếu ta chỉ khảo sát số luệu tuần nào đó của dữ liệu tháng cuối cùng ta vừa nhập vô CSDL.

Các bạn có nghỉ ra cách nào để làm việc này không các bạn?
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom