Rút ngắn Code trong Function (1 người xem)

Liên hệ QC

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

Tham gia
17/9/12
Bài viết
1,354
Được thích
1,598
Giới tính
Nữ
E đang mày mò học VBA và đang thử tạo mã NV bằng cách ghép tên và những chữ cái đầu trong họ và tên lót, e tạo các function riêng biệt trong đó có function lấy những chữ đầu trong họ và tên lót như bên dưới ạ
Function name(chuoi As String) As String
dai = Len(Trim(chuoi)) - Len(Trim(WorksheetFunction.Substitute(chuoi, " ", "")))
If dai = 1 Then tach = ""
If dai > 1 Then
For i = 1 To dai - 1
tach = tach & Mid(chuoi, WorksheetFunction.Find("*", WorksheetFunction.Substitute(chuoi, " ", "*", i)) + 1, 1)
Next i
End If
name = LCase(Left(chuoi, 1) & tach)
End Function

E làm dựa trên hàm excel nên thấy code còn khá dài và rắc rối. Mong các anh chị có thể giúp em rút gọn công thức trên hoặc trong VBA có cách khác có thể xử lý ngắn gọn hơn không ạ. E xin cảm ơn!
 

File đính kèm

E đang mày mò học VBA và đang thử tạo mã NV bằng cách ghép tên và những chữ cái đầu trong họ và tên lót, e tạo các function riêng biệt trong đó có function lấy những chữ đầu trong họ và tên lót như bên dưới ạ


E làm dựa trên hàm excel nên thấy code còn khá dài và rắc rối. Mong các anh chị có thể giúp em rút gọn công thức trên hoặc trong VBA có cách khác có thể xử lý ngắn gọn hơn không ạ. E xin cảm ơn!
Em xem code này đc ko
Mã:
Function name(chuoi As String) As String
Dim arr, i As Integer
arr = Split(chuoi, " ")
For i = 0 To UBound(arr) - 1
    name = name & Left(arr(i), 1)
Next
End Function
 
Upvote 0
Em xem code này đc ko
Mã:
Function name(chuoi As String) As String
Dim arr, i As Integer
arr = Split(chuoi, " ")
For i = 0 To UBound(arr) - 1
    name = name & Left(arr(i), 1)
Next
End Function
Dạ được anh ạ, e chưa biết đến cái vụ Split kia :( E phải tìm cho hiểu đã ạ. Cảm ơn anh
 
Upvote 0
Xin hỏi: Với tên Ông Văn Ẩn thì bạn muốn trả về kết quả gì?
- Nếu kết quả là ÔVẨ thì không có gì đáng nói
- Nếu kết quả bạn muốn là OVA thì e rằng phải bàn tiếp
- Ngoài ra nếu chuỗi nhập liệu trên bảng tính có mã Unicode tổ hợp thì lại rắc rối tiếp tập 2
- Những chuyện vặt như trong chuỗi có khoảng trắng thừa bạn cũng nên lưu tâm tới nhé
----------------
Tôi phải nói tất cả những điều trên bởi: ĐỜI ĐÂU ĐẸP NHƯ MƠ
 
Lần chỉnh sửa cuối:
Upvote 0
E đang mày mò học VBA và đang thử tạo mã NV bằng cách ghép tên và những chữ cái đầu trong họ và tên lót,
Mình có cách tạo mã nhân viên như sau:

1./ Mã luôn có độ dài là 5 kí tự (có thể có kí số)
2./ Mã gồm 2 thành tố: Fần đặt tính & fần định trị (giống như số logaric, nhỉ)
Fần đầu gồm 3 kí tự của họ & tên nhân viên; Ví du:

Trần Văn Hướng: TVH;
Trịnh Hương: TJH
Trà Đình Đạt: TFF
Trừ Nguyễn Thanh Thế: TTT
Ôn Như Hầu: ONH
Trần A Ửng: TAU

Fần sau gồm 2 kí số (hay kí tự nếu cần) để fân biệt khi fần đầu của mã trùng nhau, như
Nguyễn Văn Dương : NVD00
Ngô Vũ Dưỡng: NVD01
Nguyễn Võ Dừa: NVD09
. . . .

Dùng mã loại này có tính tương tác giữa người có mã & người quản lí mã. Bạn có thấy thế không?
 
Upvote 0
Xin hỏi: Với tên Ông Văn Ẩn thì bạn muốn trả về kết quả gì?
- Nếu kết quả là ÔVẨ thì không có gì đáng nói
- Nếu kết quả bạn muốn là OVA thì e rằng phải bàn tiếp
- Ngoài ra nếu chuỗi nhập liệu trên bảng tính có mã Unicode tổ hợp thì lại rắc rối tiếp tập 2
- Những chuyện vặt như trong chuỗi có khoảng trắng thừa bạn cũng nên lưu tâm tới nhé
----------------
Tôi phải nói tất cả những điều trên bởi: ĐỜI ĐÂU ĐẸP NHƯ MƠ
Dạ cảm ơn thầy đã góp ý giúp em ạ. trong trường hợp em đang dùng thì kết quả em cần là ÔVẤ ạ, e đã tạo một function bỏ dấu nữa rồi ạ. Hôm nay em vô tình đọc tên mail outlook ở công ty em được tạo theo quy tắc này nên e muốn thử để học viết thôi ạ. E sẽ còn phải học hỏi nhiều ạ.
 
Upvote 0
Mình có cách tạo mã nhân viên như sau:

1./ Mã luôn có độ dài là 5 kí tự (có thể có kí số)
2./ Mã gồm 2 thành tố: Fần đặt tính & fần định trị (giống như số logaric, nhỉ)
Fần đầu gồm 3 kí tự của họ & tên nhân viên; Ví du:

Trần Văn Hướng: TVH;
Trịnh Hương: TJH
Trà Đình Đạt: TFF
Trừ Nguyễn Thanh Thế: TTT
Ôn Như Hầu: ONH
Trần A Ửng: TAU

Fần sau gồm 2 kí số (hay kí tự nếu cần) để fân biệt khi fần đầu của mã trùng nhau, như
Nguyễn Văn Dương : NVD00
Ngô Vũ Dưỡng: NVD01
Nguyễn Võ Dừa: NVD09
. . . .

Dùng mã loại này có tính tương tác giữa người có mã & người quản lí mã. Bạn có thấy thế không?
Dạ em cảm ơn c đã góp ý ạ. Bên e thực tế e đang theo dõi mã nhân viên chính là mã số thuế cá nhân chứ e cũng k theo dõi bằng cách này nên e cũng chưa lường tới khi học viết code ạ. E chỉ thử tạo cho mình một bài toán đơn giản để thử giải bằng code nhưng code của em nó còn hơi hướng nhiều của hàm excel nên vẫn còn khá lủng củng. Em sẽ thử viết theo cách thêm hậu tố xem sao ạ
 
Upvote 0
E đang mày mò học VBA và đang thử tạo mã NV bằng cách ghép tên và những chữ cái đầu trong họ và tên lót, e tạo các function riêng biệt trong đó có function lấy những chữ đầu trong họ và tên lót như bên dưới ạ


E làm dựa trên hàm excel nên thấy code còn khá dài và rắc rối. Mong các anh chị có thể giúp em rút gọn công thức trên hoặc trong VBA có cách khác có thể xử lý ngắn gọn hơn không ạ. E xin cảm ơn!
Hàm của bạn nếu chuỗi bắt đầu bằng dấu cách sẽ ra kết quả sai, để khắc phục nên dùng lệnh chuoi=trim(chuoi) hoặc chuoi=application.worksheetfunction.trim(chuoi) ở đầu hàm (cách 2 hay hơn do xóa tất cả ký tự trắng thừa trong khi cách 1 chỉ xóa ở đầu và cuối chuỗi).
Hàm VBA có tính năng tương tự Substitute trong sheet là Replace.
Ví dụ code sau tìm từng ký tự trắng rồi thêm ký tự kế tiếp vào chuỗi kết quả, sau đó xóa ký tự cuối đi:
Mã:
Function TachChuoi$(chuoi$)
    Dim i&
    chuoi = Application.WorksheetFunction.Trim(chuoi)
    Do
        TachChuoi = TachChuoi & Mid(chuoi, i + 1, 1)
        i = InStr(i + 1, chuoi, " ")
    Loop Until i = 0
    i = Len(TachChuoi)
    If i > 1 Then TachChuoi = Left(TachChuoi, i - 1)
    TachChuoi = LCase(TachChuoi)
End Function
 
Upvote 0
(3)Dạ em cảm ơn c đã góp ý ạ.
Bên e thực tế e đang theo dõi mã nhân viên chính là mã số thuế cá nhân chứ e cũng k theo dõi bằng cách này nên e cũng chưa lường tới khi học viết code ạ.
(1) E chỉ thử tạo cho mình một bài toán đơn giản để thử giải bằng code;
Nhưng code của em nó còn hơi hướng nhiều của hàm excel nên vẫn còn khá lủng củng.
(2)Em sẽ thử viết theo cách thêm hậu tố xem sao ạ

(1) Rất hoan hô & ủng hộ hoàn toàn suy nghĩ của bạn trong vấn đề chinh fục VBA.
Nhưng trước khi suy nghĩ để tạo ra 1 bộ mã mới, ta nghĩ xem tại sao mã số thuế hay mã định danh từng người đã & đang được Nhà nước hình thành luôn có độ dài như nhau
Ta nên nghiền ngẫm thêm các mã đã có xung quanh ta, như mã thể BHXH, BHYT,. . .
Giải tỏa được câu hỏi: Tại sao người ta fải làm vậy? là cả vấn đề, bạn có thấy thế không?
(Riêng mình thì thấy mã định danh 12 hay 15 số gì đó là quá dài;. . . . )

Mã mà bạn định tạo ra chưa lường tới các nguyên âm & chữ cái 'Đ'
Vì sao ư, vì ở đất nước ta thống nhất đã trên nữa đời 1 con người rồi, nhưng Font chữ thì mỗi nơi 1 fách & chả ai chịu nhường ai!
Đã vậy, ta nên tạo trong mã với những chữ cái tiếng anh mà thôi! Dù có iêu thương tiếng Việt cách mấy, thì cũng không nên tạo mã chứa nguyên âm tiếng Việt & 'Đ'

(2) Nếu bạn có thời gian & hứng thú với bộ mã do mình gợi í trên, thì mình gợi í tiếp chương trình tạo ra nó; như sau:

a./ Tạo vòng lặp đẩ lấy các chữ cái trong từ 'Họ & tên', như Nguyễn Trường Thiên Lý => NTTL ( Trần Ứng => TỨ)
b./ Thay nguyên âm tiếng Việt bỡi nguyên âm tiếng Anh tương ứng & 'Đ' => 'F'
Tạo vòng lặp duyện nhóm từ vừa nhận được;
b.0: Trước khi duyệt, xét nếu độ dài nhóm từ chỉ có 2 thì ta thêm kí tự 'J' vô giữa;
B.1: Nếu trong khi duyệt, ta gặp nguyên âm có dấu tiếng Việt (như Ấ, Ă, Ố,. . .) ta tra bảng để thay thế bằng nguyên âm tiếng Anh tương ứng; 'Đ' đước thay bỡi 'F'
(Bảng này bạn tự lập từ trước; Còn tại sao fải cài thêm 'J' & 'F' thì bạn tự suy nghĩ trước xem sao)
c./ Nếu nhóm từ có độ dài trên 3 thì ta cách bỏ bớt, chỉ lấy từ đầu & 2 từ cuối.
d./ Thêm chuỗi "00" cho đủ độ dài mã
e./ Tiến hàng sắp xếp danh sách họ tên & cột mã mới tạo ra từ hàm theo tăng hay giảm dần của mã
f./ Viết macro để thêm hậu tố cho những mã trùng./.

(3) Chữ 'c' đó không đúng!
Chúc vui & thành công!
 
Upvote 0
(1) Rất hoan hô & ủng hộ hoàn toàn suy nghĩ của bạn trong vấn đề chinh fục VBA.
Nhưng trước khi suy nghĩ để tạo ra 1 bộ mã mới, ta nghĩ xem tại sao mã số thuế hay mã định danh từng người đã & đang được Nhà nước hình thành luôn có độ dài như nhau
Ta nên nghiền ngẫm thêm các mã đã có xung quanh ta, như mã thể BHXH, BHYT,. . .
Giải tỏa được câu hỏi: Tại sao người ta fải làm vậy? là cả vấn đề, bạn có thấy thế không?
(Riêng mình thì thấy mã định danh 12 hay 15 số gì đó là quá dài;. . . . )

Mã mà bạn định tạo ra chưa lường tới các nguyên âm & chữ cái 'Đ'
Vì sao ư, vì ở đất nước ta thống nhất đã trên nữa đời 1 con người rồi, nhưng Font chữ thì mỗi nơi 1 fách & chả ai chịu nhường ai!
Đã vậy, ta nên tạo trong mã với những chữ cái tiếng anh mà thôi! Dù có iêu thương tiếng Việt cách mấy, thì cũng không nên tạo mã chứa nguyên âm tiếng Việt & 'Đ'

(2) Nếu bạn có thời gian & hứng thú với bộ mã do mình gợi í trên, thì mình gợi í tiếp chương trình tạo ra nó; như sau:

a./ Tạo vòng lặp đẩ lấy các chữ cái trong từ 'Họ & tên', như Nguyễn Trường Thiên Lý => NTTL ( Trần Ứng => TỨ)
b./ Thay nguyên âm tiếng Việt bỡi nguyên âm tiếng Anh tương ứng & 'Đ' => 'F'
Tạo vòng lặp duyện nhóm từ vừa nhận được;
b.0: Trước khi duyệt, xét nếu độ dài nhóm từ chỉ có 2 thì ta thêm kí tự 'J' vô giữa;
B.1: Nếu trong khi duyệt, ta gặp nguyên âm có dấu tiếng Việt (như Ấ, Ă, Ố,. . .) ta tra bảng để thay thế bằng nguyên âm tiếng Anh tương ứng; 'Đ' đước thay bỡi 'F'
(Bảng này bạn tự lập từ trước; Còn tại sao fải cài thêm 'J' & 'F' thì bạn tự suy nghĩ trước xem sao)
c./ Nếu nhóm từ có độ dài trên 3 thì ta cách bỏ bớt, chỉ lấy từ đầu & 2 từ cuối.
d./ Thêm chuỗi "00" cho đủ độ dài mã
e./ Tiến hàng sắp xếp danh sách họ tên & cột mã mới tạo ra từ hàm theo tăng hay giảm dần của mã
f./ Viết macro để thêm hậu tố cho những mã trùng./.

(3) Chữ 'c' đó không đúng!

Chúc vui & thành công!
- Dạ chữ "C" vẫn đúng ạ nhưng e nên thành cháu ạ :) cháu tự ý dịch tên c thành Hải Yến (cháu quê biển số xe 17 ạ)

- Code tạo cái này của cháu gồm 3 phần cơ ạ, cháu làm thành Addin luôn nên muốn tách code để sử dụng được trong nhiều trường hợp, 1 function tách tên, họ và tên lót. 1 function bỏ dấu tiếng việt và function này để lấy ký tự đầu của họ và tên lót thôi ạ nên những phụ âm hoặc nguyên âm tiếng việt đều có thể chuyển sang phụ âm và nguyên âm tương ứng không dấu ạ. cháu mới học nên cũng vẽ vời lắm ạ :D

- Cháu đã từng gặp một vấn đề về theo dõi tên và tạo mã tương ứng nhưng do 2 file theo dõi 2 năm có 2 người giống tên nhau nên khi vlookup cháu bê nguyên thông tin của người cũ sang trong khi người cũ đã nghỉ, khi kiểm tra lại thì cháu mới phát hiện ra, hơn nữa bên cháu có nhiều hơn 2 người sẽ thêm mới và sử dụng thông tin nhân viên nên vấn đề font chữ cũng là vấn đề nên anh bên cháu chuyển sang yêu cầu tham chiếu bằng mã số thuế hoặc chứng minh thư cho chính xác :).


một lần nữa cháu cảm ơn chú đã gợi ý ạ, cháu phải bắt tay vào làm mới thấy đc vướng mắc ạ, mong chú vẫn sẽ ghé qua để lại một vài gợi ý cho cháu ạ. Cháu cảm ơn
 
Upvote 0

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

Back
Top Bottom