Viết Macro in sổ cái

  • Thread starter Thread starter Thien
  • Ngày gửi Ngày gửi
Liên hệ QC
Public Sub Add_name()
Dim i As Long 'NVSON
For i = 1 To Range("rngName").Rows.Count
ActiveWorkbook.Names.Add Name:=Range("rngName").Cells(i, 1).Value, RefersTo:="=" & Range("rngReplace").Cells(i, 1).Value
Next i
End Sub
Do tôi đặt rngName là offset()
Bạn thay câu sau
For i = 1 To Range("rngName").Rows.Count
thành
For i = 1 To WorksheetFunction.CountA(Range("rngName")) là OK
rngName: cột tên name
rngReplace: cột tham chiếu
 
Buồn quá bạn ơi. Làm không được rùi

TC
 
Lần chỉnh sửa cuối:
Phải có sh dmtk, cdps, socai nó mới tìm mà đặt chớ. Làm thêm hàm kiểm tra sh name thì no need.
Bạn theo thử file sau.
 

File đính kèm

Dear Thunghi.

Mình làm theo hướng dẫn của file Anh Hiếu để tạo sổ cái bằng VBA (không dùng công thức như trước đây).
Nhưng mình muốn từ sổ cái này sẽ tạo ra các sheet chứa từng TK như file của Thunghi thì lảm hoài không được.
Bạn xem giúp mình nhen.

TC.
 

File đính kèm

Bạn nghiên cứu thử, sẽ duyệt qua từng cell của sh dmtk (tk cần lấy sổ cái) code taonhsocai.
Gán giá trị vào Cells( ) trong sổ cái, mỗi lần gán thì chạy code tạo sổ cái và copy.
Làm xong nhớ cho tôi file nguồn (đầy đủ) để làm báo cáo nhé.
Bạn đã nghiên cứu file của Mr Hiếu rồi sao không làm file của 1 năm luốn. Chỉ cần thêm cột ngày.
 
He He bạn không chịu coi file của mình rùi.
Mình sửa code đủ kiểu mà chẳng được gì
 
1/ Khi bạn tạo xong 1 sổ cái, hide những dòng trống => copy socai -> sh tmp sẽ luôn bị hide theo sh sổ cái đầu. Phần cuối của sổ cái Ngày... giám đốc nên đặt name là footer, sau khi code tạo sổ cái xong thì chép vào cells(i+3,1), i là dòng cuối. Như vậy độ dài các sổ cái sẽ là những dòng thực tế có dữ liệu => file nhẹ hơn.
2/ Dùng shape để thực hiện code, khi copy socai sẽ copy luôn => nặng. Nên dùng command button.
3/ Name DMTK nên sửa lại như sau
=OFFSET(DMTK!$B$2:$B$101,0,0,COUNTIF(DMTK!$B$2:$B$101,">0"),1)
4/ Vừa rồi làm file insocai này tôi có thấy tôi sai 1 cái gì mà hiện tại quên rồi.
5/ Bỏ sự kiện change no need
Tôi sẽ hòan thành lại và thêm vào copy những sổ cái sang wb khác.
Bạn nghiên cứu thử nhé. Sẽ làm cho bạn ASAP.
 
Tôi sửa sơ file insocai và có thêm tạo new wb chứa những sổ cái. Trước khi bạn tạo new WB nhớ phảo tạo sổ cái.
Đang tìm code tìm sự tồn tại sh để gắn vào.
Chưa test chi tiết. Bạn test hộ nhé.
 

File đính kèm

Dear Thunghi.

Cảm ơn sự nhiệt tình giúp đỡ của bạn. Mình có vài câu hỏi nhờ giải đáp:
- Code sổ cái mình copy từ file Mr Hiếu sang file của mình thì trong marco name không có tên SoCai mà có tên Module1.SoCai. Điều này mình gặp phải rất nhiều, ngay cả khi export module từ file này import sang file khác nếu giữ nguyên tên module thì không có gì còn nếu đặt lại tên khác thì bị như trên.
- Trong file Insocai-V2 của bạn cũng như trong file của mình có 1 điều mình không biết cách chỉnh là tại ô E8 & F8 mình không muốn tính bằng VBA, mà muốn giữ nguyên E8 =IF($D$2="","",VLOOKUP($D$2,CDPS,6,0)) và F8=IF($D$2="","",VLOOKUP($D$2,CDPS,6,0)). Một điều vô lý là trong code của Mr Hiếu có đặt VBA cho cả 02 ô này nhưng khi chạy code thì chỉ ô E8 bị thôi, còn ô F8 vẫn còn công thức. Điều này cũng làm cho các sổ cái được tạo ra trên từng sheet bị tính toán sai ngay tại ô E8.

Bạn xem hộ & giải thích giúp mình.

Cảm ơn nhiều.

Thân chào (TC.).


PS: Mr Hiếu sao vẫn không giúp mình giải đáp thắc mắc file mình gửi qua mail nhỉ?.
 
1/ Do code socai trùng tên với name socai nên có tình trạng Module1.SoCai, sửa tên code socai thành socaict thì OK.
2/E8 =IF($D$2="","",VLOOKUP($D$2,CDPS,6,0)) F8=IF($D$2="","",VLOOKUP($D$2,CDPS,6,0))
F8 thì công thức khá OK nhưng E8 số 6 phải là 5.
Nhưng đây là file tạo socai theo tk và theo ngày nên sumif theo sh CDPS thì không có nghĩa, cdps của tháng 6...Nếu có dùng thì dùng sumproduct, nhưng cũng không được vì cột E, F, L của Sh PhatSinh không = nhau.=>Dùng VBA và sd đầu kỳ, xem lại. SD cuối thì dùng hàm max thì OK
3/
If Left$(TKNo, m) = TK Then ' No
If TKNo.Offset(0, -2).Value < S01.Range("C4").Value Then ' Ngay nho hon
i = i + 1
'S01.Range("E8").Value = S01.Range("E8").Value + TKNo.Offset(0, 7).Value
Else ' Phat Sinh
S01.Range("E8").Value = S01.Range("E8").Value + TKNo.Offset(0, 7).Value
'i = i + 1
S01.Range("A" & i) = TKNo.Offset(0, -3)
S01.Range("B" & i) = TKNo.Offset(0, -2)
S01.Range("C" & i) = TKNo.Offset(0, -1)
S01.Range("D" & i) = TKNo.Offset(0, 1)
S01.Range("E" & i) = TKNo.Offset(0, 7)
End If
i = i + 1
Tôi có sửa lại phần bold, (xin phép Mr Hiếu), lý do if ngày > hơn thì skip (i=i+1) chớ không S01.Range("E8").Value = S01.Range("E8").Value + TKNo.Offset(0, 7).Value (cộng dồn E8). Ngược lại nếu ngày >= ngày đầu thì như S01.Range("E8").Value = S01.Range("E8").Value + TKNo.Offset(0, 7).Value mới OK. Do làm vòng lặp nên sửa lại lâu hơn làm mới. Bạn tham khảo MR Hiếu cho rõ hơn.
4/ Thêm một số code kiểm tra nếu chưa tạo sổ cái chi tiết thì phải tạo rồi mới tạo new WB.
5/ Them một số dòng chuyển DL của tmp sang giá trị và bỏ validation => New WB không còn link.
Tóm lại dl bài này phải coi lại số dư đầu kỳ (ngày < ngày đầu.)
Chúc bạn thành công.
 

File đính kèm

Thien đã viết:
Dear Thunghi.

Cảm ơn sự nhiệt tình giúp đỡ của bạn. Mình có vài câu hỏi nhờ giải đáp:
- Code sổ cái mình copy từ file Mr Hiếu sang file của mình thì trong marco name không có tên SoCai mà có tên Module1.SoCai. Điều này mình gặp phải rất nhiều, ngay cả khi export module từ file này import sang file khác nếu giữ nguyên tên module thì không có gì còn nếu đặt lại tên khác thì bị như trên.
- Trong file Insocai-V2 của bạn cũng như trong file của mình có 1 điều mình không biết cách chỉnh là tại ô E8 & F8 mình không muốn tính bằng VBA, mà muốn giữ nguyên E8 =IF($D$2="","",VLOOKUP($D$2,CDPS,6,0)) và F8=IF($D$2="","",VLOOKUP($D$2,CDPS,6,0)). Một điều vô lý là trong code của Mr Hiếu có đặt VBA cho cả 02 ô này nhưng khi chạy code thì chỉ ô E8 bị thôi, còn ô F8 vẫn còn công thức. Điều này cũng làm cho các sổ cái được tạo ra trên từng sheet bị tính toán sai ngay tại ô E8.

Bạn xem hộ & giải thích giúp mình.

Cảm ơn nhiều.

Thân chào (TC.).


PS: Mr Hiếu sao vẫn không giúp mình giải đáp thắc mắc file mình gửi qua mail nhỉ?.

E8 và F8 : Phát sinh lũy kế kỳ trước. Hoàn toàn không có công thức
Vì vậy chỉ khi kỳ trước có phát sinh, thì mới có nó được

Code của mình là :
Sổ cái
  • Duyệt qua tất cả DATA, tìm TK thỏa mãn
  • Chú nào có ngày phát sinh nhỏ hơn kỳ được chọn (C4-D4) thì cho vào E8 và F8
  • Chú nào có phát sinh lớn hơn kỳ được chọn (C4-D4) thì bye
  • Chú nào trong kỳ thì lọc lấy các thông tin cần thiết, cho vào bảng
  • Cộng tất cả phát sinh trong kỳ lại
  • Cộng phát sinh lũy kế đến kỳ
  • Tính số dư cuối kỳ
In Tất cả
  • Xét Sổ cái của từng TK
  • Nếu có số dư đầu kỳ, hoặc phát sinh trong kỳ, hoặc số dư cuối kỳ thì in ra
Do cách làm của bạn khác của mình (bạn muốn từng TK trên từng sheet) nên mình không làm theo cách của bạn được (vì rất mất công và không hợp lý (theo mình)).
Và vấn đề này ThuNghi đang đi theo hướng của bạn đấy.

(File trên đã được sửa lỗi khi cộng sai Số phát sinh lũy kế đến kỳ, mình đã up lại)

In Sổ Cái

Thân!
 
Dear Thunghi
Mới test sơ qua thấy lỗi rùi.
Để xem kỹ lại rùi mình thống kê lỗi cho.
Sơ qua thấy 2 lỗi rùi:
1/ Code đang chạy báo lỗi S01.Range("E8").Value = S01.Range("E8").Value + TKNo.Offset(0, 7).Value.
2/ Tự nhiên E7 &F7 + E9 & F9 bị mất công thức vậy nhỉ. (bị #VALUE! tại TK 4212).
3/ Từ ô E7:F9 xin đừng sữa công thức trong vùng này.


Vài dòng gửi bạn.

TC.

PS: cảm ơn Mr Hiếu để mình test thử. Còn file mình gửi qua mail hướng dẫn mình với. (Em có lý do của mình nên mới nhờ copy từng TK sang từng sheet.)
 
Lần chỉnh sửa cuối:
Bác này chơi tôi thiệt
L994=IF(SUM(L983:L985)>SUM(L962:L980),SUM(L983:L985)-SUM(L962:L980)," ")
Thay bằng
L994=IF(SUM(L983:L985)>SUM(L962:L980),SUM(L983:L985)-SUM(L962:L980),0)
 
OK, sẽ cố gắng theo ý "lãnh đạn"

Thân!
 
ThuNghi đã viết:
Bác này chơi tôi thiệt
L994=IF(SUM(L983:L985)>SUM(L962:L980),SUM(L983:L985)-SUM(L962:L980)," ")
Thay bằng
L994=IF(SUM(L983:L985)>SUM(L962:L980),SUM(L983:L985)-SUM(L962:L980),0)

Ở đâu vậy?
 
L994 ở sh PhatSinh
Khai báo thêm trong code SocaiCt
Dim st as long
Thay những câu sau vào code SocaiCT
Else ' Phat Sinh
ST = IIf(WorksheetFunction.IsText(TKNo.Offset(0, 7).Value), 0, TKNo.Offset(0, 7).Value)
S01.Range("F8").Value = S01.Range("F8").Value + ST 'TKNo.Offset(0, 7).Value
ST = IIf(WorksheetFunction.IsText(TKNo.Offset(0, 7).Value), 0, TKNo.Offset(0, 7).Value)
S01.Range("E8").Value = S01.Range("E8").Value + ST
ie nếu TKNo.Offset(0, 7).Value là text lấy là 0.
 
Dear Thunghi.
Cảm ơn đã giúp đỡ.
Mình làm được rùi. Rất hay.

Thân chào.
 
Sao o nhấn Thanks nhỉ
 
He He mình thank bạn 1.000 lần nhen.
Cho hỏi thêm 1 chút. trong trường hợp muốn in ra giấy luôn thì chỉnh code chỗ nào.

TC.
 
1/Thêm vào sub SocaiCT gần cuối sub
ActiveWindow.SelectedSheets.PrintPreview
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Set TKNo = Nothing
With Application
....

Nếu muốn không preview thì bỏ dòng ActiveWindow.SelectedSheets.PrintPreview
2/ Tại Sub TaonhieuSC
Thay
Call TaoSoCai

Call SoCaiCT
Theo tôi bạn nên tạo thêm 1 code và 1 command nếu bạn có đổi ý.
 
Web KT

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

Back
Top Bottom