Kiểm tra giúp em code không lấy được số liệu

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

boyxin

Members actively
Tham gia
10/3/08
Bài viết
1,664
Được thích
2,335
Good morning

Em có đoạn code Hide và co dãn dòng (trong file đính kèm)
Tại sheet SGK: khi thay đổi giá trị trong drop-Down List thì

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Address = "$H$1" Then
    AutoHeight
End If
End Sub
Trong đó: AutoHeight

PHP:
Option Explicit
Dim h, ir As Byte, Er As Byte, fr As Byte
Sub AutoHeight()
h = Range("A1")
fr = Range("A2")
ir = Range("A3")
If ir < 25 Then
    Er = 25
Else
    Er = Application.WorksheetFunction.RoundUp(ir / 5, 0) * 5
End If
RowHeight
End Sub
'-----------------------------------------------------------
Sub RowHeight()
    If Er = 40 Then
        Rows(fr & ":" & fr + Er - 1).RowHeight = 40 * h / Er
    Else
        Rows(fr & ":" & fr + Er - 1).RowHeight = 40 * h / Er
        Rows(fr + Er & ":" & fr + 39).EntireRow.Hidden = True
    End If
MsgBox "Can chinh trang in da xong!", , "THONG BAO"
End Sub
không lấy được giá trị của các biến (h, fr, ir) nên code chạy nhưng không có tác dụng
Nhưng khi nhấn Alt+F8 để chạy AutoHeight thì các biến (h, fr, ir) được cập nhật và tính năng hide, co giãn dòng có hiệu ứng ngay (không hiểu vì sao???)

Mục đích của em là sau khi chọn danh sách lớp, căn cứ vào số HS để hide bớt dòng thừa, co giãn những dòng còn lại cho vừa 1 trang in

Em không xử lý được vụ này. Mong được các bác giúp đỡ
 

File đính kèm

Lần chỉnh sửa cuối:
Good morning
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$H$1" Then    AutoHeight
End Sub

PHP:
Option Explicit
Dim h, ir As Byte, Er As Byte, fr As Byte
Sub AutoHeight()
h = Range("A1")
fr = Range("A2")
ir = Range("A3")
If ir < 25 Then
    Er = 25
Else
    Er = Application.WorksheetFunction.RoundUp(ir / 5, 0) * 5
End If
RowHeight:   End Sub

không lấy được giá trị của các biến (h, fr, ir)
Nhưng khi nhấn Alt+F8 để chạy AutoHeight thì lại các biến (h, fr, ir) được cập nhật ngay (không hiểu vì sao???)
Bạn thử lần lượt các biện pháp sau, xem sao:
* Thay vì Dim =>> Public
* Chép toàn bộ module 2 sang module 1
* Áp dụng cả 2 phương án trên
Do mình nghỉ VBA chưa thấy cái nó cần lấy ở đâu hết i!
(Đoán vậy, do không biết chúng biến đổi thế nào sau mỗi lần macro chạy! Nếu sai xin lỗi nha!)
 
Upvote 0
Mục đích của em là sau khi chọn danh sách lớp, căn cứ vào số HS để hide bớt dòng thừa, co giãn những dòng còn lại cho vừa 1 trang in
.
Khi em gọi AutoHeight từ drop-Down List thì code chạy nhưng không lấy được giá trị của các biến (h, fr, ir) nên code chạy nhưng không có tác dụng
.
Nhưng khi nhấn Alt+F8 để chạy AutoHeight thì các biến (h, fr, ir) được cập nhật và tính năng hide, co giãn dòng có hiệu ứng ngay (không hiểu vì sao???)
.
Em không xử lý được vụ này. Mong được các bác giúp đỡ (File đính kèm ở bài #1)
 
Lần chỉnh sửa cuối:
Upvote 0
Code vẫn chạy bình thường mà Boyxin? cân chỉnh đàng hoàng.
Tuy nhiên Sub RowHeight() dư cái if. vì If hay else thì 2 dòng lệnh giống nhau?
Riêng câu ẩn dòng thì cứ ẩn dù số dòng là bao nhiêu, chỉ chừa 1 dòng trắng còn bao nhiêu ẩn hết. Nghĩa là dùng ir, không dùng Er. Cái này cũng chỉ là định dạng trang in thôi.
PHP:
Sub RowHeight()
        Rows(fr & ":" & fr + Er - 1).RowHeight = 40 * h / Er
        Rows(fr + ir + 1 & ":" & fr + 39).EntireRow.Hidden = True
MsgBox "Can chinh trang in da xong!", , "THONG BAO"
End Sub
 
Upvote 0
Theo mình nguyên nhân của tình trạng trên là do sự thay đổi trên sheet không theo kịp với tốc độ của code:
-Khi bạn gọi từ drop-Down List, bảng tính sẽ tính toán lại theo các hàm có sẵn với một thời gian nhất định. Biến ir tại A3 chưa kịp thay đổi thì sub AutoHeight đã được thực hiện với giá trị cũ của ir.
-Khi bạn gọi trực tiếp sub AutoHeight. Giá trị của ir đã được tính toán nên thủ tục chạy với giá trị ir mới.
Bạn có thể căn cứ vào đó mà chỉnh code.
 
Upvote 0
Mình cũng còn 1 nhận xét nữa:
h luôn bằng 12,5
fr luôn bằng 4
vậy khai báo const, đừng khai báo biến.

Còn ir thì tính trong code, như vậy tránh được lỗi như thầy Voda nêu. Bỏ được 3 cell phụ.
Mình thử sao đó nên thấy nó chạy, chắc là thử với nhiều dạng tăng giảm hơn mới thấy.
 
Upvote 0
Mình cũng còn 1 nhận xét nữa:
h luôn bằng 12,5
fr luôn bằng 4
vậy khai báo const, đừng khai báo biến.

Còn ir thì tính trong code, như vậy tránh được lỗi như thầy Voda nêu. Bỏ được 3 cell phụ.

Mình thử sao đó nên thấy nó chạy, chắc là thử với nhiều dạng tăng giảm hơn mới thấy.

cái AutoHeight là để dùng chung trong file, để căn chỉnh trang in của nhiều sheet khác nhau,
(không phải sheet nào cũng có h = 12.5, fr = 4)

Dùng Er thay cho ir là muốn khung trên danh sách in ra là số chia hết cho 5 (5 dòng đã được nhóm thành 1 nhóm) => không có IF thì khi er = 40 nó sẽ hide mất dòng cuối
Em chưa hình dung tính ir bằng code thế nào khi danh sách hs được lấy bằng công thức, các cell đều có dữ liệu chỉ khác lúc là khoảng trắng, lúc là tên HS ...

@ Bác Voda: ir (số HS của lớp) em không bắt công thức tính, em thử nhập sẵn mà cũng không dược
 
Upvote 0
Trường hợp này thật phức tạp. Bạn thử xóa module1 xem kết quả thế nào.
 
Upvote 0
Trường hợp này thật phức tạp. Bạn thử xóa module1 xem kết quả thế nào.

hiiiiiiiiiii
xóa module đọc số thì ngon lành
Tìm mãi không thấy chúng xung khắc với nhau chỗ nào

Remove và lưu dạng file bas sau đó add lại thì lại được, save and close rồi open lại thì không được. Nhờ các bác giải thích giúp tại sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Code gốc như vầy:
PHP:
Sub RowHeight()
    If Er = 40 Then
        Rows(fr & ":" & fr + Er - 1).RowHeight = 40 * h / Er
    Else
        Rows(fr & ":" & fr + Er - 1).RowHeight = 40 * h / Er
        Rows(fr + Er & ":" & fr + 39).EntireRow.Hidden = True
    End If
MsgBox "Can chinh trang in da xong!", , "THONG BAO"
End Sub
Rõ ràng là Er dù bằng bao nhiêu cũng thực hiện cùng 1 câu lệnh gán rowheight. Còn câu lệnh ẩn dòng đúng là cần thiết nhưng chưa hoàn chỉnh:
- Khi Ir = Er nghĩa là Ir chia hết cho 5, nó chẳng chừa dòng trắng nào.
- Khi Ir = 21 -> 25, 40*h/Er lại lớn, vượt 1 trang in. Vì hiện đủ 25 dòng lớn.

Tìm mãi không thấy chúng xung khắc với nhau chỗ nào
Mình thử lại thấy vẫn chạy tốt theo code gốc. Lạ nhỉ?
 
Upvote 0
Code gốc như vầy:
PHP:
Sub RowHeight()
    If Er = 40 Then
        Rows(fr & &quot;:&quot; & fr + Er - 1).RowHeight = 40 * h / Er
    Else
        Rows(fr & &quot;:&quot; & fr + Er - 1).RowHeight = 40 * h / Er
        Rows(fr + Er & &quot;:&quot; & fr + 39).EntireRow.Hidden = True
    End If
MsgBox &quot;Can chinh trang in da xong!&quot;, , &quot;THONG BAO&quot;
End Sub
Rõ ràng là Er dù bằng bao nhiêu cũng thực hiện cùng 1 câu lệnh gán rowheight. Còn câu lệnh ẩn dòng đúng là cần thiết nhưng chưa hoàn chỉnh:
- Khi Ir = Er nghĩa là Ir chia hết cho 5, nó chẳng chừa dòng trắng nào.
- Khi Ir = 21 -> 25, 40*h/Er lại lớn, vượt 1 trang in. Vì hiện đủ 25 dòng lớn.


Mình thử lại thấy vẫn chạy tốt theo code gốc. Lạ nhỉ?

Er của em chỉ nhỏ hơn hoặc bằng 40 thôi, Data của em nó như vậy nên làm Er như vậy cho gọn
Remove và lưu dạng file bas sau đó add lại thì lại được, save and close rồi open lại thì không được. Nhờ các bác giải thích giúp tại sao? (không biết có phải tại máy của em hay là Office bị lỗi - sẽ kiểm tra tiếp)
 
Lần chỉnh sửa cuối:
Upvote 0
Em phát hiện ra nguyên nhân
1- Nhập 2 Module vào thành 1 thì code không chạy được và báo lỗi
2- Xóa cell E23 và K15 chứa công thức đọc số thành chữ ở sheet HoaDon thì code cũng chạy ngon lành

Em sẽ xem lại sheet HoaDon Nhờ các bác xem giúp 2 Module xung khắc chỗ nào, khắc phục giúp em
 
Lần chỉnh sửa cuối:
Upvote 0
Khi ta xóa module1 chứa hàm DocUni hoặc xóa các ô chứa hàm DocUni trên tất cả sheet, code đều chạy ngon lành. Điều đó có thể kết luận sub AutoHeight và hàm DocUni có sự xung đột. Vì code chạy rất trừu tượng nên chỉ có thể dựa vào suy luận để xác định chỗ xung đột:
-Khi ta kích hoạt sự kiện Worksheet_Change, dữ liệu trong các sheets cập nhật. Hàm DocUni tự động tính toán lại bằng chạy code trong hàm. Cùng lúc đó, sub AutoHeight cũng chạy. Hai code tranh nhau chạy nên gây lỗi.
-Khi ta chỉ kích hoạt sub AutoHeight, các sheets chứa hàm DocUni đã cập nhật trước đó rồi, chỉ có 1 code chạy nên không gây ra lỗi.
Cách khắc phục: Không dùng hàm DocUni trên sheet mà viết luôn vào code.
 
Upvote 0
Khi ta xóa module1 chứa hàm DocUni hoặc xóa các ô chứa hàm DocUni trên tất cả sheet, code đều chạy ngon lành. Điều đó có thể kết luận sub AutoHeight và hàm DocUni có sự xung đột. Vì code chạy rất trừu tượng nên chỉ có thể dựa vào suy luận để xác định chỗ xung đột:
-Khi ta kích hoạt sự kiện Worksheet_Change, dữ liệu trong các sheets cập nhật. Hàm DocUni tự động tính toán lại bằng chạy code trong hàm. Cùng lúc đó, sub AutoHeight cũng chạy. Hai code tranh nhau chạy nên gây lỗi.
-Khi ta chỉ kích hoạt sub AutoHeight, các sheets chứa hàm DocUni đã cập nhật trước đó rồi, chỉ có 1 code chạy nên không gây ra lỗi.
Cách khắc phục: Không dùng hàm DocUni trên sheet mà viết luôn vào code.

Chỉ xóa cell E23 và K15 chứa công thức đọc số thành chữ ở sheet HoaDon, vẫn để hàm DocUni ở E26 & E28, vẫn để hàm DocUni ở sheet Dky_HocThem B56 & B58 thì code AutoHeight vẫn chạy ngon lành
 
Upvote 0
Web KT

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

Back
Top Bottom