HỎI VỀ HIỆN Msgbox KHI CODE KHÔNG HOẠT ĐỘNG?? (1 người xem)

  • Thread starter Thread starter nad582
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

nad582

Thành viên thường trực
Tham gia
7/6/11
Bài viết
317
Được thích
48
Chào các a(c) trong GPE, e có đoạn code sau:

mySQL = "SELECT T3.[Frame],round(T4.[Length]*1,2) " & _
"FROM [Element Forces - Frames] T3,[Connectivity - Frame]T4 " & _
"Where T3.[Frame] = T4.[Frame] and left(T3.[Frame],1) like 'D'"
lrs.Open mySQL, cnn, 3, 1
With Sheet2
.[A6].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing

nội dung code là copy dữ liệu từ file Access vào file Excel, e có vấn đề thế này:
tại chỗ tô màu nếu như dữ liệu ở trường T3.[Frame] ký tự đầu tiên là chữ D thì khi thực hiện code hoạt động bình thường, nhưng nếu dữ liệu ở trường T3.[Frame] không có ký tự đầu tiên là chữ D thì code trên không có tín hiệu (không hoạt động)
Vậy nhơ các a(c) viết code nếu như dữ liệu ở trường T3.[Frame] không có ký tự đầu tiên là chữ D thì hiện thông báo Msgbox "không copy thành công"...
Chân thành cám ơn..........

 
Lần chỉnh sửa cuối:
- Thứ 1: không phải Code không hoạt động, Code có hoạt động đúng với truy vấn, tại không có dữ liệu thỏa mãn nên không có giá trị trả về
- Thứ 2: Bạn có thể bắt lỗi bằng cách thủ công như sau
Mã:
    If Range("A65536").End(3).Row < 6  Then MsgBox "Khong thanh cong"
 
Upvote 0
Lần sau có hỏi về ADO recordset thì mần ơn cho code đày đủ kể cả phần kết nối. Không có phân fkeets nối làm sao biết bạn có dùng loại con trỏ adOpenStatic hay không?

Nếu có adOpenStatic thì chỉ cần xét recordset.Count là biết nó có bao nhiêu records. (nếu adOpenDynamic thì Count trả về luôn là -1, không thể dùng để xét được)

Nếu không có thì phải xét cả recordset.BOF và recordset.EOF, nếu cả 2 đều True thì là recordset rỗng.
 
Upvote 0
- Thứ 1: không phải Code không hoạt động, Code có hoạt động đúng với truy vấn, tại không có dữ liệu thỏa mãn nên không có giá trị trả về
- Thứ 2: Bạn có thể bắt lỗi bằng cách thủ công như sau

If Range("A65536").End(3).Row < 6 Then MsgBox "Khong thanh cong"
e thực hiện ok, nhưng anh có thể giải tích 1 chút về ý này giúp e ko?
cảm ơn..!!
 
Upvote 0
e thực hiện ok, nhưng anh có thể giải tích 1 chút về ý này giúp e ko?
cảm ơn..!!
Làm như bác VetMini gợi ý là tốt nhất, nhằm tránh tình trạng để code thực thi hết phần còn lại. Còn nếu muốn thủ công thì chỉ cần nếu .[A6]="" thì báo không có hàng nào được copy, cần chi phải xác định dài dòng thế nhỉ?
 
Upvote 0
Làm như bác VetMini gợi ý là tốt nhất, nhằm tránh tình trạng để code thực thi hết phần còn lại. Còn nếu muốn thủ công thì chỉ cần nếu .[A6]="" thì báo không có hàng nào được copy, cần chi phải xác định dài dòng thế nhỉ?
Trong Code của bạn ấy không có dòng lệnh nào là xóa dữ liệu tại .[Â] anh ah.

Mà đọc các bài viết của bạn ấy thì vẫn hướng cho bạn cách xử lý trên sheet hơn là ADO, làm quen dần dần sẽ tốt hơn là chạy nước rút.
 
Upvote 0
Trong Code của bạn ấy không có dòng lệnh nào là xóa dữ liệu tại .[Â] anh ah.

Mà đọc các bài viết của bạn ấy thì vẫn hướng cho bạn cách xử lý trên sheet hơn là ADO, làm quen dần dần sẽ tốt hơn là chạy nước rút.
Ủa, nếu không xóa thì dùng code của bạn biết được là <6 hay sao ta? +-+-+-+
 
Upvote 0
Ủa, nếu không xóa thì dùng code của bạn biết được là <6 hay sao ta? +-+-+-+

Biết. Bởi anh phải đọc những bài bạn ấy đã hỏi thì rõ gốc gác cái bài #1 là như thế nào. bố trí kiểu dữ liệu như thế nào. Mà nếu nhìn Code có thể thấy nếu Record có dữ liệu thì chắc chắn sẽ copy vào A6 => [A65536].End(3) chắc chắn >=6. còn khi record không có dữ liệu thì chắc chắn sẽ nhỏ hơn 6. với ADO thì sẽ Copy cả bảng nên cái này em chắc.
 
Upvote 0
Biết. Bởi anh phải đọc những bài bạn ấy đã hỏi thì rõ gốc gác cái bài #1 là như thế nào. bố trí kiểu dữ liệu như thế nào. Mà nếu nhìn Code có thể thấy nếu Record có dữ liệu thì chắc chắn sẽ copy vào A6 => [A65536].End(3) chắc chắn >=6. còn khi record không có dữ liệu thì chắc chắn sẽ nhỏ hơn 6. với ADO thì sẽ Copy cả bảng nên cái này em chắc.
Vậy chỉ cần điểm đầu tiên thôi chứ mắc gì tính luôn cả cột chi vậy? |||||
 
Upvote 0
Trong Code của bạn ấy không có dòng lệnh nào là xóa dữ liệu tại .[Â] anh ah.

Mà đọc các bài viết của bạn ấy thì vẫn hướng cho bạn cách xử lý trên sheet hơn là ADO, làm quen dần dần sẽ tốt hơn là chạy nước rút.
e bổ sung thêm: trong code có đoạn xóa dòng luôn anh ak:
HTML:
' xoa dong
            Range("6:65000").Delete Shift:=xlUp

mySQL = "SELECT T3.[Frame],round(T4.[Length]*1,2) " & _
"FROM [Element Forces - Frames] T3,[Connectivity - Frame]T4 " & _
"Where T3.[Frame] = T4.[Frame] and left(T3.[Frame],1) like 'D'"
lrs.Open mySQL, cnn, 3, 1
With Sheet2
.[A6].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
(ghi chú vì file Access dữ liệu trong đó nhiều, nặng quá nên e ko tiện đưa lên)
làm theo cách thủ công cũng được anh ak....
Nếu như làm theo cách này [nếu .[A6]="" thì báo không có hàng nào được copy] thì với ý 1 là nó copy được dữ từ file Access thì nó vẫn hiện lên Msgbox rồi!!
vậy a giúp e xử lý khi bổ sung thêm lệnh xóa dòng!! cảm ơn
 
Upvote 0
e bổ sung thêm: trong code có đoạn xóa dòng luôn anh ak:
HTML:
' xoa dong
            Range("6:65000").Delete Shift:=xlUp

mySQL = "SELECT T3.[Frame],round(T4.[Length]*1,2) " & _
"FROM [Element Forces - Frames] T3,[Connectivity - Frame]T4 " & _
"Where T3.[Frame] = T4.[Frame] and left(T3.[Frame],1) like 'D'"
lrs.Open mySQL, cnn, 3, 1
With Sheet2
.[A6].CopyFromRecordset lrs
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing
(ghi chú vì file Access dữ liệu trong đó nhiều, nặng quá nên e ko tiện đưa lên)
làm theo cách thủ công cũng được anh ak....
Nếu như làm theo cách này [nếu .[A6]="" thì báo không có hàng nào được copy] thì với ý 1 là nó copy được dữ từ file Access thì nó vẫn hiện lên Msgbox rồi!!
vậy a giúp e xử lý khi bổ sung thêm lệnh xóa dòng!! cảm ơn


Thì bạn thử làm theo cách của VetMini:

Nếu không có thì phải xét cả recordset.BOF và recordset.EOF, nếu cả 2 đều True thì là recordset rỗng.
 
Upvote 0
e không rành về ADOB nên.....không làm được!!
vậy e có công thức này
HTML:
=COUNTA(A:A)
nếu COUNTA(A:A) <5 then hiện Msgbox "không thành công" không thì Msg "thành công"
a giúp e chuyển nó thành code!! cảm ơn
 
Upvote 0
e không rành về ADOB nên.....không làm được!!
vậy e có công thức này
HTML:
=COUNTA(A:A)
nếu COUNTA(A:A) <5 then hiện Msgbox "không thành công" không thì Msg "thành công"
a giúp e chuyển nó thành code!! cảm ơn

Bạn thử đại loại nó như vầy nè:

Mã:
    mySQL = "SELECT T3.[Frame],round(T4.[Length]*1,2) " & _
            "FROM [Element Forces - Frames] T3,[Connectivity - Frame]T4 " & _
            "Where T3.[Frame] = T4.[Frame] and left(T3.[Frame],1) like 'D'"
    
    lrs.Open mySQL, cnn, 3, 1
    
    [B][COLOR=#0000cd]If lrs.BOF And lrs.EOF Then[/COLOR][/B]
        MsgBox "Not any record copied!"
    Else
        With Sheet2
[COLOR=#ff0000]            .Range("6:65536").Clear[/COLOR]
            .[A6].CopyFromRecordset lrs
        End With
    End If

    lrs.Close: Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
 
Lần chỉnh sửa cuối:
Upvote 0
Mệnh đề "CODE KHÔNG HOẠT ĐỘNG" của bạn nằm trong bối cảnh nào?
Nếu "không hoạt động" có nghĩa là không ghi được một dữ liêu cụ thể thì giải pháp xét ô chép vào là đúng.
Nhưng nếu "không hoạt động" có nghĩa là không tìm thấy cái cần tìm thì giải pháp xét số records trong recordset mới đúng.

tb. Điều kiện lọc của câu lệnh SQL của bạn không hẳn là đúng lắm. Bạn chỉ cần so một ký tự, không cần phải dùng LIKE. So sánh thnagwr nhanh hơn
LEFT(T3.[Frame],1) = 'D'
Nếu muốn dùng LIKE thì
T3.[Frame] Like 'D*'
Người ta chỉ LIKE khi muốn so với một ký tự không nhất định. Ví dụ chọn D, hoặc H, hoặc M
LEFT(T3.[Frame],1) Like '[DHM]'; --- để ý dấu ngoặc vuông
 
Upvote 0
em nghĩ nó rơi vào trường hợp này,
\
Nhưng nếu "không hoạt động" có nghĩa là không tìm thấy cái cần tìm thì giải pháp xét số records trong recordset mới đúng.
giống như bạn dhn46 đã nói ở bài #2
\
So sánh thnagwr nhanh hơn
LEFT(T3.[Frame],1) = 'D'
Nếu muốn dùng LIKE thì
T3.[Frame] Like 'D*'
Người ta chỉ LIKE khi muốn so với một ký tự không nhất định. Ví dụ chọn D, hoặc H, hoặc M
LEFT(T3.[Frame],1) Like '[DHM]'.
Như vậy nếu như chỉ so sánh 1 ký tự thì dùng LEFT(T3.[Frame],1) = 'D'
Nếu dùng like thì thêm dấu * vào thế này T3.[Frame] Like 'D*'
Nếu xét ký tự đầu mà có thể xuất hiện nhiều ký tự Ví dụ chọn D, hoặc H, hoặc M thì dùng LEFT(T3.[Frame],1) Like '[DHM]'
thì ra có nhiều khác biệt đến như vậy...!!
 
Upvote 0

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

Back
Top Bottom