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,321
Được thích
22,364
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:
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
VBA - để hình dung được thuật toán là khó nhất, cách học thuật toán của mình đó là tưởng tượng mình làm bằng tay như thế nào thì mô tả lại như thế, ví dụ thế này :
PHP:
Sub timMax()
Dim i As Long, maxV As Long
Dim Rng As Range
Set Rng = Range("A2:A14")
maxV = Cells(2, 1).Value
    For i = 3 To 14
        If Cells(i, 1).Value > maxV Then maxV = Cells(i, 1).Value
    Next
MsgBox maxV
End Sub
Có phải làm bằng tay thì thế này không?
Đầu tiên sẽ nhìn dòng đầu tiên của vùng dữ liệu đó coi giá trị đó là lớn nhất- ghi giá trị đó vào giấy nháp, sau đó đi dò các dòng tiếp theo sau, cứ em nào lớn hơn thì ghi tiếp nó ra giấy nháp, cứ như thế dò cho đến hết vùng dữ liệu đó ta sẽ được giá trị cuối cùng chính là giá trị max.
Mình làm đúng như thế đó. Thực ra theo mình mới học VBA thì làm những ví dụ đơn giản mà ngắn ngắn thôi, chứ dài ngoằng chỉ mỗi việc ngồi theo dõi thuật toán thôi cũng đủ KHÓC rồi.
 
Upvote 0
Tôi thì tôi cho rằng 1 là tôi đươc 0 điểm, 2 là các bạn vì hiểu sai đề: Cho một dãy số nguyên từ A2:A14 ( tức là dãy số này cho trước đầy đủ từ A2:A14 ). Yêu cầu :Viết code tìm giá trị Max của A1:A14 (trong code cũng không được dùng công thức của hàm Max, hoặc hàm khác của Excel) theo hướng của thày NDU nhưng phải ở dạng code, không phải dạng công thức và khi ta thay đổi giá trị bất kỳ của dãy số trên, code vẫn phải cho gia trị Max đúng. Nếu sai thầy cho điểm 0 tối tôi về nộp cho vợ !
 
Lần chỉnh sửa cuối:
Upvote 0

manuchungtinh
VBA - để hình dung được thuật toán là khó nhất, cách học thuật toán của mình đó là tưởng tượng mình làm bằng tay như thế nào thì mô tả lại như thế, ví dụ thế này :
thật ra thuật toán trong VBA cũng chính là những thuật toán mà các bạn đã được học trong lơp phổ thông rồi, nhưng do sự phát triển của công nghệ, các lớp trẻ ngày nay lạm dụng vào máy móc mà quên đi các thuật giải cơ bản của toán học mà thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Chủ đề này sao các thầy không đứng lớp nửa ta, mong sao các thầy đứng lớp để các trò như chúng em học được một chút VBA
 
Lần chỉnh sửa cuối:
Upvote 0
/-*+/
HƯỚNG DẪN TẠO 1 MACRO LỌC MỞ RỌNG (AdvancedFilter)

/-*+/
Chúng ta đến trang tính có tên là ‘Nhap’ để thực hiện thiết kế & thi công quá trình AdvancedFilter nhờ sự giúp đỡ của bộ thu macro trong excel​
Chúng ta chia ra làm 2 công đoạn, đó là công đoạn làm thủ công & công đoạn thu tự động

1./ Công đoạn thủ công:

(Ta fải thực hiện thực nhuần nhuyễn công đoạn này bằng tay; Đó là tiền đề tốt để sang công đoạn sau không có 1 sai sót nào)

Để thuận tiện trong quá trình chọn vùng dữ liệu cần lọc, ta chọn 1 vùng dữ liệu độ vài dòng & cột đầu; Sau đó vô menu ‘Window’, trong menu con vừa xuất hiện ta chọn dòng ‘Preeze Panes’
Tiếp theo ta cho ẩn các cột từ [H:Z] chưa cần thiết trong sử dụng;
Tại [Ac1:AC2] ta lập công thức =[A1]
Tại [AA1] ta nhập 1 ngày nào đó có trong CSDL, như 8/13/2012
Tại [AA3] ta cũng nhập 1 ngày nào đó lớn hơn, như 8/17/2012
Tại [Ac2] ta thiết lập công thức =">="&AA1
Tương tự, tại ô bên fải liền kề ta nhập công thức tham chiếu đến ô [AA3] như sau: ="<="&AA3
(Ta hiểu ngầm với nhau rằng: ngày tại [AA1] là ngày bắt đầu khảo sát số liệu & [AA3] chứa ngày cuối khảo sát số liệu)

Bước tiếp theo là ta chép toàn bộ tiêu đế của CSDL đến ô [AC4] & những ô bên fải liền kế của nó;
Nhưng bên trang ‘BC’ ta thấy trong bản BC này không cần trường [SoFieu], nên ta tìm cách di dời toàn bộ các trường bên fải nó sang trái 1 ô;

Đó là ta đã hoàn thành xong việc thiết kế;
Giờ ta tiếp sang chu trình thi công thủ công:

(Những bạn đã quá quen với fần sau này, chỉ thao tác 1 lần cho quen với CSDL mới này cũng được)

Để vậy, ta lôi nút trên thanh trượt bên fải màn hình xuống gần tới 2/3 dữ liệu;
Tiếp theo ta bấm chuột vô menu Data -> Filter -> Advanced Filter. .
Excel ngay lập tức cung cấp cho ta 1 CS (cửa sổ) mới; Trên CS này ta thực hiện 1 số bước sau:
Trên ngăn ‘Action’ ta chọn dòng thứ 2 (Copy to another location)

  • Nếu trong ngăn List range Excel đã ghi giúp ta vùng bao gồm toàn bộ CSDL thì tốt, còn không ta dùng chuột quét chọn toàn bộ vùng dữ liệu các cột [A:F] mà ta thấy được trên màn hình
  • Với ngăn dưới tiếp theo, ta bấm vô CS này xóa dữ liệu nếu có & dùng chuột quét chọn vùng[AC1:AD2] để vùng địa chỉ này hiện trên CS;
  • Với ngăn dưới nữa, ta cũng làm tương tự, nhưng với vùng các ô từ [AC4:AG4]

Sau đó ta bấm vô nút ‘OK’ để Excel lọc vùng dữ liệu & cung cấp ra ngay dưới nếu có.
Chu trình này các bạn nên lặp đi lặp lại nhiều rằng, để chắc chắn rằng khi bước vô công đoạn thu macro ta không 1 tí nào sơ sảy.

2./ Công đoạn thu macro

Để vậy ta vô menu Tool -> Macro -> Record New Macro . . . & bấm chọn dòng này;
Khi đó CS VBE hiện cho ta 1 CS be bé; Lúc này ta có thể chấp nhận cả 4 đề nghị của VBE, có nghĩa là ta bấm vô nút ‘OK’ để đi tiếp giai đoạn sau
(Nhưng chú í rằng sau này ta có thể tùy chỉnh theo í mình với 1 số đề nghị của VBE)

B1: Dùng chuột quét chọn vùng dữ liệu;

B2: Vô menu Data -> Filter -> Advanced Filter. . .
Lúc đó VBE đưa ra CS mà ta có thể thấy tên là Advanced Filter
Tại ngăn Action ta bấm chọn dòng ‘Copy to another location
Tại ngăn List range, nếu VBE hiện đúng địa chỉ vùng ta đã chọn thì xuống tiếp ngăn dưới;
Bằng chưa thì ta bấm chuột vô ngăn này & rê chuột lên trang tính & chọn tất cả các cột trước cột [H]
Trong ngăn Criteria range ta có thể bấm chọn vô ngăn để xóa bỏ địa chỉ nào đó chưa đúng. Sau đó dùng chuột quét chọn vùng[AC1:AC2]
Trong ngăn Copy to ta thực hiện tương tự để có địa chỉ $AC$4:$AG$4 trong ngăn này & bấm vô nút ‘OK’ để kết thúc fương thức thu-ghi macro AdvancedFilter
(Sau khi bấm ‘OK’, ta sẽ thấy dữ liệu xuất hiện mới lên vùng dưới [Ac4])

Như vậy ta kết thúc công đoạn thu macro; Thực hiện việc kết thúc này có thể bằng 1 trong 2 cách đơn giản sau:
Nếu trên màn hình có hộp thoại để kết thúc macro, ta cứ việc bấm vô nó là được;
Cách thứ 2 cực hơn xíu là fải vô menu Tool -> Macro -> . . . để làm việc này

3./ Công đoạn chỉnh sửa macro


Nội dung macro của chúng ta thu được có thể là vầy:
PHP:
 Option Explicit
Sub Macro1()
'. . . '
' . . . .'
    Range("A1:G1449").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
        ("AC1:AD2"), CopyToRange:=Range("AC4:AG4"), Unique:=False
End Sub

Macro do VBE đưa ra chỉ có 1 dòng lệnh là đáng nể thôi;
Dịch sang tiếng việt dòng lệnh có nghĩa là:

Áp dụng fương thức AdvancedFilter cho vùng dữ liệu [A1:G1449] theo vùng chuần là [AC1:AD2], số liệu có được đem hiện ra dưới vùng mà VBE gọi là Extract

Sao ta lại fải chỉnh sửa macro?

Vì chúng ta mới làm việc với trang tính ‘Nhap’ mà thôi; Nay mai sẽ còn trang tính ‘Xuát’ nữa là tất nhiên;

Để macro này có thể xài được cho cả 2 trang tính, ta cần chỉnh hoặc bên này hay bên kia các iếu tố có trên dòng lệnh;
(Ta tạm hiểu rằng chình bên này là chỉnh trên dòng lệnh; chỉnh bên kia là chỉnh thiết kế của trang tính chứa dữ liệu)

Cái mà ta gọi là ‘bên này’ ấy là địa chỉ đầu tiên ta gặp trong câu lệnh.
Ta biết chắc 1 điều rằng cấu trúc 2 trang tính ‘Nhap’ & ‘Xuat’ không thể trùng nhau về số dòng dữ liệu;
Ngoài ra ta sẽ ngừa rằng chúng khác biết nhau về số trường chứa dữ liệu; (Hiển nhiên 1 điều rằng chúng giống nhau về số cột, thì không dại gì tách làm 2 trang tính như vậy)
Tùy theo trình độ của bạn, bạn chỉnh sửa lại theo các hướng sau đây

a./ Không chỉnh gì cả;
Như vậy sẽ không mệt bây chừ, như sau này sẽ mệt.

b./ Đưa vô 1 biến đối tượng đã khai báo thêm từ đầu chương trình, như

Mã:
Dim Rng As Range
Sau đó là dòng gán nội dung cho nó:
Set Rng = Range("A1:G1449")

Cách này vẫn bất lợi do dữ liệu sẽ thường liện tục tăng (Có thể giảm . . .) làm chi trị 1449 chỉ đúng cho hôm nay, nhưng ngày mai khác,. . .

c./ Cách tối ưu nhất, Nhưng muốn xài cách này ta cần thêm kiến thức về thuộc tính CurrentRegion

(Thuộc tính này các bạn có thể tìm trên diễn đàn để làm chủ nó lúc rỗi)
Lúc đó câu lệnh trong cách 2 sẽ chuyển thành
Set Rng= [B2].CurrentRegion
 
Lần chỉnh sửa cuối:
Upvote 0
Bài tập B1: Tạo macro lọc dữ liệu của 4 ngày giữa tháng 7 bất kỳ sang trang 'BC'

Bạn nào đã biết macro sự kiện, ta có thể tao macro tại ô nhập ngày cuối của trang 'BC' để các bạn khác tham khảo & trao đổi.

Chúc các bạn thành công.

Bảng liệt kê:

TT | Tên bài | Tại | Diễn giải
01|Bài tập B1|#206|Lọc DL 4 ngày tháng 7 sang trang 'BC'
02|Bài tập B2 | #215|Chép số liệu các trang tính 'Nhap' & 'Xuat' sang 'BC'
03|Bài tập B3|#224|Tính tồn kho tháng giêng của 2012.
04|Bài tập B4|#| -
05|Bài tập B5|#|()
06|Bài tập B6|#|
07|Bài tập B7|#|
08|Bài tập B8|#|,
09|...||
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các thuộc tính mà các bạn cần đọc trước khi bắt đầu vào bài tập B2:

-+*/
Thuộc tính CurrentRegion
http://www.giaiphapexcel.com/forum/showthread.php?6419-Thuộc-tính-UsedRange
http://www.giaiphapexcel.com/forum/showthread.php?10315-Nhờ-giải-thích-1-đoạn-code
-+*/
Thuộc tính END()
http://www.giaiphapexcel.com/forum/showthread.php?6420-Hỏi-về-thuộc-tính-End()
http://www.giaiphapexcel.com/forum/...c-tính-End()-trong-Excel-giới-thiệu-tổng-quan

/-*+/
/-*+/
)*&^)
Xin lưu í các bạn nào đã xong B1 nên đưa lên để trao đổi, thảo luận.
 
Upvote 0
chờ mãi không thấy ai lên bảng, nhà em nộp bài vậy. Để lĩnh hội được bài của thày ChanhTQ@ ở trên chắc phải còn dài dài mới hiểu được. Phải thêm cột phụ cho đáp án, thấy cũng không hay, các bạn góp ý.
 

File đính kèm

  • BaiTap8_XNKBLOC.rar
    73.8 KB · Đọc: 52
Upvote 0
Như mọi người nói ở các bài trước đây

/-(ọc viên này đã lại ngồi nhằm lớp;

Thôi rảnh rỗi thì đến lớp khác & thầy/cô khác đi bạn.
 
Upvote 0
Thấy tiêu đề "Những bài tập VBA đơn giản dành cho người mới bắt đầu", mình cũng cố chạy theo các bạn, ai ngờ mới dăm bữa đã không theo được, bị thày đuổi rồi. Dù sao cũng phải cảm ơn các thày và các bạn. Dốt khổ thật!
 
Upvote 0
Nói để các học viên đỡ fân vân

Với nội dung này của macro:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Intersect(Target, [B3]) Is Nothing Then Exit Sub
 Me.UsedRange.Resize(, 11).Offset(3).Clear
 Sheet1.[A3:J2000].AdvancedFilter 2, [B2:B3], [A5]
End Sub
Bạn 'KB' có trình độ là thầy giáo của những người đứng lớp này. Đó là điều khẳn định;

Điều khẳng định nữa, đó là:
Không fải người có khả năng dạy học viên đại học hay cao hơn lại có thể hướng dẫn cho cấp I làm tốt bài tập;


Chứng minh:

Không nên truyền đạt cho học viên "tiểu học" câu lệnh như vầy
Mã:
 Sheet1.[A3:J2000].AdvancedFilter 2, [B2:B3], [A5]

& Kết quả câu lệnh này là dữ liệu vừa được lọc & vừa được chép qua 'BC'
Nhưng chệch khá xa so với iêu cầu đề bài;

Nói lên điều này, để thấy rằng, để "Giảng viên" ngồi trong lớp chỉ tổ fá rối học viên khác & lớp mà thôi.



__--__
 
Lần chỉnh sửa cuối:
Upvote 0
/-(ọc viên này đã lại ngồi nhằm lớp;

Thôi rảnh rỗi thì đến lớp khác & thầy/cô khác đi bạn.
1 - Xin lỗi thầy vì nhà em nhầm đề, tưởng vẫn làm theo bài tập cũ cho hệ thống. Nhưng thực ra đề đã chuyển sang bài #205 rồi.
2 - Nhà em muốn học là thật mà. Thực ra code trên cũng là kiến thức của các thày mà, nhà em chỉ mang ra ứng dụng mà thôi. Thấy các bạn viết code cho bài giải, đêm đêm ngồi xem thấy hay quá, phục thật! và chỉ mong theo kịp các bạn mà thôi. Mong thày và các bạn đừng hiểu lầm .
 
Lần chỉnh sửa cuối:
Upvote 0
gửi thày SA_DQ
Nếu thực nhà em làm phiền các thày và các bạn, thi cho em xin lỗi. Xin tạm biệt và chúc bình yên.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nào đã biết macro sự kiện, ta có thể tao macro tại ô nhập ngày cuối của trang 'BC' để các bạn khác tham khảo & trao đổi.

Chúc các bạn thành công.

Bảng liệt kê:

TT | Tên bài | Tại | Diễn giải
01|Bài tập B1|#1|Lọc DL 4 ngày tháng 7 sang trang 'BC'
09|...||

Em làm cái bài tập B1.

Mã:
Public Sub Xuan()
Dim Rng(), Arr(), I As Long, J As Long, K As Long, NgayDau As Date, NgayCuoi As Date
With Sheets("Nhap")
    Rng = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 7).Value
End With
ReDim Arr(1 To UBound(Rng, 1), 1 To 6)
With Sheets("BC")
    NgayDau = .[E1].Value
    NgayCuoi = .[E2].Value
For I = 1 To UBound(Rng, 1)
    If Rng(I, 1) >= NgayDau And Rng(I, 1) <= NgayCuoi Then
        K = K + 1
        Arr(K, 1) = K
        Arr(K, 2) = Rng(I, 1)
        Arr(K, 3) = Rng(I, 4)
        Arr(K, 4) = Rng(I, 5)
        Arr(K, 5) = Rng(I, 6)
    End If
Next I
.[A5:F1000].ClearContents
.[A5].Resize(K, 6).Value = Arr
End With
End Sub
 

File đính kèm

  • gpeBaitap10.zip
    178.9 KB · Đọc: 20
Upvote 0
Bài B2: Hãy chép số liệu cả 2 trang tính 'Nhap' & 'Xuat' sang trang 'BC'

Sau đó sắp xếp theo trình tự thời gian theo file đính kèm sau đây
 

File đính kèm

  • gpeBaiTap.rar
    67.9 KB · Đọc: 17
Upvote 0
Em làm cái bài tập B1.

Mã:
Public Sub Xuan()
Dim Rng(), Arr(), I As Long, J As Long, K As Long, NgayDau As Date, NgayCuoi As Date
With Sheets("Nhap")
    Rng = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 7).Value
End With
ReDim Arr(1 To UBound(Rng, 1), 1 To 6)
With Sheets("BC")
    NgayDau = .[E1].Value
    NgayCuoi = .[E2].Value
For I = 1 To UBound(Rng, 1)
    If Rng(I, 1) >= NgayDau And Rng(I, 1) <= NgayCuoi Then
        K = K + 1
        Arr(K, 1) = K
        Arr(K, 2) = Rng(I, 1)
        Arr(K, 3) = Rng(I, 4)
        Arr(K, 4) = Rng(I, 5)
        Arr(K, 5) = Rng(I, 6)
    End If
Next I
.[A5:F1000].ClearContents
.[A5].Resize(K, 6).Value = Arr
End With
End Sub
Các anh chị cho tôi hỏi:
Rng = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 7).Value
NgayDau = .[E1].Value
NgayCuoi = .[E2].Value


Các dấu chấm màu đỏ trên có tác dụng như thế nào?
Cảm ơn cả nhà
 
Upvote 0
Các anh chị cho tôi hỏi:
Rng = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 7).Value
NgayDau = .[E1].Value
NgayCuoi = .[E2].Value


Các dấu chấm màu đỏ trên có tác dụng như thế nào?
Cảm ơn cả nhà
Câu lệnh trên cùng (Rng = .Range(.[A2], .[A65536].End(xlUp)).Resize(, 7).Value) nằm trong câu lệnh With Sheets("Nhap"), do đó các dấu chấm ở trên cho biết những gì đi sau nó là thuộc tính (hoặc đối tượng con) của đối tượng Sheets("Nhap"), có nghĩa là nếu đầy đủ thì phải viết như sau (nếu không có câu lệnh With):
PHP:
Rng = Sheets("Nhap").Range(Sheets("Nhap").[A2], Sheets("Nhap").[A65536].End(xlUp)).Resize(, 7).Value
Lập luận tương tự cho các dấu chấm ở dưới.
 
Upvote 0
Dấu chấm trước đối tượng thay cho cái gì đó sau With
Dấu chấm sau đối tượng là thuộc tính của đối tượng đó.
Như ví dụ .[A2].Borders....
Chấm đầu thay cho Sheet1, chấm sau là thuộc tính Borders của [A2]
With sheet1
Ví dụ:
Mã:
[B].[A2].Borders.Linestyle=xlContinuous[/B]
Và câu:
Mã:
[B]Sheet1.[A2].Borders.Linestyle=xlContinuous[/B]
Là như nhau.
Chỉ sử dụng With khi muốn thay cho 1 đối tượng nào đó nhiều lần, nhiều dòng phải lặp lại cùng 1 nội dung như thế.
Ví dụ:
Sheet1.[A2:J1000].clearcontents
Sheet1.[A2].resize(,5).value=Arr
Sheet1.[A2].resize(K,5).Interior.ColorIndex= xlNong
Sheet1.[A2].Font.ColorIndex=3

Như trong Code của mình, dấu chấm ở dòng 4 là thay cho Sheets("Nhap")
Dấu chấm từ dòng 8 trở xuống là thay cho Sheets("BC")

Ngoài lề một chút, không giải thích dấu chấm theo đề bài này, theo sách của anh Phan Tự Hướng mình có đọc là:

Khi Tham chiếu tới đối tượng:
Wb(“ten book”).Worksheet(“ten sheet”).Range(“B3”)
Dấu chấm có ý nghĩa là ký tự đường dẫn.

Ban đầu khi mình học A,B,C cũng là tìm hiểu về đối tượng, thuộc tính, về các ký tự trong cửa sổ soạn thảo VBA. dấu móc đơn, dấu chấm, dấu gạch dưới, ....các ký tự khác khi tiến hành ghi macro.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nào đã biết macro sự kiện, ta có thể tao macro tại ô nhập ngày cuối của trang 'BC' để các bạn khác tham khảo & trao đổi.

Chúc các bạn thành công.

Bảng liệt kê:

TT | Tên bài | Tại | Diễn giải
01|Bài tập B1|#1|Lọc DL 4 ngày tháng 7 sang trang 'BC'
09|...||

Em làm bài này theo gợi ý về macro sự kiện.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$2" Then Xuan
End Sub
 

File đính kèm

  • gpeBaitap10_2.zip
    182.7 KB · Đọc: 22
Lần chỉnh sửa cuối:
Upvote 0
Sau đó sắp xếp theo trình tự thời gian theo file đính kèm sau đây
......hi

Hình như lớp học mấy hôm nay vắng vẻ quá ạ....
Mỗi em lên bảng...hic hic.

Bài 2: chép dữ liệu từ sheet "Nhap" và sheet "Xuat" sang sheet "BC". Sau đó sắp xếp theo trình tự thời gian theo file đính kèm
Mã:
Public Sub CopyNhap()
Sheets("BC").Range("A5:F1000").Clear
Sheets("Nhap").Select
[AA1] = Sheets("BC").[E1]
[AA2] = Sheets("BC").[E2]
[Ac1] = [A1]: [AD1] = [A1]
[AC2] = "="">=""&R[-1]C[-2]"
[AD2] = "=""<=""&RC[-3]"
[AC4] = [A1]: [AD4] = [D1]
[AE4] = [E1]: [AF4] = [F1]: [AG4] = [G1]
    Columns("A:G").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "AC1:AD2"), CopyToRange:=Range("AC4:AG4")
    Range(Range("AC5"), Range("AF65000").End(xlUp)).Copy
    Sheets("BC").Select
    Range("B5").PasteSpecial Paste:=xlPasteValues
End Sub
....................................................
Public Sub CopyXuat()
Sheets("Xuat").Select
[AA1] = Sheets("BC").[E1]
[AA2] = Sheets("BC").[E2]
[Ac1] = [A1]: [AD1] = [A1]
[AC2] = "="">=""&R[-1]C[-2]"
[AD2] = "=""<=""&RC[-3]"
[AC4] = [A1]: [AD4] = [F1]
[AE4] = [G1]: [AF4] = [I1]: [AG4] = [H1]
    Columns("A:I").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "AC1:AD2"), CopyToRange:=Range("AC4:AG4")
    Range(Range("AC5"), Range("AG65000").End(xlUp)).Copy
    Sheets("BC").Select
    Range("B65536").End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End Sub
..............................................................................
Public Sub SORTNGAY()
    Sheets("Nhap").[AA:AG].Clear
    Sheets("Xuat").[AA:AG].Clear
    With Range(Range("B5"), Range("B5").End(xlDown))
        .NumberFormat = "dd/mm/yyyy"
        .Resize(, 5).Sort Key1:=Range("B5"), Order1:=xlAscending
        With .Offset(, -1)
            .Value = "=Row()-4"
            .Value = .Value
            .Resize(, 6).Borders.LineStyle = xlContinuous
        End With
    End With
End Sub
 

File đính kèm

  • Bai2_BC_Ngay.zip
    104.4 KB · Đọc: 25
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom