Hàm lúc đúng lúc sai nhờ giải thích

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

salam

Thành viên gắn bó
Tham gia
4/11/06
Bài viết
1,945
Được thích
1,896
Giới tính
Nam
Nghề nghiệp
Accountant
Các bác cho em hỏi code sau lúc chạy đúng lúc chạy sai:

Function Sotrang()
Dim iHpBreaks As Integer, iVBreaks As Integer
Dim iTotPages As Integer
iHpBreaks = ActiveSheet.HPageBreaks.Count + 1
iVBreaks = ActiveSheet.VPageBreaks.Count + 1
iTotPages = iHpBreaks * iVBreaks
Sotrang = iTotPages
End Function
 
Tôi nghĩ ko chính xác là điều hiển nhiên do:
iTotPages = iHpBreaks * iVBreaks
Bạn tưởng tượng cũng thấy mà... Phần chiều ngang có 2 trang, phần chiều dài 2 trang, vị chi là 4 trang... nhưng trang thứ 3 ko ghi gì cã nó vẫn cứ tính là 4 (đúng ra phải là 3)... cái này do lỗi thuật toán...
Sao bạn ko dùng hàm GET.DOCUMENT(50) nhỉ? khỏi VBA luôn
Mến
ANH TUẤN
 
Upvote 0
anhtuan1066 đã viết:
Tôi nghĩ ko chính xác là điều hiển nhiên do:
iTotPages = iHpBreaks * iVBreaks
Bạn tưởng tượng cũng thấy mà... Phần chiều ngang có 2 trang, phần chiều dài 2 trang, vị chi là 4 trang... nhưng trang thứ 3 ko ghi gì cã nó vẫn cứ tính là 4 (đúng ra phải là 3)... cái này do lỗi thuật toán...
Sao bạn ko dùng hàm GET.DOCUMENT(50) nhỉ? khỏi VBA luôn
Mến
ANH TUẤN
Vậy cái này chỉ dùng cho trang dọc bảng tính còn ngang thì đúng như bác nói lỗi do trang không có số liệu những nó vẫn đếm breaks. Vậy em bỏ thằng vbreak đi nhỉ. Cái Get.document nhanh hơn thế mà em không biết (chưa xem đến nó).
Cám ơn Bác.
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm trên chạy lúc đúng lúc sai vì:
các thuộc tính ActiveSheet.HPageBreaks.Count và ActiveSheet.VPageBreaks.Count chỉ làm việc đúng khi ActiveSheet đã xem ở chế độ Page Break Preview 1 lần.
Bạn chỉnh lại code như sau:
Mã:
Option Explicit
 
Sub Sotrang1()
Dim iHpBreaks As Integer, iVBreaks As Integer
Dim iTotPages As Integer
Dim sotrang
 
'Dong lenh quan trong nhat
ActiveWindow.View = xlPageBreakPreview
 
iHpBreaks = ActiveSheet.HPageBreaks.Count + 1
iVBreaks = ActiveSheet.VPageBreaks.Count + 1
iTotPages = iHpBreaks * iVBreaks
sotrang = iTotPages
ActiveWindow.View = xlNormalView

MsgBox sotrang
End Sub
Tuy nhiên để tính được tổng số trang bằng thuật toán trên thì đôi khi kết quả vẫn bị sai (đôi khi kết quả sẽ nhiều hơn 1 trang - nếu trang cuối cùng trong lưới không có số liệu).
Bạn dùng code sau:
Mã:
Public Sub TongSoTrang()
Dim n As Integer
n = ExecuteExcel4Macro("GET.DOCUMENT(50)")
n = CInt(n)
If n = 0 Then
    MsgBox "Sheet khong co du lieu"
Else
    MsgBox "Tong so trang: " & n
End If
End Sub
 
Upvote 0
Tuy nhiên để tính được tổng số trang bằng thuật toán trên thì đôi khi kết quả vẫn bị sai (đôi khi kết quả sẽ nhiều hơn 1 trang - nếu trang cuối cùng trong lưới không có số liệu).

Đúng là có lúc nó đếm hơn 1 trang.
Cám ơn bác.
 
Upvote 0
Có thể gán vào A1, A51, A101... ví dụ mỗi trang có 50 row trang số..../tổng số trang hay là gán vào cột J số trang của trang hiện tại.
Cụ thể
A-------B----C----....J
STT----SCT--Tien---TrangSo/TongTrang
....
Xin cám ơn!
 
Upvote 0
Nếu phải đếm số trang cho cã Workbook thì dùng VBA kết hợp với GET.DOCUMENT(50) bằng cách dùng FOR quét qua từng sheet và "thu gom" số trang cũa từng sheet đó, cuối cùng cộng dồn lại... Còn như chỉ đếm số trang cũa 1 sheet thì chỉ cần Define name ST = GET.DOCUMENT(50) là đũ rồi, ko cần thêm code
ANH TUẤN
 
Upvote 0
ThuNghi đã viết:
Có thể gán vào A1, A51, A101... ví dụ mỗi trang có 50 row trang số..../tổng số trang hay là gán vào cột J số trang của trang hiện tại.
Cụ thể
A-------B----C----....J
STT----SCT--Tien---TrangSo/TongTrang
....
Xin cám ơn!
Ý Bác là lấy số dòng cuối cùng xong căm pu chia cho số dòng trên 1 trang = số trang. Cách của Bác cũng được nhưng dài quá ha mà khi em thay đổi trang in ( % in) thì lại ... hả bác chết em đó.
Cám ơn Bác.
 
Upvote 0
Đọc bài cũa ThuNghi tôi chợt nghĩ ra 1 bài toán khác: Vì GET.DOUMENT(50) chỉ có thể đếm dc số trang trong 1 sheet thôi.. Vậy có cách nào biết dc dòng thứ n cũa bãng tính đang nằm ở trang thứ mấy ko nhỉ?
 
Upvote 0
Em dùng ct thế này. Các bác xem có chính xác không, có cách nào khác không.

=GET.DOCUMENT(50)*((NOW()*0)+1)
 
Upvote 0
* Công thức thì đúng rùi - nhưng đây là sử dụng theo XL4 -> phải đặt name xong rùi mới gán công thức, tuy vậy có thể rút ngắn gọn hơn, cụ thể theo cách sau,

* Giải pháp sửa
- Đặt 1 name là SOTRANG với Refers to là:
PHP:
=GET.DOCUMENT(50)+NOW()*0
- tại ô (cell) muốn lấy số trang gõ công thức là
PHP:
=SOTRANG
thế là được
 
Upvote 0
Thế sao ko là =GET.DOCUMENT(50) +0*NOW()
Thêm số 1 vào chi cho dài
 
Upvote 0
anhtuan1066 đã viết:
Thế sao ko là =GET.DOCUMENT(50) +0*NOW()
Thêm số 1 vào chi cho dài
Quả là ngắn hơn. Tại vì em nghĩ theo toán tử * nên phải chuyển Now() ra 1.
em lại không nghĩ đến +
Vì A + 0 = A*1 mà.
Xin cám ơn Các Bác Nhé!
 
Upvote 0
Có điều các đồng chí ko nên quá máy móc, thấy cái gì cần sự cập nhật thì ném thằng em +NOW()*0 vào sẽ có ngày sa bẫy nhé... Nói chung nó chỉ thêm vào dc đối việc các công thức tính toán ra số...
Trong Excel vẫn có 1 hàm có thể làm dc điều này với mọi dạng dử liệu, đó là INDIRECT... các đồng chí cứ nghiên cứu đi
ANH TUẤN
 
Upvote 0
Web KT

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

Back
Top Bottom