điền Số Trang Vào Cell

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

TKT

Thành viên tiêu biểu
Tham gia
2/1/08
Bài viết
673
Được thích
1,336
Nghề nghiệp
.....
Nhờ các anh chị giúp mình điền số trang vào cell, hay có link về nó chỉ mình ghen. Cám ơn nhiều (CÔNG THỨC HOẶC VBA)
 

File đính kèm

Lần chỉnh sửa cuối:
Thực sự chưa hiểu ý của Trí cho lắm. Nói rõ hơn được không?
 
Có nghĩa là khi anh in ra từ STT 1 đến STT 45 nó nằm ở trang 1. Thì từ C3:C45 điền số 1. Stt 46 đến Stt 92 nằm ở trang 2 khi đó từ C46:C94 điền số 2.... Không biết yêu cầu của em có giải quyết được bằng EXCEL không. Em tính dùng nó trong file Nhật ký chung ấy mà. Cột Trang số.
 
Lần chỉnh sửa cuối:
Có nghĩa là khi anh in ra từ STT 1 đến STT 45 nó nằm ở trang 1. Thì từ C3:C45 điền số 1. Stt 46 đến Stt 92 nằm ở trang 2 khi đó từ C46:C94 điền số 2.... Không biết yêu cầu của em có giải quyết được bằng EXCEL không. Em tính dủm nó trong file Nhật ký chung ấy mà. Cột Trang số.
- Bạn đưa dữ liệu thật nếu có thể !
- Cách giải thích của bạn ko thể có một phương án cụ thể nào cho dữ liệu của bạn.
 
Sheet Nhat ky chung, nhờ bạn xem qua, dữ liệu mình đã bỏ bớt.
 

File đính kèm

Lần chỉnh sửa cuối:
Có giải pháp rùi đây VBA nhé

Nhờ các anh chị giúp mình điền số trang vào cell, hay có link về nó chỉ mình ghen. Cám ơn nhiều (CÔNG THỨC HOẶC VBA)

Có giải pháp rùi đây VBA nhé
down file gửi kèm (bấm Alt+F11 để xem CODE)

Cách dùng:
Để con trỏ vào ô bắt đầu điền số trang - (chẳng hạn C3) rùi bấm Ctrl+e để chạy


Chúc thành công

Tìm hiểu về CODE
PHP:
Option Explicit

Public Sub pagenumbers()
Application.ScreenUpdating = False
Dim MyR As Range
Dim PageNumber As Long, eR As Long, i As Long
Dim Mysheet As Worksheet
eR = [A65536].End(xlUp)
Set Mysheet = ActiveSheet
PageNumber = 1
Set MyR = ActiveCell ' Range("E1") ' starting cell
For i = 1 To eR
If MyR.EntireRow.PageBreak = xlPageBreakAutomatic _
    Or MyR.EntireRow.PageBreak = xlPageBreakManual Then PageNumber = PageNumber + 1
MyR.Value = PageNumber
Set MyR = MyR.Offset(1, 0) ' move down
Next i
End Sub

Chú ý: đoạn eR = [A65536].End(xlUp) bạn thay đổi vào cột (B,C,.. vv) sao cho cột này là có chứa DL dài nhất cần đánh tt trang


* cách nữa có thể dùng công thức vơi hàm GET trong xlsmacro4 -> nhưng tôi chưa làm được
mong các TV khác cho ý kiến
.


 

File đính kèm

Lần chỉnh sửa cuối:
Sheet Nhat ky chung, nhờ bạn xem qua, dữ liệu mình đã bỏ bớt.
Code này gắn số trang vào cột D và dòng bắt đầu là 3, cái này có thể chỉnh lại.
Chỉ đúng khi trang in là 1 trang chiều wide và n trang chiều tall.
Tạm lấy cột F trung gian, rút gọn lại sau
Em xem code thử.
PHP:
Sub GanSoTrang()
    Application.ScreenUpdating = False
    'Chi dung khi co 1 trang wide va n trang tall
    Sheets("sheet1").Select
    Range("F1:F100").ClearContents
    Range("E3:E1000").ClearContents
    ActiveWindow.View = xlPageBreakPreview
    Dim nBreaks As Integer, i As Integer, j As Integer, SoDong As Integer, DongDau As Integer, endR As Integer
    nBreaks = ActiveSheet.HPageBreaks.Count
    DongDau = 1
    endR = Range("A65000").End(xlUp).Row
    Cells(1, 6) = 2 'Dong dau gan so trang
    For i = 1 To nBreaks
        Cells(i + 1, 6) = ActiveSheet.HPageBreaks(i).Location.Row - 1
        SoDong = Cells(i + 1, 6)
        DongDau = Cells(i, 6)
        Range(Cells(DongDau + 1, 5), Cells(SoDong, 5)).Value = i
    Next i
    'Gan so trang cuoi
    SoDong = endR
    DongDau = Cells(i, 6)
    Range(Cells(DongDau + 1, 5), Cells(SoDong, 5)).Value = i
    Range("F1:F100").ClearContents
    ActiveWindow.View = xlNormalView
    Application.ScreenUpdating = True
End Sub
 
Rút gọn code trên như sau, với lại NKC có nhất thiết phải lấy theo trang, lấy theo STT cũng OK mà.
Mã:
Option Explicit
Sub GanSoTrang()
Application.ScreenUpdating = False
Dim nBreaks As Integer, i As Integer, SoDong As Integer, DongDau As Integer, endR As Integer, DongCuoi As Integer
    'Chi dung khi co 1 trang wide va n trang tall
    ActiveSheet.Select
    Range("E1:E1000").ClearContents
    ActiveWindow.View = xlPageBreakPreview
    nBreaks = ActiveSheet.HPageBreaks.Count
    DongDau = 2 'Bat dau la dong 3
    endR = Range("A65000").End(xlUp).Row
  For i = 1 To nBreaks - 1
        DongCuoi = ActiveSheet.HPageBreaks(i).Location.Row - 1
        Range(Cells(DongDau + 1, 5), Cells(DongCuoi, 5)).Value = i
        SoDong = DongCuoi - DongDau
        DongDau = DongCuoi
   Next i
   If SoDong * i = endR Then
        Range(Cells(DongDau + 1, 5), Cells(endR, 5)).Value = i
    Else
        Range(Cells(DongDau + 1, 5), Cells(SoDong * i, 5)).Value = i
        Range(Cells(SoDong * i + 1, 5), Cells(endR, 5)).Value = i + 1
    End If
ActiveWindow.View = xlNormalView
Application.ScreenUpdating = True
End Sub
 
Mọi người giải thích dùm em đoạn code sau với:
MyR.EntireRow.PageBreak = xlPageBreakAutomatic _
Or MyR.EntireRow.PageBreak
Em đọc hoài nhưng không hiểu. Híc
 
Chính xác là thế này

PHP:
If MyR.EntireRow.PageBreak = xlPageBreakAutomatic _
    Or MyR.EntireRow.PageBreak = xlPageBreakManual Then PageNumber = PageNumber + 1

Có nghĩa nếu gặp dòng phân cách trang (PageBreak) thì tăng biến PageNumber lên 1 (tức là xác định thêm 1 trang), vì :

xlPageBreakAutomatic là ứng với vị trí phân trang tự động
xlPageBreakManual là ứng với vị trí phân trang do người dùng định nghĩa (từ insert \ page break)
 
Thêm một cách nữa cho vui
Mã:
Sub DienSotrang()
   Dim lRow As Long, lStart As Long
   Dim i As Integer, nPage As Integer
   Dim varPB As Variant
   i = 1: lStart = 3: nPage = 1
   lRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
        Do While IsError(varPB) = False
            varPB = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64)," & nPage & ")")
                If IsError(varPB) Then
                   Range(Cells(lStart, 3), Cells(lRow, 3)) = i
                   Exit Do
                Else
                   Range(Cells(lStart, 3), Cells(varPB - 1, 3)) = i
                   i = i + 1: lStart = varPB
               End If
                  nPage = nPage + 1
        Loop
End Sub
 
Giải pháp công thức

ĐÚng như tigertiger đã viết trên ta có thể sd công thức - cám ơn bác voda vể GET.DOCUMENT(64) - bài viết trên đã gợi nhớ cho tigertiger tìm kiếm thông tin và có công thức này

Để sd công thức chúng ta làm 2 bước sau

+ Đặt 1 name có (Insert\ name \define: ) là Hbrk có Reffer to là
PHP:
=GET.DOCUMENT(64)+NOW()*0

+ Khi đó tại ô (cell) muốn thấy thứ tự trang ta gõ công thức sau:
PHP:
=IF(ISNA(MATCH(ROW(),Hbrk,1)),1,MATCH(ROW(),Hbrk,1)+1)
(Copy công thức cho các ô khác)
.
 
ĐÚng như tigertiger đã viết trên ta có thể sd công thức - cám ơn bác voda vể GET.DOCUMENT(64) - bài viết trên đã gợi nhớ cho tigertiger tìm kiếm thông tin và có công thức này

Để sd công thức chúng ta làm 2 bước sau

+ Đặt 1 name có (Insert\ name \define: ) là Hbrk có Reffer to là
PHP:
=GET.DOCUMENT(64)+NOW()*0

+ Khi đó tại ô (cell) muốn thấy thứ tự trang ta gõ công thức sau:
PHP:
=IF(ISNA(MATCH(ROW(),Hbrk,1)),1,MATCH(ROW(),Hbrk,1)+1)
(Copy công thức cho các ô khác)
.

Không ngờ làm bằng công thức lại xử lý được như vậy. Quá hay.
Nhờ các bác giải thích " =GET.DOCUMENT(64)+NOW()*0 " là như thế nào?
 
Lần chỉnh sửa cuối:
Thế là bài này giải quyết được ổn thỏa...nhưng có một cái hay mà chưa có topic nào có, tức là...từ VBA ...tìm ra được cách dùng công thức hợp lý ! Và theo tôi với yêu cầu bài này 090TRI nên dùng công thức của Tigertiger, tham khảo VBA để học tập thêm. Thân !
 
mình thấy có name động là lấy số trang lấy tên sheet nhưng chưa thấy lấy một vùng dữ liệu khi có một sheet được tạo ra, sao nhỉ!...............khi đó viết công thức cập nhật như thế nào cơ.
 
mình thấy có name động là lấy số trang lấy tên sheet nhưng chưa thấy lấy một vùng dữ liệu khi có một sheet được tạo ra, sao nhỉ!...............khi đó viết công thức cập nhật như thế nào cơ.

Chưa hỉu ý bạn lém

Oh, sheet mới tạo ra là sheet mới hoàn toàn mà -> làm sao dựng liên kết mới

_> giải pháp dùng macro thui, và VBA là tốt nhất để bắt trường hợp sự kiện chèn sheet mới -> hoặc thực hiện chèn rồi thêm một lệnh khác nữa, như thê này đây

PHP:
............
'CODE thêm sheet mới
.............
'CODE xử lý liên kết với sheet vừa tạo thêm
...........

thế nhỉ
 
Qua test thử, thấy Code của Thầy Voda là OK nhất.
MyCode và TiGerTiGer cũng sai khi có dòng tiêu đề. Để ý khi dòng cuối trùng với ngắt trang.
Còn công thức thì thua, chậm lắm.
Cái này chắc phải nhờ thêm Bác Phạm Duy Long tham gia.
Để ý khi dòng cuối trùng với ngắt trang hay là dòng cuối <> ngắt trang và dòng tiêu đề trang thay đổi. Kiểm tra với các điều chỉnh Margins.
 
Qua test thử, thấy Code của Thầy Voda là OK nhất.
MyCode và TiGerTiGer cũng sai khi có dòng tiêu đề. Để ý khi dòng cuối trùng với ngắt trang.

Cái này chắc phải nhờ thêm Bác Phạm Duy Long tham gia.

Nếu có những thay đổi thì phải chạy lại CODE chứ a ThuNghi ơi???

tigertiger đã thử lại cả margin / tiêu đề ... CODE của mình không sai (dĩ nhiên khi thay phải chạy lại CODE vì các con số sau khi chạy chỉ là giá trị thui)


Để ý khi dòng cuối trùng với ngắt trang hay là dòng cuối <> ngắt trang và dòng tiêu đề trang thay đổi. Kiểm tra với các điều chỉnh Margins.
cứ preview chúng ta sẽ thấy ngay đúng sai

Còn công thức thì thua, chậm lắm.
Chậm nhưng chấp nhận được,
vì chỉ khi thay đổi các thông sô liên quan đến page thì công thức mới cần xác định lại - mà chúng ta ít thay đổi đều này trong phiên làm việc
.
 
Lần chỉnh sửa cuối:
Mình thấy VBA hay công thức đều hay cả. Qua đó học được những điều mà mình chưa biết. Cám ơn tất cả các anh đã trả lời bài viết này. Chúc các anh nhiều sức khỏe và nhiều bài viết hay nữa nhé.
 
Web KT

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

Back
Top Bottom