Góp ý về sách hướng dẫn Lập trình VBA trong Excel (NXB TKê)

Liên hệ QC
BÁC HƯỚNG NÀY! Ở TRANG 262 , PHẦN XÓA DÒNG TRỐNG CÓ ĐOẠN CODE

If Application.CountA(Rows(i)) = 0 ThenRows(i).DeleteNext i

TÔI NGHỈ LÀ CÒN THIẾU End If PHẢI KHÔNG ?
 
BÁC HƯỚNG NÀY! Ở TRANG 262 , PHẦN XÓA DÒNG TRỐNG CÓ ĐOẠN CODE

If Application.CountA(Rows(i)) = 0 Then Rows(i).DeleteNext i

TÔI NGHỈ LÀ CÒN THIẾU End If PHẢI KHÔNG ?
Không phải vậy đâu bạn Hổ à;
Với câu lệnh If có máy cách viết sau:
PHP:
If Anh = Em Then ChungTa = KetHon
PHP:
 If Em <17 Then
     Em = "Chua Lo Lay Chong Voi Lam Gi, Doi Them Buon"
 End If
PHP:
If Em > 35 And CacAnhEmCuaEm = "Da Co Gia Dinh" Then _
     Em = "Hay Lay Anh Lam Chong!"
PHP:
If Em = Thuong And _
   And = "Chua Vo" And _
   Em = "Chua Chong" then 
   ChungTa =" Mot Doi Dua"
 Else
   ChungTa = " Chia Hai Nga Cho Roi!" :                       End If
 
Bạn Thử Xem Trang 262 Chép Lại Macro đó,trên đoạn Code đó Là For I =...
Rồi Chạy Thử Xem Sau.nó Báo Lổi đấy.
 

File đính kèm

  • DelEmptyRows.xls
    23 KB · Đọc: 47
TÔI ĐẢ THẤY ĐƯỢC SỰ KHÁC BIỆT : NẾU ĐỂ DÒNG Rows(i).Delete XUỐNG DÒNG DƯỚI ,CHỨ KHÔNG LIỀN KỀ THEN THÌ PHẢI THÊM END IF
MỚI KHÔNG BỊ BÁO LỖI.
 
TÔI ĐẢ THẤY ĐƯỢC SỰ KHÁC BIỆT : NẾU ĐỂ DÒNG Rows(i).Delete XUỐNG DÒNG DƯỚI ,CHỨ KHÔNG LIỀN KỀ THEN THÌ PHẢI THÊM END IF
MỚI KHÔNG BỊ BÁO LỖI.

Cái này là do chiều rộng hàng không đủ thì tự xuống dòng thôi, đây vẫn là 1 dòng code, bạn ngvanho lưu ý nhiều trường hợp sẽ bị như vậy vì code dài quá 1 dòng. Nếu dòng code vừa đủ 1 dòng thì khoảng cách chữ đều nhau, nếu quá 1 dòng thì khoảng cách chữ thường bị giãn dài ra, ví dụ như dấu "=" hoặc "0" chẳng hạn tại dòng lệnh đó
 
Đúng là nhầm bác Voda ạ, xin lỗi cả nhà nhé! -=

Đây là kết quả của lệnh của bác Voda trên cửa sổ Immediate:

Thoigian.jpg
 
- Đọc cuốn sách của bác Hướng, mình thấy tác giả đã bỏ ra biết bao công sức để mang lại lợi ích cho cộng đồng. Cuốn sách đã giúp mình rất nhiều trong việc học và nghiên cứu VBA. Cám ơn bác Hướng thật nhiều.
-Mình cũng xin nêu một vài chỗ còn thắc mắc nhờ tác giả và các bạn giải đáp giùm:
VẤN ĐỀ 1:
-Trang 192:
14.2.1 - Điều khiển Do...Loop
Thực hiện một khối lệnh với số lần lặp xác định...
-Trang 194:
14.2.5 - Điều khiển For...Next
Bạn có thể lặp hành động với số lần biết trước...
Thắc mắc ở chỗ: Số lần lặp xác định và số lần biết trước có khác nhau gì không?
VẤN ĐỀ 2:
-Trang 194:
14.2.4 - Điều khiển Do Until...Loop
Bạn có thể thực hiện các khối lệnh từ đầu vòng lặp cho đến khi điều kiện vẫn True. Đến khi điều kiện false thì sẽ thoát ra. Phương thức này giống như vòng lặp For...Next
-Thắc mắc ở chỗ, hình như đối Do Until...Loop, khi điều kiện false vòng lặp chạy, khi điều kiện true vòng lặp mới thoát.
-Và Do Until...Loop giống For...Next ở chỗ nào?
Cám ơn nhiều!
 
Khác nhau giữa For..Next và Do While/Do Until..Loop, While WEnd

- Đọc cuốn sách của bác Hướng, mình thấy tác giả đã bỏ ra biết bao công sức để mang lại lợi ích cho cộng đồng. Cuốn sách đã giúp mình rất nhiều trong việc học và nghiên cứu VBA. Cám ơn bác Hướng thật nhiều.
-Mình cũng xin nêu một vài chỗ còn thắc mắc nhờ tác giả và các bạn giải đáp giùm:
VẤN ĐỀ 1:

Thắc mắc ở chỗ: Số lần lặp xác định và số lần biết trước có khác nhau gì không?
VẤN ĐỀ 2:

-Thắc mắc ở chỗ, hình như đối Do Until...Loop, khi điều kiện false vòng lặp chạy, khi điều kiện true vòng lặp mới thoát.
-Và Do Until...Loop giống For...Next ở chỗ nào?
Cám ơn nhiều!


For..Next : Thường được dùng với số vòng lặp được xác định trước

Mã:
Dim Sh As WorkSheet
For I = 1 To Sheets.Count
    Set Sh = Sheets(I)
   Debug.Print Sh.Name
Next I
Hay

Mã:
Dim Sh As WorkSheet
For Each Sh In Sheets
   Debug.Print Sh.Name
Next

Ở đây, Sheets.Count là số sheet được xác định trước, vòng lặp chạy từ sheet 1..Sheets.Count (có thể là 0,1....n), giá trị của Sheets.Count sẽ không thay đổi cho đến khi thoát khỏi vòng lặp (cho dù có thể số sheet đã tăng hay giảm trong quá trình chạy vòng lặp.

Do While..Loop, While..WEnd và Do Until..Loop

Xét một ví dụ thực hiện duyệt các giá trị trong Cột A từ dòng 1, vòng lặp chỉ dùng lại khi giá trị ở dòng thứ I là trống (rỗng)

Ở ví dụ này thì số vòng lặp là không biết trước, nó chỉ dừng lại khi thỏa mãn một điều kiện nào đó được xác định ở đầu vòng lặp, sau từ khóa While, Until

Cách 1:
Mã:
    Dim I&
    I = 1
    Do While [COLOR="Red"]Not IsEmpty(Cells(I, 1))[/COLOR]
        Debug.Print I
        I = I + 1
    Loop

Cách 2:
Mã:
    I = 1
    While [COLOR="Red"]Not IsEmpty(Cells(I, 1))[/COLOR]
        Debug.Print I
        I = I + 1
    Wend

Cách 3:

Mã:
    I = 1
    Do Until [COLOR="Red"]IsEmpty(Cells(I, 1))[/COLOR]
        Debug.Print I
        I = I + 1
    Loop

(*) Biểu thức đứng sau từ khóa While, Until được thực hiện với mỗi vòng lặp

Trên là những điều khác nhau rất cơ bản giữa For..Next và Do While/Do Until..Loop, While WEnd.
 
Nguyên văn bởi TuanVNUNI
Khác nhau giữa For..Next và Do While/Do Until..Loop, While WEnd
Cám ơn TuanVNUNI. Mình không hỏi về sự khác nhau giữa For...Next và Do ...Loop...Mình chỉ thắc mắc ở một số dòng, một số ý trong cuốn sách viết về các loại vòng lặp trên. Nếu những thắc mắc của mình là hợp lý thì có thể giúp tác giả hiệu chỉnh sách cho toàn vẹn hơn. Tất nhiên nếu có, thì những chỗ chưa ổn này là rất nhỏ so với một công trình biên soạn trên 500 trang.
 
Cám ơn TuanVNUNI. Mình không hỏi về sự khác nhau giữa For...Next và Do ...Loop...Mình chỉ thắc mắc ở một số dòng, một số ý trong cuốn sách viết về các loại vòng lặp trên. Nếu những thắc mắc của mình là hợp lý thì có thể giúp tác giả hiệu chỉnh sách cho toàn vẹn hơn. Tất nhiên nếu có, thì những chỗ chưa ổn này là rất nhỏ so với một công trình biên soạn trên 500 trang.

Vâng, em viết chi tiết bài trên cũng để những thành viên khác nếu chưa rõ tham khảo thêm. Vấn đề về vòng lặp For, While...nếu người đọc không hiểu hiểu rõ nguyên lý (chỉ hiểu đơn giản là vòng lặp) thì rất tai hại, khi lập trình sẽ dẫn đến sai mà lỗi đó không phải dễ nhận ra đâu (lỗi tiềm ẩn).
Mặc dù 1 dòng chưa rõ ràng, nó có thể nó không thấm vào đâu trong số 500 dòng của cuốn sách nhưng tác giả cũng lưu ý là có thể có 5000 người đọc dòng này.
 
Hỏi về ví dụ 4 trang 479

Tại VD4 trang 479 tác giả có đề cập là khi thay đổi tọa độ trong Excel thì được cập nhật ngay trong AutoCAD, nhưng trong mã code thì không có phần này do đó tác giả có thể bổ sung thêm phần này được không, tác giả có thể đưa lên DĐ hoặc mail riêng dùm : vienbp2004@yahoo.com
 
*-* Trang 66
1.
PHP:
Sheets("Sheet1").active
--> Active sữa lại là
PHP:
Sheets("Sheet1").Activate
.
2.
PHP:
Sheets("sheet1").Range("A1:A12").Select
--> Select method of Range class failed?

Ý 2 chỉ thực hiện được khi mình đã Activate sheet1 rồi, Nhưng nếu như mà Activate sheet1 rồi thì trong câu lệnh không cần thiết phải thêm Sheets("sheet1"). mà chỉ cần Range("A1:A12").Select
=> Ý 2 không phải là 1 câu lệnh tổng quát vì khi mình dang đứng ở sheet2 mà thực hiện lệnh sẽ báo lỗi
Select method of Range class failed?
Em nghĩ trong thực tế mình select là luôn nhìn thấy cái mình đã chọn, nên không thể đứng ở sheet2 mà select 1 vùng ở sheet1 được, Nhưng có thể gán giá trị cho vùng o sheet1 được
VD Thay select = value thi ok.
Sheets("sheet1").Range("A1:A12").Select
Thay bằng:
PHP:
Sheets("sheet1").Range("A1:A12").Value = 100
thì OK.
Xin bo sung 2 ví dụ như vậy để phân biệt cho bạn đọc hiểu rõ hơn
Xin ý kiến của cac ban GPE

Sach VBA for Excel Trang 80
Dong lệnh này bị lỗi Subscript out of range
PHP:
Workbook("Popupmenu").Sheets("Sheet1").Range("B3").Select
Có thể sửa lại cho đầy đủ là, nhưng chi đúng với truong hợp đang activate sheet1, con lai bi lỗi.
PHP:
Workbooks("Popupmenu.xls").Sheets("Sheet1").Range("B3").Select
Khi đứng ở vị trí sheet khác sheet1 (sheet2 chẳn hạn) se bao lỗi Select method of Range class failde
Trang 82:
PHP:
MsgBox "Kiểu đồi tượng được chọn là" & TypeName(Selection)
Mình thấy hình trong sách hiện lên thông báo có dấu tiếng việt đàng hoàng mà mình không thể làm được. Mong cac anh em giup nhe.
Trang 83:
Dòng thứ 2 Câu lệnh Cells(5,A).Select --> Chọn ô đơn A5 là không thực hiện được
Trang 88:
Tai sao thấy hai câu lệnh này không có khác nhau gì hết?
PHP:
ActiveCell.FormulaR1C1 = "=sum(R[-3]C:R[-1]C)"
và
ActiveCell.Formula = "=sum(R[-3]C:R[-1]C)"
Ví dụ 2:
Nhập vào công thức =F2-F4 trong ô D5. Theo Code này thì phải sữa lại là
PHP:
Range("b5").Formula="=R[-3]C[2]-R[-1]C[2]"
Theo Code này thì phải sữa lại là: Nhập vào công thức =D2-D4 trong ô B5.
Ví dụ 3: Đề bài là: G6=G5*G4
PHP:
ActiveCell.Formula="=R[-1]C:R[-2]C" Phải sửa lại là
ActiveCell.Formula="=R[-1]C*R[-2]C"
Hai đoạn Code này có tác dụng là past giá trị (không biết nó khác nhau o cho nào?)
1.
PHP:
Range("c5").PasteSpecial Paste:=xlValues    và
Range("c5").PasteSpecial xlPasteValues
Ba Code này là Thoát khoải lệnh copy (Không biết sự khác biệt của nó ra sao?)
2.
PHP:
application.CutCopyMode = False
application.CutCopyMode =xlCut
application.CutCopyMode =xlCopy

*-* Trang 89
PHP:
?Range("b3").NumberFormat 	Trả về kiểu định dạng số ô A3 
                                         Sửa lại là   Trả về kiểu định dạng số ô B3
*-* Trang 91 Tên vùng có thể được gán theo ý muốn khi sử dụng macro, vi du duoi day:
PHP:
Workbooks("Congty.xls").Names.Add name:="congty", RefersTo:="=Danhsach!d1:d10"
--> Là chọn khối tương đối, Nếu ta nháp vào góc trên bên trái (Names Box) thì mỗi lần chọn "congty" là 1 khối ô được nhảy đến vị trí mới.
Nhưng ko hiểu tại sao Code này lúc nào cũng chọn đúng vùng D1:D10 ??? không biết vì sao???
PHP:
Range("congty").Select
*-* Trang 92 Ở dòng 19 từ trên xuống
PHP:
Range("a4").Cut	   Xóa toàn bộ A4
--> Không xóa được vì Cut mà thiếu Past thi ko thực hiện được lệnh xóa.
*-* Trang 95 Dòng 22 từ trên xuống
Ví dụ sau trả về đối tượng font của ô A1
PHP:
Range("A1").Font
Bị lỗi --> Invalid use of property
Vậy muốn biết Ô A1 đang dùng là Font gì làm cách nào ???

*-* Trang 111 Ví dụ 2: Sao làm mà cứ bị lỗi, hình như là thiếu cái gì đó.
PHP:
Sub vd_Object()
Dim YourObject, MyObject, MyStr
Set MyObject = YourObject
YourObject.Text = "Hello World"
MyStr = MyObject.Text
Set MyObject = Nothing
End Sub
*-* Trang 138 Dòng số 9 từ trên xuống
PHP:
Selection.PasteSpecial Paste:=xlValues, operation:=xlMultiply, SkipBlanks:=False, Transpose:=False
Code nay tai sao past lúc nào cũng cho gia trị =0 hết??? Mình cũng không hiểu được đoạn Code này???
Nhưng nếu xóa đi các phần ở sau như the này thì Past bình thường. Xin GPE chỉ giúp???
PHP:
Selection.PasteSpecial Paste:=xlValues
*-* Trang 144 Dòng số 6 tu duoi len.
PHP:
Sub Log_in_Excel1()    
  Answer = WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
  MsgBox "Excel:Gia tri log(" & Range("D2").Value & ")= " & Answer
End Sub
VD Sub này không hợp lý, vì nếu đứng ở sheet1 và chạy thì, Giá trị để tính là Sheets3!D2, nhưng khi hiện lên thông báo với giá trí Sheet1!D2, Sheets3!D2 khác Sheet1!D2 cho nên có khả năng cho ra thông báo sai như sau:
Excel: Gia tri Log(0) = 0.3010 --> Sai.
*-* Trang 151 STT 4 Hàm IsError(expression) --> Phần Ví dụ nhầm với IsNumeric()
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cám ơn anh pmhoang đã dày công nghiên cứu và chỉ ra một số lỗi. Trong quá trình biên soạn, do thời gian và công việc cũng hơi bận nên 1 số chỗ chủ quan, chưa soát kỹ mọi trường hợp xảy ra.:-=
Mong các bạn thông cảm, hy vọng lần sau sẽ hoàn thiện, đầy đủ và ít lỗi hơn.
Tôi xin bổ sung thêm 1 số thông tin như sau:
*-* Trang 66
1.
PHP:
Sheets("Sheet1").active
--> Active sửa lại là
PHP:
Sheets("Sheet1").Activate
.
2.
PHP:
Sheets("sheet1").Range("A1:A12").Select
--> Select method of Range class failed?

Ý 2 chỉ thực hiện được khi mình đã Activate sheet1 rồi, Nhưng nếu như mà Activate sheet1 rồi thì trong câu lệnh không cần thiết phải thêm Sheets("sheet1"). mà chỉ cần Range("A1:A12").Select
=> Ý 2 không phải là 1 câu lệnh tổng quát vì khi mình dang đứng ở sheet2 mà thực hiện lệnh sẽ báo lỗi
Select method of Range class failed?

Như bạn nói là đúng, để Sheets("sheet1").Range("A1:A12").Select hoạt động thì bắt buộc Sheet1 đang được kích hoạt, nếu không sẽ báo lỗi. Một số ví dụ khác tương tự. Lệnh đầy đủ gồm 2 dòng:
Sheets("sheet1").Select
Range("A1:A12").Select

Trang 83:
Dòng thứ 2 Câu lệnh Cells(5,A).Select --> Chọn ô đơn A5 là không thực hiện được

Sửa lại cho A vào trong dấu ngoặc kép: Cells(5,"A").Select


PHP:
Range("a4").Cut	   Xóa toàn bộ A4
--> Không xóa được vì Cut mà thiếu Past thi ko thực hiện được lệnh xóa.

Cái này chỉ là mẹo thôi, nếu cut mà không dán thì coi như là xoá.

*-* Trang 95 Dòng 22 từ trên xuống
Ví dụ sau trả về đối tượng font của ô A1
PHP:
Range("A1").Font
Bị lỗi --> Invalid use of property
Vậy muốn biết Ô A1 đang dùng là Font gì làm cách nào ???

Lệnh trên trả về đối tượng Font (như trong sách), để xem các thuộc tính như Name,Size,... thì bạn chạy 2 dòng dưới đây trong cửa sổ Immediate:
?Range("A1").Font.Name
?Range("A1").Font.Size

*-* Trang 138 Dòng số 9 từ trên xuống
PHP:
Selection.PasteSpecial Paste:=xlValues, operation:=xlMultiply, SkipBlanks:=False, Transpose:=False
Code nay tai sao past lúc nào cũng cho gia trị =0 hết??? Mình cũng không hiểu được đoạn Code này???
Nhưng nếu xóa đi các phần ở sau như the này thì Past bình thường. Xin GPE chỉ giúp???

Nếu không nhầm thì đoạn code này là dán đặc biệt trong Excel 2002, Trong Excel 2003 khác đi 1 chút:
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, SkipBlanks _
:=False, Transpose:=False

*-* Trang 144 Dòng số 6 tu duoi len.
PHP:
Sub Log_in_Excel1()    
  Answer = WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
  MsgBox "Excel:Gia tri log(" & Range("D2").Value & ")= " & Answer
End Sub

Bổ sung thêm địa chỉ tham chiếu cho đúng:
Sub Log_in_Excel1()
Answer = WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
MsgBox "Excel:Gia tri log(" & Worksheets("Sheet3").Range("D2").Value & ")= " & Answer
End Sub

*-* Trang 144 Dòng số 6 tu duoi len.
PHP:
Sub Log_in_Excel1()    
  Answer = WorksheetFunction.Log(Worksheets("Sheet3").Range("D2"))
  MsgBox "Excel:Gia tri log(" & Range("D2").Value & ")= " & Answer
End Sub

*-* Trang 151 STT 4 Hàm IsError(expression) --> Phần Ví dụ nhầm với IsNumeric()

Cái này đã được đề cập rồi anh pmhoang ạ.
 
Lần chỉnh sửa cuối:
Tại VD4 trang 479 tác giả có đề cập là khi thay đổi tọa độ trong Excel thì được cập nhật ngay trong AutoCAD, nhưng trong mã code thì không có phần này do đó tác giả có thể bổ sung thêm phần này được không, tác giả có thể đưa lên DĐ hoặc mail riêng dùm : vienbp2004@yahoo.com

Đoạn code này đã có ở trang 480 rồi anh nguyenvanvien ạ.
 
pmhoang đã viết:
PHP:
Selection.PasteSpecial Paste:=xlValues, operation:=xlMultiply, _
SkipBlanks:=False, Transpose:=False
Code nay tai sao past lúc nào cũng cho gia trị =0 hết??? Mình cũng không hiểu được đoạn Code này???
Nhưng nếu xóa đi các phần ở sau như the này thì Past bình thường. Xin GPE chỉ giúp???
PHP:
Selection.PasteSpecial Paste:=xlValues

Xin giải thích: Đây là code paste với cách đặc biệt là nhân ô chọn (hoặc vùng chọn) với 1 số chứa trong 1 ô khác đã copy.
Thí dụ đầy đủ:
PHP:
Sub PasteMultiply()
Cells(1, 1).Copy
Cells(2, 1).Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlMultiply, SkipBlanks _
:=False, Transpose:=False
End Sub

Chỉ cần 1 trong 2 ô A1 hoặc A2 có giá trị 0 thì kết quả sẽ bằng zero.
Nghĩa là hễ copy 1 ô có số, paste kiểu này vào ô trống, luôn luôn bằng không. Nếu Paste vào ô có giá trị số, số cũ sẽ được nhân lên.
 
*-* Trang 188
PHP:
Function TrangThai(Doset As Single)   
  Select Case Doset
  Case Is > 1, 1   
    TrangThai = "Chay"
  Case 0.75 To 1    
    TrangThai = "Deo chay"
  Case 0.5 To 0.75
    TrangThai = "Deo mem"
  Case 0.25 To 0.5
    TrangThai = "Deo cung"
  Case 0 To 0.25
    TrangThai = "Nua cung"
  Case Is < 0
    TrangThai = "Cung"
  End Select
End Function

'Doset =1 co 2 Case thoa man "Chay" va "Deo chay" tai sao lai lay gia tri "Chay"???
Nếu ta bỏ bới, 1, sẽ thành như sau:
Giá trị Doset=1 se trả về "Deo chay" nghĩa là sao???
PHP:
 Case Is > 1
    TrangThai = "Chay"
  Case 0.75 To 1    
    TrangThai = "Deo chay"
*-* Trang 196 Ví dụ ExitStatementDemo() mỗi lầ Run là Thoát không thấy gì hết, nên khó hiểu được tác dụng gì hết. Mình đã thêm vài dòng MsgBox như sau sẽ làm người mới học hiểu rõ hơn.
PHP:
Sub Exit_StatementDemo()   
  Dim i, MyNum
  Do
    For i = 1 To 1000
      MyNum = Int(Rnd * 1000)
      Select Case MyNum
        Case 7
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit For"
          Exit For
        Case 29
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit Do"
          Exit Do
        Case 54
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit Sub"
          Exit Sub
      End Select
    Next i
  Loop
End Sub
*-* Trang 204 Dong 8 từ dưới lên.
PHP:
MsgBox "Dia chi o cuoi cung: " & Mang.Cells(Cot, Hang).Address
Sửa lại là		
MsgBox "Dia chi o cuoi cung: " & Mang.Cells(Hang, Cot).Address
*-* Trang 206
PHP:
Sub Input_Bay_Loi()  
  On Error Resume Next  
  Dim Mang As Variant
  Set Mang = Application.InputBox("Nhap vao mang: ", "Tim kiem")
  ''Se bi rong khi an nut Cancel hoac an phim Esc, khi do ban bay duoc truong hop nay.
  If IsEmpty(Mang) Then
    MsgBox "Ban khong nhap noi dung gi ca!"
  Else
    MsgBox "Chuc mung!"
  End If
End Sub
Sao lúc nào cũng cho kết quá là "Ban khong nhap noi dung gi ca!" Không biết lỗi ở đâu???
*-* Trang 221 Dòng 14 dưới lên
PHP:
Select Case Err
Err la bien o dau ra. mà nó lại có các giá trị để vào điều kiện Case ,sao ko thay dinh nghia nó???
PHP:
Sub SelectionSqr2()    
  Dim Cell As Range
  Dim ErrMsg As String
  On Error GoTo ErrorHandler
  If TypeName(Selection) <> "Range" Then Exit Sub
  For Each Cell In Selection
    Cell.Value = Sqr(Cell.Value)
  Next Cell
  Exit Sub
ErrorHandler:
  MsgBox "Err la: " & Err   'Err la bien o dau ra???
  Select Case Err
    Case 5  'So am thi bo qua
      MsgBox "So am bo qua"
      Resume Next
    Case 13 'Sai kieu so lieu nhu la chuoi bo qua
      MsgBox "Kieu text bo qua"
      Resume Next
    Case 1004 'Cells bi khoa hay Sheet bi protect
      MsgBox "Cells bi khoa roi, thu lai lan nua di!"
      Exit Sub
    Case Else
      ErrMsg = Error(Err.Number) 'Cac loi khac
      MsgBox "ERROR: " & ErrMsg
      Exit Sub
    End Select
End Sub

*-* Trang 243 Dòng 6 từ trên xuống.
Nếu bạn chọn No thì sẽ xuất hiện hộp điều khiển này. --> Sai. Sửa lại là: Chon No thi sẽ không lưu.
*-* Trang 254
PHP:
Dim Khoang_Thoi_Gian As Date
Sub CapNhatGio()
  'Cap nhat tai A1 voi gio hien tai
  ThisWorkbook.Sheets(1).Range("A1") = Time
  'Cach 1 giay thi gio cap nhat
  Khoang_Thoi_Gian = Now + TimeValue("00:00:01")
  Application.OnTime Khoang_Thoi_Gian, "CapNhatGio"
End Sub
Sub DungGio() 
  'Huy su kien OnTime (Dung gio tai o A1)
  On Error Resume Next
  Application.OnTime Khoang_Thoi_Gian, "CapNhatGio", , False
End Sub
Không hiểu tại sao DungGio() lại không có tác dụng gì cả, Thời gian vẫn nhảy bình thường???
PHP:
Sub Setup_OnKey() 
  Application.OnKey "{PgDn}", "PgDn_Sub"
  Application.OnKey "{PgUp}" "PgUp_Sub"   'Thiếu dấu ,
End Sub
Sub DgDn_Sub() 
  On Error Resume Next
  If TypeName(ActiveSheet) = "Worksheet" Then
    ActiveCell.Offset(2, 0).Acvivate
End Sub
Sub DgUp_Sub() 
  On Error Resume Next
  If TypeName(ActivaSheet) = "Worksheet" Then
    ActiveCell.Offset(-2, 0).Activate
End Sub
Setup_OnKey() thiếu dấu ,
PgDn_Sub() thiếu End If
PgUp_Sub() Thiếu End If
Và khi sửa lại lỗi thì Run Setup_OnKey() xong ra ngoai bảng tính và bấm Page_Up hay Page_Dn, cung không thấy có tác dụng gì cả???
 
Lần chỉnh sửa cuối:
*-* Trang 188
PHP:
Function TrangThai(Doset As Single)   
  Select Case Doset
  Case [COLOR="Red"]Is > 1, 1[/COLOR]   
    TrangThai = "Chay"
  Case 0.75 To 1    
    TrangThai = "Deo chay"
  Case 0.5 To 0.75
    TrangThai = "Deo mem"
  Case 0.25 To 0.5
    TrangThai = "Deo cung"
  Case 0 To 0.25
    TrangThai = "Nua cung"
  Case Is < 0
    TrangThai = "Cung"
  End Select
End Function

Cái này là tôi cố tình tạo 2 tình huống của Case (được cách bởi dấu ","), nếu không thay bằng
là đủ. Khi có sự trùng lặp giá trị (như là 1 chẳng hạn), hàm sẽ lấy giá trị đầu tiên trong vòng lặp.



Mã:
Sub Exit_StatementDemo()   
  Dim i, MyNum
  Do
    For i = 1 To 1000
      MyNum = Int(Rnd * 1000)
      Select Case MyNum
        Case 7
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit For"
          Exit For
        Case 29
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit Do"
          Exit Do
        Case 54
          MsgBox "Gia tri MyNum = " & MyNum & Chr(13) & " Exit Sub"
          Exit Sub
      End Select
    Next i
  Loop
End Sub

Cái này bạn phải chạy nhiều lần vì nó cho ra số ngẫu nhiên, khi số đúng bằng 7, 29, 54 thì sẽ có thông báo. Còn không thì tự thoát.
 
Web KT
Back
Top Bottom