Chú ý: Các thành viên học lớp "Lập trình VBA trong Excel" có thể trao đổi bài ở đây

Liên hệ QC

NH_DK

Let's patience
Tham gia
29/7/10
Bài viết
865
Được thích
1,203
Nghề nghiệp
Kế toán
Em thấy việc trao đổi bài giữa các thành viên qua Mail không tiện lắm. Vậy em "Khởi tạo topic này" để làm nơi các thành viên trong lớp học có thể trao đổi bài trong lớp cho tiện. Mình vừa trao đổi bài lại vừa có thể tìm thông tin ở GPE.
Em đặt vấn đề như vậy, nếu OK thì mời mọi người có thắc mắc, hãy gửi bài lên đây để mọi người cùng chia sẻ nhé!
Thân mếm!
 
Em có câu hỏi này, có thể là hỏi trước vấn đề học (nhưng em đã làm rồi), xin thầy Tuân chỉ dùm em nha:
Trong việc Copy từ Sheet1 sang Sheet2 thì em đã thiết lập 2 đoạn code (Thử theo 2 cách): thì 1 trong 2 đoạn code đó có đoạn không chạy được đúng ý muốn của em. Đoạn kia thì chạy tốt. cụ thể là đoạn này:
PHP:
Sub CopyDL() 'Sao cai nay khong chay duoc theo y muon nhi!?
Dim n As Long, i As Long, m As Long
    Application.ScreenUpdating = False
    Sheet2.Range("A3:I65535").Clear
    n = Sheet1.Range("I65535").End(xlUp).Row
    Sheet1.Range("A3:I" & n).Copy Destination:=Sheet2.Range("A3")
    With Sheet2
    m = .Range("A65535").End(xlUp).Row
        For i = m To 2 Step -1
            If .Cells(i, 1) & .Cells(1, 2) & .Cells(i, 3) = .Cells(i - 1, 1) & _
            .Cells(i - 1, 2) & .Cells(i - 1, 3) Then .Cells(i, 1).Resize(, 3) = Empty
 
        Next
    End With
End Sub

Em đã kiểm tra kỹ mà chưa phát hiện ra lỗi.
 

File đính kèm

  • GPE.rar
    10.3 KB · Đọc: 60
Bài số 2 em không hiểu đề, bác nào giải thích hộ em với ạ
" Tạo 1 macro sắp xếp một vùng dữ liệu"
 
Em có câu hỏi này, có thể là hỏi trước vấn đề học (nhưng em đã làm rồi), xin thầy Tuân chỉ dùm em nha:
Trong việc Copy từ Sheet1 sang Sheet2 thì em đã thiết lập 2 đoạn code (Thử theo 2 cách): thì 1 trong 2 đoạn code đó có đoạn không chạy được đúng ý muốn của em. Đoạn kia thì chạy tốt. cụ thể là đoạn này:
PHP:
Sub CopyDL() 'Sao cai nay khong chay duoc theo y muon nhi!?
Dim n As Long, i As Long, m As Long
Application.ScreenUpdating = False
Sheet2.Range("A3:I65535").Clear
n = Sheet1.Range("I65535").End(xlUp).Row
Sheet1.Range("A3:I" & n).Copy Destination:=Sheet2.Range("A3")
With Sheet2
m = .Range("A65535").End(xlUp).Row
For i = m To 2 Step -1
If .Cells(i, 1) & .Cells(1, 2) & .Cells(i, 3) = .Cells(i - 1, 1) & _
.Cells(i - 1, 2) & .Cells(i - 1, 3) Then .Cells(i, 1).Resize(, 3) = Empty
 
Next
End With
End Sub

Em đã kiểm tra kỹ mà chưa phát hiện ra lỗi.
Sai chỗ này nè
If .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3)
I chứ hổng phải 1 à nha
Híc
Ủa, quên, mình hổng có học có sửa được hông "zị"
 
Em có câu hỏi này, có thể là hỏi trước vấn đề học (nhưng em đã làm rồi), xin thầy Tuân chỉ dùm em nha:
Trong việc Copy từ Sheet1 sang Sheet2 thì em đã thiết lập 2 đoạn code (Thử theo 2 cách): thì 1 trong 2 đoạn code đó có đoạn không chạy được đúng ý muốn của em. Đoạn kia thì chạy tốt. cụ thể là đoạn này:
PHP:
Sub CopyDL() 'Sao cai nay khong chay duoc theo y muon nhi!?
Dim n As Long, i As Long, m As Long
    Application.ScreenUpdating = False
    Sheet2.Range("A3:I65535").Clear
    n = Sheet1.Range("I65535").End(xlUp).Row
    Sheet1.Range("A3:I" & n).Copy Destination:=Sheet2.Range("A3")
    With Sheet2
    m = .Range("A65535").End(xlUp).Row
        For i = m To 2 Step -1
            If .Cells(i, 1) & .Cells(1, 2) & .Cells(i, 3) = .Cells(i - 1, 1) & _
            .Cells(i - 1, 2) & .Cells(i - 1, 3) Then .Cells(i, 1).Resize(, 3) = Empty
 
        Next
    End With
End Sub
Em đã kiểm tra kỹ mà chưa phát hiện ra lỗi.
Bị lỗi chỗ này nè Ngọc:
Mã:
[COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=red][COLOR=#0000BB]1[/COLOR][/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
[/COLOR][/COLOR]Sửa lại như vầy:
Mã:
[COLOR=#000000][COLOR=#007700].[/COLOR][COLOR=#0000BB]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
[/COLOR][/COLOR]


 
Mạn fép thầy Tuân, đưa lên 1 macro nữa cho vui cửa nhà

PHP:
Sub CopyDL()
 Dim eRw As Long, jJ As Long
 
 Application.ScreenUpdating = False
 Range("A3:I65535").Clear
 eRw = Sheet1.Range("I65535").End(xlUp).Row
4 Sheet1.Range("A3:I" & eRw).Copy Destination:=Sheet2.Range("A3")
 eRw = Range("A65535").End(xlUp).Row
 For jJ = eRw To 4 Step -1
   With Cells(jJ, 1)
      If .Value = .Offset(-1).Value And .Offset(, 1).Value = _
         .Offset(-1, 1).Value And .Offset(, 2) = .Offset(-1, 2) Then
         .Resize(, 3).Value = ""
      End If
   End With
Next
End Sub

(*) Mình thường khai báo 1 biến nào đó gồm ít nhất là 2 chữ cái, để trong đó ít nhất có 1 chữ viết hoa & 1 chữ viết thường; Và mình hết sức tránh dùng chữ cái 'n' mà hay dùng jj, ww zz, & ff vì để các fím có độ hư đồng đều. (Khà, khà,. . .)

(*) Bỡi nút lệnh của bạn đang ở Sheet2, nên cũng không cần thiết ới gọi trang tính này trong các câu lệnh nữa;

(*) Kể từ sau dòng 4 ta có thể xài lại biến eRw với việc gán cho nó 1 trị mới. Vì thật ra biến n của bạn cũng không dùng nữa kể từ sau dòng lệnh này; Tất nhiên sẽ gây cho ta 1 chút rắc rối cần thiết nào đó trong việc quản lí các biến của mình. Lâu dần ta sẽ có thói quen quản các biến trong những chương trình vĩ đại sau này của bạn.

Rất vui nếu được bạn cho đây là những lời khuyên không vô bổ.
 
Lần chỉnh sửa cuối:
Em có câu hỏi này, có thể là hỏi trước vấn đề học (nhưng em đã làm rồi), xin thầy Tuân chỉ dùm em nha:
Trong việc Copy từ Sheet1 sang Sheet2 thì em đã thiết lập 2 đoạn code (Thử theo 2 cách): thì 1 trong 2 đoạn code đó có đoạn không chạy được đúng ý muốn của em. Đoạn kia thì chạy tốt. cụ thể là đoạn này:
PHP:
Sub CopyDL() 'Sao cai nay khong chay duoc theo y muon nhi!?
Dim n As Long, i As Long, m As Long
    Application.ScreenUpdating = False
    Sheet2.Range("A3:I65535").Clear
    n = Sheet1.Range("I65535").End(xlUp).Row
    Sheet1.Range("A3:I" & n).Copy Destination:=Sheet2.Range("A3")
    With Sheet2
    m = .Range("A65535").End(xlUp).Row
        For i = m To 2 Step -1
            If .Cells(i, 1) & .Cells(1, 2) & .Cells(i, 3) = .Cells(i - 1, 1) & _
            .Cells(i - 1, 2) & .Cells(i - 1, 3) Then .Cells(i, 1).Resize(, 3) = Empty
 
        Next
    End With
End Sub

Em đã kiểm tra kỹ mà chưa phát hiện ra lỗi.

Ý đồ thì tốt nhưng thực hiện chưa tốt (ý kiến cá nhân). Ngọc đi trước xa bài học quá thì lớp mình mấy ai thảo luận được đây.
Nếu là thảo luận trong phạm vi lớp học thì hãy mở đầu bằng những gì đã được học ở bài học đầu tiên.
Tớ nghĩ ngay bài học đầu tiên ta cũng có quá nhiều điều phải hỏi và thảo luận rồi
Chẳng qua, chúng ta chưa làm đi làm lại các tình huống xoay quanh bài học đó thôi.

Thảo luận + Ghóp ý + Phê Bình = Cùng tiến bộ
 
Sai chỗ này nè
If .Cells(i, 1) & .Cells(i, 2) & .Cells(i, 3)
I chứ hổng phải 1 à nha
Híc
Ủa, quên, mình hổng có học có sửa được hông "zị"

Đúng là cháu sơ xuất quá (lỗi không đáng có!?)! Hi.......... (Mọi người đừng cười nha!!)
 
Lần chỉnh sửa cuối:
Bài số 2 em không hiểu đề, bác nào giải thích hộ em với ạ
" Tạo 1 macro sắp xếp một vùng dữ liệu"

Có nghĩa là: Bạn tạo một vùng dữ liệu bao gồm các số lớn bé linh tinh không theo thứ tự trong cột. Sau đó sắp xếp chúng lại theo thứ tự.
Từ lớn đến bé hoặc từ bé đến lớn.
 

File đính kèm

  • VDu-Bai1.xls
    39 KB · Đọc: 31
PHP:
Sub CopyDL()
Dim eRw As Long, jJ As Long

Application.ScreenUpdating = False
Range("A3:I65535").Clear
eRw = Sheet1.Range("I65535").End(xlUp).Row
4 Sheet1.Range("A3:I" & eRw).Copy Destination:=Sheet2.Range("A3")
eRw = Range("A65535").End(xlUp).Row
For jJ = eRw To 4 Step -1
With Cells(jJ, 1)
If .Value = .Offset(-1).Value And .Offset(, 1).Value = _
.Offset(-1, 1).Value And .Offset(, 2) = .Offset(-1, 2) Then
.Resize(, 3).Value = ""
End If
End With
Next
End Sub

(*) Mình thường khai báo 1 biến nào đó gồm ít nhất là 2 chữ cái, để trong đó ít nhất có 1 chữ viết hoa & 1 chữ viết thường; Và mình hết sức tránh dùng chữ cái 'n' mà hay dùng jj, ww zz, & ff vì để các fím có độ hư đồng đều. (Khà, khà,. . .)

(*) Bỡi nút lệnh của bạn đang ở Sheet2, nên cũng không cần thiết ới gọi trang tính này trong các câu lệnh nữa;

(*) Kể từ sau dòng 4 ta có thể xài lại biến eRw với việc gán cho nó 1 trị mới. Vì thật ra biến n của bạn cũng không dùng nữa kể từ sau dòng lệnh này; Tất nhiên sẽ gây cho ta 1 chút rắc rối cần thiết nào đó trong việc quản lí các biến của mình. Lâu dần ta sẽ có thói quen quản các biến trong những chương trình vĩ đại sau này của bạn.

Rất vui nếu được bạn cho đây là những lời khuyên không vô bổ.

Cám ơn những ý kiến đóng góp của thầy Chanh@ thật bổ ích!
 
Câu hỏi: Tại sao khi copy sheet1 sang Sheet1(2) này thì 4 macro (MC) đã được tạo từ khi ở Sheet1 chỉ có 2 cái kẻ khung và bỏ kẻ khung chạy
Còn 2 cái MC sắp xếp không chạy
Câu này bạn huongchuoi hỏi, mình chỉ trả lời được như thế này thôi vì:
Khi MC chạy nó mặc định tạo: ActiveWorkbook.Worksheets("Sheet1")
Nếu nó tạo là : Activesheet
Thì thì 2 MC sắp xếp sẽ chạy được khi copy sang Sheet1(2)
Còn tại sao bác Bill không làm như thế khi tạo 2 MC định dạng khung và nền thì mình không hiểu.

Nhờ các bạn và thầy giáo giải thích giúp!
 

File đính kèm

  • CauHoi-Bai1.xls
    49.5 KB · Đọc: 24
Câu hỏi: Tại sao khi copy sheet1 sang Sheet1(2) này thì 4 macro (MC) đã được tạo từ khi ở Sheet1 chỉ có 2 cái kẻ khung và bỏ kẻ khung chạy
Còn 2 cái MC sắp xếp không chạy
Câu này bạn huongchuoi hỏi, mình chỉ trả lời được như thế này thôi vì:
Khi MC chạy nó mặc định tạo: ActiveWorkbook.Worksheets("Sheet1")
Nếu nó tạo là : Activesheet
Thì thì 2 MC sắp xếp sẽ chạy được khi copy sang Sheet1(2)
Còn tại sao bác Bill không làm như thế khi tạo 2 MC định dạng khung và nền thì mình không hiểu.

Nhờ các bạn và thầy giáo giải thích giúp!

Căn cứ vào đâu mà bạn xác định nó không chạy? Nó vẫn chạy mà vẫn bon bon là đằng khác. Bạn cố định nó vào Sheet1 rồi nên nó chỉ chơi với Sh1, bạn thay đổi trật dòng Sh1 rồi chạy code để kiểm tra xem. Giờ muốn chạy Sh khác phải tìm cách thay đổi Sh1 bằng chỉ định hay gán luôn Sh hiện hành
 
Căn cứ vào đâu mà bạn xác định nó không chạy? Nó vẫn chạy mà vẫn bon bon là đằng khác. Bạn cố định nó vào Sheet1 rồi nên nó chỉ chơi với Sh1, bạn thay đổi trật dòng Sh1 rồi chạy code để kiểm tra xem. Giờ muốn chạy Sh khác phải tìm cách thay đổi Sh1 bằng chỉ định hay gán luôn Sh hiện hành
Thì Em đang bảo là không đổi lại là Activesheet thì nó không chạy là gì.
Khi tạo MC tự động có những hành động (từ này có vẻ không chuẩn lắm) bị ấn định cố định tên Sh và có những cái thì không.
2 Cái MC sắp xếp không chạy do bị ấn định là Sheet1 nên không chạy trên Sheet1(2)
2 Cái định dạng kẻ khung, và tô nền vẫn chạy trên ca Sheest1 và Sheet1(2) do không bị ấn định sh khi MC khởi tạo nó ở Sheet1

Tại sao? Cùng là ghi MC tự động cái thì bị gán name Sh cố định cái thì không ?
 
Lần chỉnh sửa cuối:
Thì Em đang bảo là không đổi lại là Activesheet thì nó không chạy là gì.
Khi tạo MC tự động có những hành động (từ này có vẻ không chuẩn lắm) bị ấn định cố định tên Sh và có những cái thì không.
2 Cái MC sắp xếp không chạy do bị ấn định là Sheet1 nên không chạy trên Sheet1(2)
2 Cái định dạng kẻ khung, và tô nền vẫn chạy trên ca Sheest1 và Sheet1(2) do không bị ấn định sh khi MC khởi tạo nó ở Sheet1

Tại sao? Cùng là ghi MC tự động cái thì bị gán name Sh cố định cái thì không ?

Em không hiểu bài của huongchuoi lắm! Đây là ví dụ em làm: Em chỉ sắp xếp và kẻ đường viền thôi.
Lưu ý: Nếu khi muốn copy sang Sheet khác (mà vẫn để đúng vị trì cũ) thì chạy tốt. Cón nếu muốn thay đổi vị trí khác thì anh phải kiểm tra lại địa chỉ để sắp xếp nha!
 

File đính kèm

  • GPEBT.rar
    8.7 KB · Đọc: 19
Chỉ là câu hỏi này thôi mà Tại sao? Cùng là ghi MC tự động cái thì bị gán name Sh cố định cái thì không ?
 
Mọi người hãy làm bài tập đi nhé để buối tối đi học có thắc mắc nào để hỏi các thành viên hoặc thầy giáo!
 
So sánh 2 đoạn code được trích ra từ file của mình và của Ngọc
Đoạn của NGọc

Selection.Sort Key1:=Range("D3"), Order1:=xlDescending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Đoạn của Minh:

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A5"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal

Trong file đã gửi phía trên.

Nếu như cùng thao tác ghi MC giống nhau mà cho 2 đoạn Code khác nhau có lẽ sử dụng Office khác nhau. Mình dùng 2007
Vì đoạn code của Ngọc không ấn định nameSheet nên sang Sheet khác chạy vô tư là đúng.
Mình vẫn là câu thắc mắc như trên Tại sao? Cùng là ghi MC tự động cái thì bị gán name Sh cố định cái thì không ?
 
Web KT
Back
Top Bottom