Tách số trong textbox (1 người xem)

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

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

yeudoi

Thành viên gắn bó
Thành viên BQT
Moderator
Tham gia
12/6/06
Bài viết
3,186
Được thích
7,637
Mình nhập liệu trong 1textbox gồm các số từ 1 - 9 ví dụ:4561, 123, 4678, 532689 nay mình muốn tách các số vào đúng cột của số đó và nhân với giá trị của textbox khác thì phải làm sao. Mong mọi người chỉ giúp, mình đang rất cần.
 
Không biết đề tài này có khó quá không mà không thấy ai trả lời vậy kìa
 
Upvote 0
Nếu dữ liệu đó ở các cell thì bạn dùng công cụ Text to Columns là xong thôi mà.
Còn trực tiếp trong textbox thì mình không biết.
Thân!
 
Upvote 0
Dear yeudoi,
------------
Không quá khó, mình nghĩ vấn đề của bạn phải được đưa ra cụ thể bằng một file minh hoạ chứ không phải một ví dụ. Bởi vì các ký tự làm dấu hiệu nhận dạng các thành phần trong chuỗi là rất quan trọng.
Có hai cách để thực hiện việc này, ở mức cơ bản bạn kết hợp các hàm: FIND, MID, LEFT, RIGHT, để cắt ra từng phần tử. Ở mức nâng cao (chắc bạn muốn thực hiện theo cách này) bạn có thể xây dựng một hàm bằng VBA đơn giản.
Giải thuật: thực hiện một vòng duyệt qua từng ký tự của chuỗi, nếu gặp ký tự phân cách (có thể là khoảng trắng " ", dấu gạch ngang "-", dấu ";" hay dấu ","...) ở vị trí nào thì cắt phần tử tại vị trí trước đó:
- Khai báo một biến để lưu trữ các phần tử (hoặc bạn có thể giá trị trực tiếp lên Cell)
- Duyệt từng ký tự trong chuỗi
- Sử dụng hàm InStrRev để xác định độ lớn của từng phần tử thông qua ký tự phân cách.
Tuy nhiên bạn có thể sử dụng hàm Split có sẵn trong VBA, rất phù hợp mà không cần dùng vòng lặp, sau đây là một ví dụ:
Ví dụ:
Mã:
Public Function SplitMe(strText As String, Optional lngWhere As Long, Optional strDelimiter As String = ",")
Dim varArray As Variant
varArray = Split(strText, ",")
SplitMe = varArray(lngWhere)
End Function
 
Upvote 0
MÌnh sẽ gửi file vd bởi mình muốn làm chương trình kiểm phiếu.Khi nhập liệu tại textbox những người không bầu mình không nhập tên mà nhập số thứ tự của những người bị gạch tên thôi và không có dấu ngăn cách
 
Upvote 0
Dear yeudoi,
------------
Nếu không có dấu hiệu phân biệt số thứ tự của những người bị gạch tên thì làm sao bạn biết được có bao nhiêu người bị gạch tên?
Trong Form minh hoạ bạn nhớ để lại giá trị mặc định trên Text box để mọi người có chuỗi mẫu.
 
Upvote 0
Việc này không khó, có thể dùng For ... Next để duyệt từng số một, rồi dùng hàm Mid như Cường nói để tách. Tuy nhiên còn có vấn đề là hàng nữa, vì có nhiều giá trị cùng một cột thì thể hiện như thế nào?
 
Upvote 0
Đúng là ko khó, cứ Up file lên anh em sẽ làm giúp.
 
Upvote 0
Mong mọi người xem giúp.MÌnh đang cần gấp.
 

File đính kèm

Upvote 0
Cậu có qui định chiều dài của chuỗi tối đa là bao nhiu ký tự ko vậy ??
Cái này trước tiên bạn phải đếm chiều dài của chuổi là bao nhiêu, sau đó dùng For .... next và các hàm left, right mid gì đó để lấy các phần tử như Đại ca Cường hướng dẫn (cái này chắc phải viết 1 hàm tách chuỗi riêng). sau cùng dùng Offset để ghi. đang ở cơ quan nên mình chỉ đưa giải thuật thôi, không thể ngồi viết luôn được.
 
Upvote 0
Ah cảm ơn lachinhan nếu bạn có thể viết luôn code được không thì độ dài tối đa là 9.
 
Upvote 0
Ok mấy ngày nghỉ ở nhà mình sẽ nghiên cứu rồi post lên cho bạn
 
Upvote 0
Dear all,
--------
Mình không biết rắc rối của yeudoi ở chỗ nào. Giải thuật đưa từ phần tử trong một string vào các Cell tương ứng thì anh PhanTuHuong đã nói cho bạn rồi. Vấn đề là vận dụng để giải quyết như thế nào. Thôi thì viết luôn cho bạn vậy (code giả):

Dim lngRow As Long, lngColumn As Long ' Vị trí cần điền
lngRow = <Chỉ số dòng cuối cùng của bảng>
lngColumn= <Chỉ số cột trước cột mà bạn muốn điền>
Dim i As Long, lngColumnCount As Long, lngValueToInsert As Long

lngColumnCount = Len(BAUCU.SOBO.Value)
If lngColumnCount = 0 Then Exit Sub
For i = 1 To lngColumnCount
lngValueToInsert = Mid(BAUCU.SOBO.Value, i, 1)
Cells(lngRow+1, lngColumn+lngValueToInsert+1)= lngValueToInsert
Next
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã làm được rồi, nhưng xin được hỏi thêm làm sao khi ta nhập hết các textbox và nhấn nút nhập thì con trõ sẽ tiếp tục chọn lại textbox đầu để ta tiếp tục nhập tiếp mà không chuyển sang các nút xem, cancel hoặc các nút khác
 
Upvote 0
Dear yeudoi,
------------
yeudoi đã viết:
làm sao khi ta nhập hết các textbox và nhấn nút nhập thì con trõ sẽ tiếp tục chọn lại textbox
Muốn con trỏ "nhảy" đến texbox nào sau mỗi lần ấn nút
cmbCapnhap, ở cuối thủ tục cmdCapnhat_Click, bạn sử dụng phương thức SetFocus cho textbox đó, ví dụ con trỏ sẽ chuyển đến Texbox1:
Textbox1.SetFocus
 
Upvote 0
Đào Việt Cường đã viết:
Dear all,
--------
Mình không biết rắc rối của yeudoi ở chỗ nào. Giải thuật đưa từ phần tử trong một string vào các Cell tương ứng thì anh PhanTuHuong đã nói cho bạn rồi. Vấn đề là vận dụng để giải quyết như thế nào. Thôi thì viết luôn cho bạn vậy (code giả):
HTML:
Dim lngRow As Long, lngColumn As Long ' Vị trí cần điền
lngRow = <Chỉ số dòng cuối cùng của bảng>
lngColumn= <Chỉ số cột trước cột mà bạn muốn điền>
Dim i As Long, lngColumnCount As Long, lngValueToInsert As Long

lngColumnCount = Len(BAUCU.SOBO.Value)
If lngColumnCount = 0 Then Exit Sub
For i = 1 To lngColumnCount 
lngValueToInsert = Mid(BAUCU.SOBO.Value, i, 1)
Cells(lngRow+1, lngColumn+lngValueToInsert+1)= lngValueToInsert 
Next
Nếu như đây chỉ dùng cho các số từ 1-9. Nếu dùng thêm các số có hai chữ số phải làm như thế nào để tách vậy nhỉ (Nếu nhập thì cần thêm dấu cách "-"). Mong được chỉ giáo.
 
Upvote 0
chào Đào việt Cường minh lam như vây đúng không
1/ mình tạo macro có tach mình chép đoạn code của bạn vào , sau do minh vào add in dánh dấu tach
2/mình gõ dẩy số ở cell A1: 326,3265,2658,3269,3265
3/ cell B2 mình gõ =tach(A1) thì báo lồi (#name?)
mình làm như vậy bị sai ở chổ nao ban hướng dẩn dùm.Bạn cho hỏi thêm giả dụ dầy số trên co dấu phân cách " :","." thì có phải mình bổ sung phần (
Public Function SplitMe(strText As String, Optional lngWhere As Long, Optional strDelimiter As String = ",",":") như vậy đúng không
Ban cho mình xin đoạn code nghe cám ơn ban
 
Upvote 0
Web KT

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

Back
Top Bottom