On Error GoTo bị lỗi

Liên hệ QC

cantl

!!! Giải thoát !!!
Tham gia
6/8/08
Bài viết
1,805
Được thích
1,153
Giới tính
Nam
Các bác ạ,
Em đố các bác tại sao code này sau khi tô màu đáp ứng đủ các điều kiện có cả 3 loại ô:
- chứa công thức.
- chứa hằng số.
- rỗng
vậy mà chạy xong vẫn nhảy vào đoạn LOI.
_)(#;_)(#;_)(#;
Mã:
Option Explicit
Sub CuocSongMuonMau()
    On Error GoTo LOI
    Dim rng As Range
    Set rng = Application.InputBox( _
              Title:="Range", _
              Prompt:="Select Range", _
              Default:=Selection.Address, _
              Type:=8)
    rng.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 0
    rng.SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 35
    rng.SpecialCells(xlCellTypeFormulas).Font.Color = vbRed
    MsgBox "To xong het roi"
LOI:
    MsgBox "Khong co o trong hoac o chua cong thuc"
    Exit Sub
End Sub

Sub CuocSongMauDen()
    Dim rng As Range
    Set rng = Application.InputBox( _
              Title:="Range", _
              Prompt:="Select Range", _
              Default:=Selection.Address, _
              Type:=8)
    rng.Interior.ColorIndex = 0
    rng.Font.ColorIndex = 0
End Sub
 

File đính kèm

  • 1687946883666.png
    1687946883666.png
    186.7 KB · Đọc: 6
  • CuocSongMuonMau.xlsm
    19.8 KB · Đọc: 3
. . . .
Có điều nếu range chọn mà chỉ có 1 ô thì code sẽ tự mở rộng ra usedrange rồi tô màu cả vùng rộng ấy, thế thì không đúng với mong muốn tô màu để phân biệt 3 loại dữ liệu trong vùng được quét chọn. . . . . . . . . . . .
Vậy thì sau dòng lệnh
Mã:
 Set Rng = Application.InputBox(Title:="Range", _
    Prompt:="Select Range", Default:=Selection.Address, Type:=8)
Ta ra điều kiện:
PHP:
 If Rng.Cells.Count = 1 Then
    Selection.Interior.ColorIndex = 38
    Resume Err_
 End If
4 Rng.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 0
' . . . .   '  '
 
Upvote 0
Vậy thì sau dòng lệnh
Mã:
 Set Rng = Application.InputBox(Title:="Range", _
    Prompt:="Select Range", Default:=Selection.Address, Type:=8)
Ta ra điều kiện:
PHP:
 If Rng.Cells.Count = 1 Then
    Selection.Interior.ColorIndex = 38
    Resume Err_
 End If
4 Rng.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 0
' . . . .   '  '
Cũng chưa đúng ý em lắm, em muốn nó gặp ô có dữ liệu kiểu nào thì tô đúng theo 1 trong 3 màu quy định từ đầu. Để em ghép thêm đoạn case select vào cũng được bác ạ. Chỉ có điều nó bị cà lăm activecell nhiều lần thôi.
Có đoạn Error() với Err là code đa năng hơn rồi bác ạ.
_)(#; _)(#; _)(#;
 
Upvote 0
Tại sao không phải là Default:=ActiveCell.Address?
 
Upvote 0
Vậy thì không lỗi nọ sẽ lỗi kia phải rồi.
- Nếu quét vùng trước, không cần Inputbox
- Nếu inputbox, bắt lỗi người dùng bỏ trống (cancel), không quét vùng. Nếu bẫy lỗi bằng cách lấy default, thì default 1 ô thôi.
 
Upvote 0
Vậy thì không lỗi nọ sẽ lỗi kia phải rồi.
- Nếu quét vùng trước, không cần Inputbox
- Nếu inputbox, bắt lỗi người dùng bỏ trống (cancel), không quét vùng. Nếu bẫy lỗi bằng cách lấy default, thì default 1 ô thôi.
Vâng, em đã thêm đoạn bẫy lỗi vào, thay vì tưởng tượng hết các lỗi thì cho gặp lỗi, thông báo, rồi sẽ sửa tiếp bác ạ.
 
Upvote 0
Vâng, em đã thêm đoạn bẫy lỗi vào, thay vì tưởng tượng hết các lỗi thì cho gặp lỗi, thông báo, rồi sẽ sửa tiếp bác ạ.
Làm theo bài trên thì lỗi ít (duy nhất 1) hoặc không lỗi. Làm mà cứ loay hoay tưởng tượng thì càng làm càng đẻ ra lỗi. Đặc biệt là tưởng tượng khác thường.
 
Upvote 0
Vâng, em đã thêm đoạn bẫy lỗi vào, thay vì tưởng tượng hết các lỗi thì cho gặp lỗi, thông báo, rồi sẽ sửa tiếp bác ạ.
Bẫy lỗi không phải tưởng tượng nhé bạn mà là phán đoán trước và thao tác thử như là một người không rành về bảng tính để xem các lỗi gì có thể xảy ra. Sau khi phán đoán hết các khả năng có thể xảy ra trong phạm vi của mình rồi thì mới theo dõi thêm câc phát sinh khi thực tế sử dụng ở các máy tính khác.
 
Upvote 0
Cảm ơn các bác đã gợi ý.

Em vẫn ưa thích dùng default là vùng chọn hơn, hiện bảng ra enter là xong. Nếu có lỗi thì em lại chèn thêm vài dòng thoát cũng được, biết đâu sau có khả năng viết được đoạn dài hơn thì chỉ việc copy sang.

Em không theo bài bản nên thường là cứ ghép từng đoạn lại, miễn nó chạy được thì thôi. Nhiều khi code thừa, hoặc lặp cấu trúc. Cứ như thế nên khả năng phán đoán lỗi kém, trừ khi đã gặp rồi thì may ra nhớ. VD như SpecialCells không dùng được cho 1 cell, có thể bỏ qua lỗi bằng cách quét 2 cell cạnh nhau.

Không theo bài bản cũng có ưu điểm là thực tế mà bị dính 1, 2 lần sẽ nhớ lâu hơn. VD trước có bài hỏi sao copy qua lại các file mà code không dùng được, sau mấy ngày vọc vạch mới biết thiếu thư viện, thế là nhớ được mấy cái FSO cần có thư viện.

Những cái này thiên về kinh nghiệm hơn là lý thuyết, thôi thì không viết được phần mềm nên chỉ cần cơ bản thế tạm chấp nhận các bác ạ.
 
Upvote 0
Sau khi kết hợp code bác SA, em chốt ra đoạn code theo đúng ý mình thế này.
Mã:
Sub CuocSongMuonMau()
    On Error GoTo LOI
    Dim Rng As Range: Dim Msg_ As String: Dim tmr As Long
    Set Rng = Application.InputBox( _
              Title:="Range", _
              Prompt:="Select Range", _
              Default:=Selection.Address, _
              Type:=8)
    tmr = Timer
    If Rng.Address = "" Then Exit Sub
    If Rng.Count > 1 Then
4       Rng.SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 0
5       Rng.SpecialCells(xlCellTypeBlanks).Interior.ColorIndex = 35
6       Rng.SpecialCells(xlCellTypeFormulas).Font.Color = vbRed
    Else
        Select Case True
        Case IsEmpty(ActiveCell)
            ActiveCell.Interior.ColorIndex = 35
        Case ActiveCell.HasFormula
            ActiveCell.Font.Color = vbRed
        Case Else
            ActiveCell.Interior.ColorIndex = 0
        End Select
    End If
    MsgBox Timer - tmr & " giây"
    Exit Sub
LOI:
    Select Case Err
    Case 424
        MsgBox Error(), , Err
    Case 1004
        If Erl = 5 Then
            Msg_ = "TRONG."
        ElseIf Erl = 6 Then
            Msg_ = "CHUA CONG THUC."
        End If
        MsgBox "Không có ô " & Msg_, , Erl
        Resume Next
    Case Else
        MsgBox Err, , Erl
    End Select
    Exit Sub
End Sub
Bác nào có code mà đáp ứng yêu cầu dưới, tránh lặp từ như em thì viết giúp để em nghiên cứu học hỏi về cách đặt vấn đề và xử lý tình huống với ạ:
- tô màu 3 loại dữ liệu (hằng, công thức, rỗng) để phân biệt.
- nếu vùng chọn thiếu 1 trong 3 loại dữ liệu thì vẫn không bị lỗi.
- nếu lúc chọn range mà cancel thì thoát sub.
- nếu lỡ chọn 1 ô thì vẫn xét và tô màu chứ không bị lỗi SpecialCells.
 
Upvote 0
Đến đây thành xin code.
Vậy thì mình đăng bài mới xin code đi. Nhớ viết thành khẩn vào.
 
Upvote 0
Web KT

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

Back
Top Bottom