Xin code để hoàn chỉnh biểu mẫu báo cáo

Liên hệ QC

Người Đưa Tin

Hạt cát sông Hằng
Thành viên danh dự
Tham gia
12/12/06
Bài viết
3,661
Được thích
18,158
Mình có 1 file sau đây (đã được anh Hoang Danh) hỗ trợ cho 1 đoạn code :

Mã:
Sub worksheet_change(ByVal target As Range)
If target.Column = 6 And target <> "" Then target.Offset(, -1).WrapText = True
End Sub

Trong quá trình sử dụng biểu mẫu cùng phối hợp với code này :
Mình có 1 số thắc mắc khi :

Delete row thì hay báo sau đây - Xin giải thích và hướng khắc phục lỗi này

delete.png


Copy row thì hay báo sau đây - Xin giải thích và hướng khắc phục lỗi này

copyrow.png


Độ dài mặc định : Khi xóa dữ liệu trong cột F để row trở lại có độ dài mặc định

dodaimacdinh.png


Vui lòng cho xin code để khắc phục và hoàn chỉnh biểu mẫu này.

Xin cám ơn

Qua bài viết này xin gởi lời cám ơn anh Hoàng Danh đã hỗ trợ đoạn code cho mình.
 

File đính kèm

Bác có thể thay bằng đoạn code này:
PHP:
Sub worksheet_change(ByVal target As Range)
If target.Column = 6 Then
target.Offset(, -1).WrapText = True
target.EntireRow.AutoFit
End If
End Sub
Còn nguyên nhân thì em không biết :))
 
Ứng dụng code của anh vào đã khắc phục được các tình trạng : delete row, copy row và định dạng row theo mặc định.

Chúc nhiều sức khỏe và mong có những bài viết hữu ích giúp cho các thành viên.

Chân thành cám ơn anh rất nhiều.

@ huuthang_bd : Nhờ bác dành chút thời gian xem bài này dùm. Mong sớm gặp lại
 
Lần chỉnh sửa cuối:
1. Code của Hoàng Danh:
PHP:
Sub worksheet_change(ByVal target As Range)
If target.Column = 6 And target <> "" Then target.Offset(, -1).WrapText = True
End Sub

Khi insert hoặc delete row, target là cả 1 dòng. Target <> "" nghĩa là giá trị cả 1 dòng, tức là 1 mảng, không so sánh với 1 giá trị đơn lẻ "" được, lỗi Type Mismatch ở chỗ đó.

2. Code của Hữu Thắng:

PHP:
Sub worksheet_change(ByVal target As Range)
If target.Column = 6 Then
target.Offset(, -1).WrapText = True
target.EntireRow.AutoFit
End If
End Sub

Như trên đã nói, target là cả 1 dòng, nên target.column không bao giờ bằng 6. Nghĩa là đoạn code đó không hề chạy.

Nếu may mà insert dòng bên dưới 1 dòng đã format wraptext, thì dòng mới insert vào sẽ thừa hưởng cái định dạng của dòng trên.
Nếu chẳng may insert dòng chỗ khác, thí dụ trong file là insert từ dòng 45 chẳng hạn, thì code không chạy, cột 5 không wrap text.

Cách sửa lỗi:

PHP:
Sub worksheet_change(ByVal target As Range)
If target.Count > 1 Then Exit Sub
If target.Column = 6 And target <> "" Then target.Offset(, -1).WrapText = True
End Sub

Nhưng đó không phải cách tối ưu vì hễ có bất kỳ thay đổi nào là excel đều chạy ít nhất 1 dòng lệnh. Có 1 cách là dùng code này trong module:

PHP:
Sub WrapText()
Selection.WrapText = True
End Sub

Gán cho nó 1 phím tắt, chọn 1 vùng ô, nhấn phím tắt, xem kết quả.
 
Lần chỉnh sửa cuối:
Nếu may mà insert dòng bên dưới 1 dòng đã format wraptext, thì dòng mới insert vào sẽ thừa hưởng cái định dạng của dòng trên.
Nếu chẳng may insert dòng chỗ khác, thí dụ trong file là insert từ dòng 45 chẳng hạn, thì code không chạy, cột 5 không wrap text.
1. Bác KTGG chỉ cần Wraptext khi dữ liệu ở cột 6 được nhập vào. Vì vậy tôi nghĩ khi Insert dòng không cần phải Wraptext. Hơn nữa, khi đã Insert dòng thì đương nhiên là sẽ nhập dữ liệu vào cột 6. Lúc đó Macro sẽ thực hiện Wraptext ô ở cột 5.
2. Bác KTGG đã muốn Macro thực hiện một cách tự động. Như thế sẽ đỡ mất công phải Wraptext nhiều lần. Mà Sub thì không tự động được. Chưa phải là tối ưu.
 
1. Bác KTGG chỉ cần Wraptext khi dữ liệu ở cột 6 được nhập vào. Vì vậy tôi nghĩ khi Insert dòng không cần phải Wraptext. Hơn nữa, khi đã Insert dòng thì đương nhiên là sẽ nhập dữ liệu vào cột 6. Lúc đó Macro sẽ thực hiện Wraptext ô ở cột 5.
Khi insert dòng bên dưới 1 dòng đã wraptext, thì đương nhiên sẽ wraptext (thừa hưởng). Khi nhập liệu vào cột 6 thì cột 5 thực hiện wraptext 1 lần nữa: Dư.

Bác KTGG đã muốn Macro thực hiện một cách tự động. Như thế sẽ đỡ mất công phải Wraptext nhiều lần. Mà Sub thì không tự động được. Chưa phải là tối ưu.

Nếu là tôi thì chỉ thực hiện 1 lần. Nhập liệu cho hết bảng mấy trăm mấy ngàn dòng gì đi, tô chọn hết dữ liệu cột 5, nhấn phím tắt.
Cái tối ưu đây là nói về tiết kiệm tài nguyên. Tự động thì phải hiểu là chạy khi cần thiết chứ không phải lúc nào cũng chạy. Mà tôi cũng không nói code của tôi là tối ưu.

Với lại cái nào chẳng là sub?

Với lại tôi cũng muốn giải thích cái chỗ mà hữu Thắng không hiểu:
Còn nguyên nhân thì em không biết :))
 
Lần chỉnh sửa cuối:
Khi insert dòng bên dưới 1 dòng đã wraptext, thì đương nhiên sẽ wraptext (thừa hưởng). Khi nhập liệu vào cột 6 thì cột 5 thực hiện wraptext 1 lần nữa: Dư.



Nếu là tôi thì chỉ thực hiện 1 lần. Nhập liệu cho hết bảng mấy trăm mấy ngàn dòng gì đi, tô chọn hết dữ liệu cột 5, nhấn phím tắt.
Cái tối ưu đây là nói về tiết kiệm tài nguyên. Tự động thì phải hiểu là chạy khi cần thiết chứ không phải lúc nào cũng chạy. Mà tôi cũng không nói code của tôi là tối ưu.
Nếu làm một lần thì cũng không cần phải dùng Code làm gì. Format thủ công cũng không mất bao nhiêu thời gian. Thường công tác kế toán đâu có nhập một lần mấy trăm mấy ngàn dòng! Mỗi ngày chỉ phát sinh một vài nghiệp vụ thôi.
 
Lần chỉnh sửa cuối:
Mỗi ngày chỉ phát sinh một vài nghiệp vụ thôi.
Vậy mỗi ngày cũng chỉ làm 1 lần thôi, nhấn phím tắt cực khổ vậy sao?
Nhưng hỏi thật, nếu Hữu Thắng biết nguyên nhân khiến cho code Hoàng Danh chạy bị lỗi, Thắng có sửa theo hướng đó không?
 
Em chân thành cám ơn Thầy Mỹ cùng quý anh đã quan tâm và trả lời bài cho em.

Xin thưa, diễn đàn đã có sẵn cái tên : giải pháp excel.

Giải thuật của mỗi bài toán đều có cái ưu hoặc hạn chế của nó cả. Do vậy, xin tất cả Quý Thầy/cô vì cộng đồng trong đó có em, nên cùng nhau chọn và đưa ra giải pháp giúp cho công việc của thành viên đạt được kết quả tốt là quý lắm.

Hồi nãy giờ, em cũng hơi lúng túng việc tạo phím tắt.
Gán cho nó 1 phím tắt, chọn 1 vùng ô, nhấn phím tắt, xem kết quả.

Ngại hỏi hoài, sợ bị la nói sao dốt nữa thì em lại mắc cỡ - chắc lúc ấy không biết trốn đâu hết.

Một lần nữa kính lời cám ơn tất cả Quý Thầy/cô, anh chị đã giúp đỡ, xem đề tài này.

Kính.

P/S : Hãy giúp em hoàn thiện thêm

Gán cho nó 1 phím tắt, chọn 1 vùng ô, nhấn phím tắt, xem kết quả.
 
Lần chỉnh sửa cuối:
Nhưng hỏi thật, nếu Hữu Thắng biết nguyên nhân khiến cho code Hoàng Danh chạy bị lỗi, Thắng có sửa theo hướng đó không?
Một yêu cầu dù cho đã có code hay công thức sẵn tôi cũng thường tự mình nghĩ ra một thuật toán trước rồi mới so sánh với cái đã có để tránh bị ảnh hưởng bỡi thuật toán của code hay công thức đã có sẵn. Vì vậy, dù có biết nguyên nhân lỗi trong đoạn code của Hoàng Danh tôi cũng vẫn viết code theo thuật toán của minh.
Vậy mỗi ngày cũng chỉ làm 1 lần thôi, nhấn phím tắt cực khổ vậy sao?
Tự động là tôi làm theo yêu cầu của bác KTGG mà thôi.
Gán cho nó 1 phím tắt, chọn 1 vùng ô, nhấn phím tắt, xem kết quả.
Copy code vào Module. Trở lại giao diện Excel. Alt + F8 | Chọn Macro | Option | Gán cho nó một phím tắt.
Chọn vùng cần Wraptext. Nhấn phím tắt đã gán cho Macro.
Ngại hỏi hoài, sợ bị la nói sao dốt nữa thì em lại mắc cỡ - chắc lúc ấy không biết trốn đâu hết.
Giấu dốt mới đáng ngại chứ không biết thì hỏi chứ có gì mà ngại. (Xin lỗi nếu câu này làm Bác phật lòng)
 
Lần chỉnh sửa cuối:
Gởi KTGG:

Muốn tạo short cut thì code phải để trong module:

attachment.php


Rồi mở menu Tool - Macro - Chọn cái macro muốn gán short cut, nhấn nút option
Trong cái ô đó gõ t hoặc T hoặc chữ gì tuỳ ý.

attachment.php


Gởi huuthangbd:

Tôi không còn gì để nói với bạn nữa.
 

File đính kèm

  • Module.jpg
    Module.jpg
    41.6 KB · Đọc: 48
  • ShortCut.jpg
    ShortCut.jpg
    29 KB · Đọc: 47
Lần chỉnh sửa cuối:
Như trên đã nói, target là cả 1 dòng, nên target.column không bao giờ bằng 6
Chào bạn ptm0412 , lâu nay tôi dùng cái này được mà bạn .
Ví dụ : đứng ở cột D
[A1]=target.column (=6)
 
Chào bạn ptm0412 , lâu nay tôi dùng cái này được mà bạn .
Ví dụ : đứng ở cột D
[A1]=target.column (=6)

Khi insert dòng hay delete nguyên dòng, thì Target.Column luôn luôn bằng 1 dù cho bạn đứng ở đâu.

Thử bằng cách dùng code của Hoàng Danh, đứng ở ô F30, insert row hoặc delete row, khi báo lổi thì debug và gõ vào cửa sổ Immediate:

?target.column
1
?Target.Address
$30:$30
?target.Value

Error: Type Mismatch:
attachment.php
 

File đính kèm

  • TypeMisMatch.jpg
    TypeMisMatch.jpg
    43.8 KB · Đọc: 51
Web KT

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

Back
Top Bottom