Nhập dữ liệu vào 1 ô tự động tách thành 2 hoặc 3 ô .. (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

thanhtungpt1

Thành viên mới
Tham gia
19/6/09
Bài viết
23
Được thích
5
Có lần tôi đi tập huấn, gỉảng viên có thực hiện tuyệt chiêu sau :
Ví dụ: Ô A1Nguyễn Thanh Tùng bấm enter thì lập tức ô A1 biến thành Nguyễn Thanh còn ô B1 biến thành Tùng .Hoặc Ô A112-05-2013 bấm enter thì lập tức ô A1 biến thành 12 còn ô B1 biến thành 05 ô C1 biến thành 2013.

Về nhà tôi đã thử làm, tìm hiểu trên mạng, trên diễn đàn nhưng bó tay. Tách ra từ ô B1, C1, D1... ô A1 giử nguyên thì được còn như ví dụ trên thì khó quá. Đây là tuyệt chiêu rất hay, dân văn phòng như mình rất cần. Rất mong các cao thủ trên diễn đàn có ai làm được chỉ giùm mình với, mình cám ơn rất nhiều!
 
Tôi không nghĩ 1 ô vừa nhập là tên, vừa nhập là ngày tháng năm trong đó.

Vả lại, ngay tại ô ngày tháng đã được định dạng dd/mm/yyyy thì khi tách ngày tháng ra, dù là ngày 1 nó cũng tách ra thành 1/1/1900.

Bạn cần phải mô tả thực tế hơn!
 
Upvote 0
Để làm theo cách bạn mô tả, tôi tạm làm cho bạn, chuyện đúng sai, tính sau!

Về việc tách tên, tôi viết cho bạn một hàm như sau:

[GPECODE=vb]Function TachTen(ByVal HoTen As String) As String
Dim MySplit As Variant
HoTen = WorksheetFunction.Trim(HoTen)
MySplit = Split(HoTen, " ")
TachTen = MySplit(UBound(MySplit))
End Function[/GPECODE]

Sau đó tôi sẽ dùng sự kiện Change của WorkSheet để làm cái việc đó:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .Address = "$A$1" Then
            If Trim(.Value) <> "" Then
                Application.EnableEvents = False
                If TypeName(.Value) = "String" Then
                    Dim MyString As String
                    MyString = WorksheetFunction.Trim(.Value)
                    Range("A1:C1").ClearContents
                    .Offset(, 1) = TachTen(MyString)
                    .Value = Replace(MyString, " " & .Offset(, 1), "")
                Else
                    Dim MyDate As Date
                    MyDate = .Value
                    Range("A1:C1").ClearContents
                    .Value = Day(MyDate)
                    .Offset(, 1) = Month(MyDate)
                    .Offset(, 2) = Year(MyDate)
                    .NumberFormat = "0"
                End If
                Application.EnableEvents = True
            End If
        End If
    End With
End Sub

Đó, giờ bạn vào ô A1, bạn muốn gõ ngày tháng năm, hay họ tên thì nó tách tùm lum luôn!
 

File đính kèm

Upvote 0
Đúng là có 2 sự kiện khác nhau, một chỉ là tách tên, hoặc 2 là tách chuổi kí tự dạng ngày tháng đó bạn!
 
Upvote 0
Để làm theo cách bạn mô tả, tôi tạm làm cho bạn, chuyện đúng sai, tính sau!

Về việc tách tên, tôi viết cho bạn một hàm như sau:

[GPECODE=vb]Function TachTen(ByVal HoTen As String) As String
Dim MySplit As Variant
HoTen = WorksheetFunction.Trim(HoTen)
MySplit = Split(HoTen, " ")
TachTen = MySplit(UBound(MySplit))
End Function[/GPECODE]

Sau đó tôi sẽ dùng sự kiện Change của WorkSheet để làm cái việc đó:

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .Address = "$A$1" Then
            If Trim(.Value) <> "" Then
                Application.EnableEvents = False
                If TypeName(.Value) = "String" Then
                    Dim MyString As String
                    MyString = WorksheetFunction.Trim(.Value)
                    Range("A1:C1").ClearContents
                    .Offset(, 1) = TachTen(MyString)
                    .Value = Replace(MyString, " " & .Offset(, 1), "")
                Else
                    Dim MyDate As Date
                    MyDate = .Value
                    Range("A1:C1").ClearContents
                    .Value = Day(MyDate)
                    .Offset(, 1) = Month(MyDate)
                    .Offset(, 2) = Year(MyDate)
                    .NumberFormat = "0"
                End If
                Application.EnableEvents = True
            End If
        End If
    End With
End Sub

Đó, giờ bạn vào ô A1, bạn muốn gõ ngày tháng năm, hay họ tên thì nó tách tùm lum luôn!

Mình cám ơn bạn đã giúp! nhưng mình tải file về và gõ xong enter thì chẳng có chuyện gì xảy ra? mong bạn hướng dẫn thêm. Thank!
 
Upvote 0
Mình cám ơn bạn đã giúp! nhưng mình tải file về và gõ xong enter thì chẳng có chuyện gì xảy ra? mong bạn hướng dẫn thêm. Thank!
Mình thì làm được
Bạn chỉ có thể nhập vào ô A1 rồi ấn Enter sẽ ra kết quả ...... đã thử với chuỗi Họ và tên và chuỗi ngày tháng năm (vd 12/6/2013) Bạn đã enable marco chưa?
to a HoangTrongNghia : code của a phải sửa thể nào để khi em nhập vào bất kỳ ô nào của cột A đều cho ra kết quả.
 
Upvote 0
Mình thì làm được
........................................
to a HoangTrongNghia : code của a phải sửa thể nào để khi em nhập vào bất kỳ ô nào của cột A đều cho ra kết quả.
"Bị" thất nghiệp,
Thử sửa Sub thay cho HoangTrongNghia nhé, Funtion vẫn để nguyên trong Module
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Not Intersect(Target, [A:A]) Is Nothing Then
    For Each Cll In Target
        With Cll
            If Trim(.Value) <> "" Then
                Application.EnableEvents = False
                If TypeName(.Value) = "String" Then
                    Dim MyString As String
                    MyString = WorksheetFunction.Trim(.Value)
                    Cll.Resize(, 3).ClearContents
                    .Offset(, 1) = TachTen(MyString)
                    .Value = Replace(MyString, " " & .Offset(, 1), "")
                Else
                    Dim MyDate As Date
                    MyDate = .Value
                    .Value = Day(MyDate)
                    .Offset(, 1) = Month(MyDate)
                    .Offset(, 2) = Year(MyDate)
                    .NumberFormat = "0"
                End If
                Application.EnableEvents = True
            End If
        End With
    Next
End If
End Sub
 
Upvote 0
Mình thì làm được
Bạn chỉ có thể nhập vào ô A1 rồi ấn Enter sẽ ra kết quả ...... đã thử với chuỗi Họ và tên và chuỗi ngày tháng năm (vd 12/6/2013) Bạn đã enable marco chưa?
to a HoangTrongNghia : code của a phải sửa thể nào để khi em nhập vào bất kỳ ô nào của cột A đều cho ra kết quả.

Thì chỉ sửa cái này:

Mã:
If .Address = "$A$1" Then

Thành cái này thôi:

Mã:
If Not Intersect(Range("A:A"), Target) Is Nothing Then

Và cái này:

Mã:
Range("A1:C1").ClearContents

Thành cái này:

Mã:
Target.Resize(, 3).ClearContents
 
Upvote 0
Mình thì làm được
Bạn chỉ có thể nhập vào ô A1 rồi ấn Enter sẽ ra kết quả ...... đã thử với chuỗi Họ và tên và chuỗi ngày tháng năm (vd 12/6/2013) Bạn đã enable marco chưa?
to a HoangTrongNghia : code của a phải sửa thể nào để khi em nhập vào bất kỳ ô nào của cột A đều cho ra kết quả.

Mình đã thử được rồi, đúng như là yêu cầu rồi, thậm chí là tách cả tên hoặc tách được cả chuổi ký tự kiểu ngày tháng luôn. Nhưng mình muốn nhập cho cả bảng tính dài chẳng hạn như từ A1 tới A20 ... thì làm sao hả bạn . Với lại mình muốn hiểu và làm một file khác giống như vậy chẳng hạn, nên rất mong bạn hướng dẫn thêm một chút ít để mình học hỏi. Cám ơn bạn rất nhiều!
 
Upvote 0
Bác Bate ah
Vấn đề cột dữ liệu được nhập ở cột A đã OK
Bây giờ em "được voi đòi Hai Bà trưng" bác a --=0--=0--=0
Từ code của bác em muốn dữ liệu dạng chuỗi được tách lần lượt sang các cột bên cạnh (mỗi từ trong chuỗi được tách vào 1 cell) và chuỗi có độ dài bất kỳ. Sửa code thế nào vậy bác?
 
Upvote 0
Mình đã thử được rồi, đúng như là yêu cầu rồi, thậm chí là tách cả tên hoặc tách được cả chuổi ký tự kiểu ngày tháng luôn. Nhưng mình muốn nhập cho cả bảng tính dài chẳng hạn như từ A1 tới A20 ... thì làm sao hả bạn . Với lại mình muốn hiểu và làm một file khác giống như vậy chẳng hạn, nên rất mong bạn hướng dẫn thêm một chút ít để mình học hỏi. Cám ơn bạn rất nhiều!

Làm như bài số 8 của topic này:

http://www.giaiphapexcel.com/forum/...ộng-tách-thành-2-hoặc-3-ô&p=508801#post508801

Nhưng thay vì:

Mã:
If Not Intersect(Range("A:A"), Target) Is Nothing Then

Thì sửa thành:

Mã:
If Not Intersect(Range("A1:A20"), Target) Is Nothing Then

Còn những cái khác để nguyên.
 
Upvote 0
Bác Bate ah
Vấn đề cột dữ liệu được nhập ở cột A đã OK
Bây giờ em "được voi đòi Hai Bà trưng" bác a --=0--=0--=0
Từ code của bác em muốn dữ liệu dạng chuỗi được tách lần lượt sang các cột bên cạnh (mỗi từ trong chuỗi được tách vào 1 cell) và chuỗi có độ dài bất kỳ. Sửa code thế nào vậy bác?

Không dùng hàm tách tên nữa mà dùng hẳn trong code luôn:

[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Not Intersect(Range("A:A"), Target) Is Nothing Then
If Trim(.Value) <> "" Then
Application.EnableEvents = False
If TypeName(.Value) = "String" Then
Dim MySplit As Variant, MyString As String, MyCol As Long
MyString = WorksheetFunction.Trim(.Value)
MySplit = Split(MyString, " ")
For MyCol = 0 To UBound(MySplit)
.Offset(, MyCol) = MySplit(MyCol)
Next
Else
Dim MyDate As Date
MyDate = .Value
.Value = Day(MyDate)
.Offset(, 1) = Month(MyDate)
.Offset(, 2) = Year(MyDate)
.NumberFormat = "0"
End If
Application.EnableEvents = True
End If
End If
End With
End Sub[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
"Bị" thất nghiệp,
Thử sửa Sub thay cho HoangTrongNghia nhé, Funtion vẫn để nguyên trong Module
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Not Intersect(Target, [A:A]) Is Nothing Then
    For Each Cll In Target
        With Cll
            If Trim(.Value) <> "" Then
                Application.EnableEvents = False
                If TypeName(.Value) = "String" Then
                    Dim MyString As String
                    MyString = WorksheetFunction.Trim(.Value)
                    Cll.Resize(, 3).ClearContents
                    .Offset(, 1) = TachTen(MyString)
                    .Value = Replace(MyString, " " & .Offset(, 1), "")
                Else
                    Dim MyDate As Date
                    MyDate = .Value
                    .Value = Day(MyDate)
                    .Offset(, 1) = Month(MyDate)
                    .Offset(, 2) = Year(MyDate)
                    .NumberFormat = "0"
                End If
                Application.EnableEvents = True
            End If
        End With
    Next
End If
End Sub

Cám ơn bạn Ba Te rất nhiều! Mình đã làm được rồi và cũng đúng ý mình luôn. Có điều bảng tính cần 2,3 dòng đầu để đề tựa... vậy mình muốn bắt đầu từ A4 trở xuống thì chỉnh code làm sao vậy bạn? Thank nhiều!
 
Upvote 0
Không dùng hàm tách tên nữa mà dùng hẳn trong code luôn:

[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If Not Intersect(Range("A:A"), Target) Is Nothing Then
If Trim(.Value) <> "" Then
Application.EnableEvents = False
If TypeName(.Value) = "String" Then
Dim MySplit As Variant, MyString As String, MyCol As Long
MyString = WorksheetFunction.Trim(.Value)
MySplit = Split(MyString, " ")
For MyCol = 0 To UBound(MySplit)
.Offset(, MyCol) = MySplit(MyCol)
Next
Else
Dim MyDate As Date
MyDate = .Value
.Value = Day(MyDate)
.Offset(, 1) = Month(MyDate)
.Offset(, 2) = Year(MyDate)
.NumberFormat = "0"
End If
Application.EnableEvents = True
End If
End If
End With
End Sub[/GPECODE]

Cái này cũng tốt quá. Nhưng bạn ơi mình muốn cột A có dữ liệu dạng text vì mình có copy dữ liệu dạng text ở file khác vào thì không được . Vậy giờ chỉnh code sao đây bạn? Cám ơn Rất nhiều!
 
Upvote 0
Cái này cũng tốt quá. Nhưng bạn ơi mình muốn cột A có dữ liệu dạng text vì mình có copy dữ liệu dạng text ở file khác vào thì không được . Vậy giờ chỉnh code sao đây bạn? Cám ơn Rất nhiều!
Sao lại không được chứ nhỉ?
Mình đã thử copy text từ word vào ô A16 và A15 thì đều tự động tách sau khi nhấn Paste
đặc biệt còn tự tách Numbering thành số 1.
 
Upvote 0
Cái này cũng tốt quá. Nhưng bạn ơi mình muốn cột A có dữ liệu dạng text vì mình có copy dữ liệu dạng text ở file khác vào thì không được . Vậy giờ chỉnh code sao đây bạn? Cám ơn Rất nhiều!

Tại code thiếu vụ For... Next ---> Kết hợp với code của anh Ba Tê nữa mới xong
(Cái vụ Worksheet_Change này cứ phải For.. Next mới xong. Nếu không có nó xem như vẫn thiếu thiếu...)
-----------------------
Sao lại không được chứ nhỉ?
Mình đã thử copy text từ word vào ô A16 và A15 thì đều tự động tách sau khi nhấn Paste
đặc biệt còn tự tách Numbering thành số 1.

Copy nhiều cell
rồi paste xem có được không?
 
Upvote 0

Copy nhiều cell
rồi paste xem có được không?
Em nói là copy bên word 2010 sang rồi paste thì không thấy lỗi và code vẫn chạy.
Còn trường hợp của bác copy nhiều cell trong file excel rồi paste vào cột A của code bài #12 thì ra lỗi thật. Bác sửa lỗi như trên như thế nào a?
 
Upvote 0
Sao lại không được chứ nhỉ?
Mình đã thử copy text từ word vào ô A16 và A15 thì đều tự động tách sau khi nhấn Paste
đặc biệt còn tự tách Numbering thành số 1.
Mình gõ vào cột A : 15/02/2013 Enter thì được cột A :15 cột B : 2 cột c : 2013.
Còn copy 15/02/2013 dạng text từ chỗ khác vào thì cột A,B đều là: 15/02/2013.
Copy 15 02 2013 dạng text từ chỗ khác vào thì hiện đúng.
Bạn xem lại giúp với . Cám ơn rất nhiều!
 
Upvote 0
Mình gõ vào cột A : 15/02/2013 Enter thì được cột A :15 cột B : 2 cột c : 2013.
1) Còn copy 15/02/2013 dạng text từ chỗ khác vào thì cột A,B đều là: 15/02/2013.
2) Copy 15 02 2013 dạng text từ chỗ khác vào thì hiện đúng.
Bạn xem lại giúp với . Cám ơn rất nhiều!
Trường hợp 1 và 2 của bạn thì ở máy mình đều chạy được code và ra kết quả đúng
Chỉ có trường hợp ở bài #17 là ko được thôi.
 
Upvote 0
Như thế này nha các bạn, theo kinh nghiệm của bản thân tôi, nếu muốn duyệt cả bảng dữ liệu thì nên dùng nút lệnh hay chạy một thủ tục thì dùng For Each ... Next, mục đích chỉ để làm 1 lần cho tất cả nếu dữ liệu có sẳn mà chưa được xử lý.

Còn dùng sự kiện Change thì chớ dùng For Each ... Next, bởi vì mỗi lần nó hoạt động là nó quét từ trên xuống dưới, vừa mất thời gian, lại vừa có thể xảy ra sai sót.

Tôi lấy VD, nếu ô A1 sau khi đã xử lý dạng Date rồi và tại ô đó đang là ngày 31 (chỉ hiển thị số 31), thì khi sự kiện Change xảy ra, nó quét lại ô có giá trị 31 thành ra một ngày 31/1/1900 và bắt đầu lại tách tiếp, thành ra ở cột tháng và cột năm sẽ bị nó thay đổi giá trị ban đầu.

Nói về Chuỗi, Ví dụ đã có Hoàng Trọng tại ô A1 và ô B1 là Nghĩa, sau sự kiện Change mà dùng For Each ... Next thì nó lại tách chính thằng Hoàng Trọng thành Hoàng tại A1 và Trọng tại B1.

Cho nên, khi dùng các sự kiện, đừng bao giờ quét toàn bộ dữ liệu để xử lý, chỉ xử lý cục bộ tại chỗ xảy ra sự kiện mà thôi.
 
Upvote 0
Như bài #17 em đã nói khi copy nhiều cell sang rồi paste thì bị lỗi
sau đó nhấn End ở hộp thông báo lỗi
Và vào từng Cell nhấn F2 rồi Enter là code lại chạy rầm rầm.
 
Upvote 0
Còn dùng sự kiện Change thì chớ dùng For Each ... Next, bởi vì mỗi lần nó hoạt động là nó quét từ trên xuống dưới, vừa mất thời gian, lại vừa có thể xảy ra sai sót.


Thì cũng chỉ duyệt trong Target thôi, có bao nhiêu cell đâu mà ngại
Ví dụ tôi copy 10 cell rồi paste vào cột A, vậy For... Next sẽ duyệt chỉ trong 10 cell này thôi
Nói chung, ta dùng sự kiện Change thì phải lường trước vụ người ta copy/paste
 
Upvote 0
Thì cũng chỉ duyệt trong Target thôi, có bao nhiêu cell đâu mà ngại
Ví dụ tôi copy 10 cell rồi paste vào cột A, vậy For... Next sẽ duyệt chỉ trong 10 cell này thôi
Nói chung, ta dùng sự kiện Change thì phải lường trước vụ người ta copy/paste

Cái đáng ngại là đã có xử lý các ô trên rồi, ta lại tiếp tục thêm nữa thì xử lý sẽ dễ dẫn đến sai sót Thầy ạ. Nên em đã nói, khi một dữ liệu chưa xử lý, thì chạy cho nó một thủ tục xử lý toàn bộ. Còn việc update thì chỉ nên dùng sự kiện cho ô thay đổi mà thôi. Code cũng như con dao 2 lưỡi, nếu biết sử dụng tốt thì đem đến kết quả mỹ mãn, còn không thì thành ra phá hoại mà thôi.
 
Upvote 0
Cái đáng ngại là đã có xử lý các ô trên rồi, ta lại tiếp tục thêm nữa thì xử lý sẽ dễ dẫn đến sai sót Thầy ạ. Nên em đã nói, khi một dữ liệu chưa xử lý, thì chạy cho nó một thủ tục xử lý toàn bộ. Còn việc update thì chỉ nên dùng sự kiện cho ô thay đổi mà thôi. Code cũng như con dao 2 lưỡi, nếu biết sử dụng tốt thì đem đến kết quả mỹ mãn, còn không thì thành ra phá hoại mà thôi.

Tôi không nghĩ vậy
Dù là viết Sub thì vẫn có thể có sai sót. Ví dụ nhấn nút 1 lần chạy code, xong lại nhấn nút tiếp lần nữa thì có thể vẫn ra kết quả sai (vì dữ liệu đã được xử lý 1 lần rồi, giờ xử lý tiếp lại là chuyện khác)
Có chăng chỉ là phương pháp mà ta bẫy lỗi cao tay đến đâu thôi
 
Upvote 0
Tôi không nghĩ vậy
Dù là viết Sub thì vẫn có thể có sai sót. Ví dụ nhấn nút 1 lần chạy code, xong lại nhấn nút tiếp lần nữa thì có thể vẫn ra kết quả sai (vì dữ liệu đã được xử lý 1 lần rồi, giờ xử lý tiếp lại là chuyện khác)
Có chăng chỉ là phương pháp mà ta bẫy lỗi cao tay đến đâu thôi

Chỉ khi ta dùng InputBox và chọn vùng cần xử lý trong nút lệnh thì OK hết Thầy ơi!
 
Upvote 0

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

Back
Top Bottom