Em co một việc muốn nhờ ace giúp đỡ đây.
Hàng ngày em phải nhập dữ thời gian vào file excel ví dụ nhập 14:10 (dùng shift) nhưng giờ em muốn nhập nhanh hơn (ví dụ nhập 1410) thì excel vẫn hiểu là giữ liệu tg (14:10)
Em co một việc muốn nhờ ace giúp đỡ đây.
Hàng ngày em phải nhập dữ thời gian vào file excel ví dụ nhập 14:10 (dùng shift) nhưng giờ em muốn nhập nhanh hơn (ví dụ nhập 1410) thì excel vẫn hiểu là giữ liệu tg (14:10)
Nếu không dùng công thức để xử lý thì chắc chắn là Excel không thể hiểu 1410 là "mười bốn giờ mười phút" được. Mình đề xuất một số phương án, nếu bạn thấy cách nào dùng được thì thử xem sao:
1. Thay vì nhập 14:10 để nhập dữ liệu thì bạn có thể nhập 14;10 hay 14.10 hay bất kỳ ký tự gì thuận tiện thay cho dấu ":". Cuối ngày, sau khi đã nhập dữ liệu đầy đủ, bạn chọn toàn bộ cột chứa dữ liệu thời gian --> nhấn Ctrl+H --> nhập Find what là dấu ; và Replace with là dấu : --> nhấn Alt+A.
2. Giả sử cột B dành riêng cho việc nhập thời gian. Bạn sử dụng code sau cho sheet cần tự động quy đổi:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Or Target.Count > 1 Then Exit Sub
If Target <> "" Then
Application.EnableEvents = False
Target = Target \ 100 & ":" & Target Mod 100
Application.EnableEvents = True
End If
End Sub
(tham khảo trong file đính kèm)
3. Ngoài ra, nếu bạn muốn nhập giờ hệ thống trong máy tính vào một ô, bạn còn có thể sử dụng tổ hợp phím Ctrl+Shift+:
Em nghĩ là cứ nhập 111 là được, còn 11 giờ 1 phút thì phải nhập là 1101.
Và "nói chung" là em ủng hộ cách "nói chung" ở trên của anh. Cẩn thận luôn là một đức tính tốt!
Đúng vậy, em sẽ vào là 111 con 11h01 thì vào là 1101. Hiện tại em vẫn vào theo kiểu này rồi dùng cột phụ để xử lý (giống file đính kèm em đang dùng). Nhưng ko biết có cách để Excel tự hiểu 1101 là 11 giờ 01 phút (kể cả format). Bác nào có ý kiến nào nữa ko ta??
Đúng vậy, em sẽ vào là 111 con 11h01 thì vào là 1101. Hiện tại em vẫn vào theo kiểu này rồi dùng cột phụ để xử lý (giống file đính kèm em đang dùng). Nhưng ko biết có cách để Excel tự hiểu 1101 là 11 giờ 01 phút (kể cả format). Bác nào có ý kiến nào nữa ko ta??
Như bài trên mình đã nói, nếu không qua bước xử lý thì Excel không thể hiểu 1101 là 11 giờ 01 phút được, dù format kiểu gì đi nữa. Khi bạn nhập 1101 và định dạng kiểu thời gian (Date/Time) thì Excel sẽ hiểu đây là thời điểm 0 giờ 00 phút 00 giây của ngày thứ 1101 tính từ ngày 01/01/1900, tức là thời điểm 0:00:00, ngày 05/01/1903.
Bạn đã thử dùng 2 cách 1, 2 ở trên của mình chưa? Bạn có thể tùy biến cách 2 để sử dụng được đấy.
Chẳng hạn trong file đính kèm, mình xóa bớt 2 cột phụ của bạn, bỏ mọi công thức và sử dụng code sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 2 Or Target.Column > 3 Or Target.Count > 1 Then Exit Sub
If Target <> "" Then
Application.EnableEvents = False
Target = Target \ 100 & ":" & Target Mod 100
Application.EnableEvents = True
End If
If WorksheetFunction.Count(Intersect(Target.EntireRow, [B:C])) = 2 Then
Cells(Target.Row, 4) = Cells(Target.Row, 3) - Cells(Target.Row, 2)
Cells(Target.Row, 4).NumberFormat = "HH:mm"
End If
End Sub
Bây giờ, bạn thử nhập dữ liệu vào cột B, C xem kết quả sẽ như thế nào nhé! (bài trên không để ý, sử dụng tag
PHP:
, làm cho dấu \ chỗ "Target \ 100" không hiển thị được, thôi thì dùng tag [CODE] cho chắc).[/COLOR]
Đúng vậy, em sẽ vào là 111 con 11h01 thì vào là 1101. Hiện tại em vẫn vào theo kiểu này rồi dùng cột phụ để xử lý (giống file đính kèm em đang dùng). Nhưng ko biết có cách để Excel tự hiểu 1101 là 11 giờ 01 phút (kể cả format). Bác nào có ý kiến nào nữa ko ta??
Thanks bác, có điều khi em dùng 1*text... se cho kết quả là dạng số (0.44792) em bỏ 1*text... thì được nhưng dạng text. Nhưng may mắn là khi trừ 2 kết quả dạng text nó lại cho kết quả là dạng time chứ??
thanks all, mặc dù không được như ý nhưng vậy cũng ok rồi.
Thanks bác, có điều khi em dùng 1*text... se cho kết quả là dạng số (0.44792) em bỏ 1*text... thì được nhưng dạng text. Nhưng may mắn là khi trừ 2 kết quả dạng text nó lại cho kết quả là dạng time chứ??
thanks all, mặc dù không được như ý nhưng vậy cũng ok rồi.
Như bài trên mình đã nói, nếu không qua bước xử lý thì Excel không thể hiểu 1101 là 11 giờ 01 phút được, dù format kiểu gì đi nữa. Khi bạn nhập 1101 và định dạng kiểu thời gian (Date/Time) thì Excel sẽ hiểu đây là thời điểm 0 giờ 00 phút 00 giây của ngày thứ 1101 tính từ ngày 01/01/1900, tức là thời điểm 0:00:00, ngày 05/01/1903.
Bạn đã thử dùng 2 cách 1, 2 ở trên của mình chưa? Bạn có thể tùy biến cách 2 để sử dụng được đấy.
Chẳng hạn trong file đính kèm, mình xóa bớt 2 cột phụ của bạn, bỏ mọi công thức và sử dụng code sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column < 2 Or Target.Column > 3 Or Target.Count > 1 Then Exit Sub
If Target <> "" Then
Application.EnableEvents = False
Target = Target \ 100 & ":" & Target Mod 100
Application.EnableEvents = True
End If
If WorksheetFunction.Count(Intersect(Target.EntireRow, [B:C])) = 2 Then
Cells(Target.Row, 4) = Cells(Target.Row, 3) - Cells(Target.Row, 2)
Cells(Target.Row, 4).NumberFormat = "HH:mm"
End If
End Sub
Bây giờ, bạn thử nhập dữ liệu vào cột B, C xem kết quả sẽ như thế nào nhé! (bài trên không để ý, sử dụng tag
PHP:
, làm cho dấu \ chỗ "Target \ 100" không hiển thị được, thôi thì dùng tag [CODE] cho chắc).[/COLOR][/QUOTE]
Cảm ơn anh Nghiaphu, nhung về macro em mờ tịt, giờ nếu em muốn thay đổi sang cột khác và trong nhiều sheet của một workbook thì sửa chỗ nào đây bác, với lại trong Excel 2007 thì vào đâu để copy cái này vào bác nhỉ??
Cảm ơn anh Nghiaphu, nhung về macro em mờ tịt, giờ nếu em muốn thay đổi sang cột khác và trong nhiều sheet của một workbook thì sửa chỗ nào đây bác, với lại trong Excel 2007 thì vào đâu để copy cái này vào bác nhỉ??
1. Mình trả lời câu hỏi 2 trước: Trong Excel 2003, 2007 hay 2010 thì muốn soạn thảo code cũng đều nhấn Alt+F11. Sau đó double click vào đối tượng (Sheet1, Sheet2,... ThisWorkbook hoặc Module1, Module2,...) sẽ có thể soạn code trong khung bên phải.
Một cách khác đơn giản hơn khi muốn nhìn thấy code của Sheet1 trong file trên là bạn click phải vào nhãn sheet, chọn View Code sẽ thấy ngay.
2. Vấn đề quy định cột nào là ở chỗ câu lệnh:
Mã:
If [COLOR=#ff0000][B]Target.Column < 2[/B][/COLOR] Or [COLOR=#ff0000][B]Target.Column > 3[/B][/COLOR] Or Target.Count > 1 Then Exit Sub
Ở đây, ta hiểu Target là ô/vùng chịu sự thay đổi giá trị, Target.Column là cột của Target và Target.Count là số ô của Target. Câu lệnh này có nghĩa là nếu cột của ô/vùng thay đổi <2 (tức là trước cột B) hoặc >3 (tức là sau cột C) hoặc số ô bị thay đổi >1 thì đoạn code ở dưới không hoạt động. Như vậy ở đây muốn thay đổi sang cột khác thì bạn chỉ cần thay đổi số 2, số 3 ở trên là được. Còn nếu bạn muốn áp dụng cho nhiều sheet thì chỉ việc dán toàn bộ đoạn code trên cho tất cả các sheet muốn áp dụng thôi. Tuy nhiên nếu việc áp dụng này cho phần lớn các sheet trong workbook thì tốt hơn là đưa đoạn code trên vào sự kiện Workbook_SheetChange của đối tượng ThisWorkbook, nội dung code có khác đi một chút.
Chẳng hạn, nếu bạn muốn áp dụng code trên cho các sheet: Sheet1, Sheet3, Sheet6 thì bạn sử dụng code sau cho đối tượng ThisWorkbook:
Mã:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
[COLOR=#0000cd][B]If InStr(".Sheet1.Sheet3.Sheet6.", "." & Sh.Name & ".") = 0 Then Exit Sub
[/B][/COLOR] If Target.Column < 2 Or Target.Column > 3 Or Target.Count > 1 Then Exit Sub
If Target <> "" Then
Application.EnableEvents = False
Target = Target \ 100 & ":" & Target Mod 100
Application.EnableEvents = True
End If
If WorksheetFunction.Count(Intersect(Target.EntireRow, Sh.[B:C])) = 2 Then
Sh.Cells(Target.Row, 4) = Sh.Cells(Target.Row, 3) - Sh.Cells(Target.Row, 2)
Sh.Cells(Target.Row, 4).NumberFormat = "HH:mm"
End If
End Sub
Còn nếu muốn áp dụng cho tất cả các sheet, ngoại trừ Sheet2 và Sheet4 thì bạn thay câu lệnh màu xanh ở trên bởi câu lệnh:
Cảm ơn bạn, Nếu dùng cột phụ để xử lý thì mình cũng đã làm được rồi. Vấn đề là mình muốn nó tự nhận ra thôi. Giống như đoạn Macro mà bạn Nghiaphuc viết đó.
Thanks All