Tạo hàm để tách số ra từ chuỗi bằng VBA (1 người xem)

Liên hệ QC

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

thangbithu

Thành viên thường trực
Tham gia
13/10/08
Bài viết
387
Được thích
485
Nghề nghiệp
Nhân sự
Tôi có 1 bài toán xin mô tả như sau:
Là bảng tính giờ công của công nhân, giờ công mỗi công nhân được ghi trên 1 hàng gồm 31 cell (tương ứng với 31 cột mà tiêu đề từng cột là ngày trong tháng (1, 2, 3, ...., 31). Dữ liệu trong từng cell :
- có thể là rỗng,
- có thể là số (nếu là số nguyên thì tối đa 2 chữ số ví dụ 8, 12; nếu là số thập phân thì phần đứng trước dấu "," tối đa 2 chữ số, phần đứng sau dấu "," tối đa 1 chữ số),
- có thể là chuỗi: gồm 3 loại dữ liệu kết hợp với nhau
+ Số: có cấu tạo giống như phần số nêu trên
+ ký tự : tối đa 2 ký tự, ví dụ: P, T, CO, TS, RO, H1, H2, H3 ...
+ dấu "/" : tối đa 2 dấu
+ cách kết hợp: 8P; 12,5CO ; 10,5H2 ; 4/4P; 11,5/2,5H3 ; 8P/4X ; 3/4P/1X ; 10,5/0,5X/3H2; 10,5CT/4P/1,5H2 (không có khoảng trắng ở giữa)
Ví dụ: từ ngày 1 đến ngày 10 trong tháng

Picture 1.jpg


Vấn đề đặt ra:
Trong từng cell phải tách được phần số và phần ký tự ra riêng để lấy sum, tuy nhiên có lấy sum hay không còn phụ thuộc vào ký tự đứng sau số đó, sau đó cộng tất cả các cell lại để có giờ công trong tháng, ví dụ: nếu lấy sum từ ví dụ trên sẽ như sau (ví dụ số đứng trước chữ CO và P không lấy sum)

Picture 2.jpg

Tôi đã tham khảo tuyệt chiêu 28: trích xuất dữ liệu số trong 1 chuỗi bằng VBA nhưng không giải quyết được yêu cầu nêu trên

Tôi cũng đã dùng các hàm có sẵn của excel (tôi đang dùng excel 2010) để xử lý bài toán trên và đã giải quyết được bằng cách kết hợp hàm mãng, SUM, IF, ISERROR, ISNUMBER, MATCH, LEFT, RIGHT, MID, FIND, SUBSTITUDE ... nhưng hàm quá dài, thậm chí excel thông báo là đã vượt số ký tự cho phép trong công thức.

Tôi muốn dùng VBA để viết hàm tách số và tách phần chữ trong điều kiện cụ thể nêu trên để giảm bới độ dài công thức nhưng không biết về VBA

Hãy giúp tôi với

Xin cảm ơn trước
 

File đính kèm

Lần chỉnh sửa cuối:
Mấy cái bảng ví dụ của bạn không xem được. Sau khi gửi bài bạn cũng nên xem lại nó một chút chứ.
Nếu bạn không biết cách tạo bảng thì hãy làm nó trong Excel rồi gửi file lên.
 
Upvote 0
Xin lỗi các bạn, mình chỉnh lại rồi, cảm ơn các bạn
 
Upvote 0
Của bạn đây, test lại xem có bị lỗi gì không
PHP:
Function GioCong(Rng As Range) As Double
Dim Str As String
Str = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(Rng.Value)), "/") & "/0"
With CreateObject("VBScript.RegExp")
    .Global = True
    .IgnoreCase = True
    .Pattern = "[^/]*(P|CO)"
    Str = .Replace(Str, "")
    .Pattern = "[^0-9,/][^/]*"
    Str = .Replace(Str, "")
    .Pattern = "/+"
    Str = .Replace(Str, "+")
End With
Str = Replace(Replace(Str, " ", "+"), ",", ".")
GioCong = Evaluate(Str)
End Function
 
Upvote 0
Nhanh quá, cảm ơn Bạn rất nhiều nhưng mình hơi "lúa" nên bạn chịu khó hướng dẫn mình cụ thể cách tạo hàm, cách sử dụng hàm như thế nào, cú pháp của hàm?

Chịu khó hướng dẫn mình một tí nhé. Cảm ơn bạn nhiều.
 
Upvote 0
Bạn tải file đính kèm bên dưới về, mở lên và làm theo hình hướng dẫn trong đó. Sau này bạn lấy file này để tính toán luôn.
Lưu ý: Mỗi lần mở file đều phải thực hiện thao tác như hình trong file.
 

File đính kèm

Upvote 0
Cảm ơn bạn nhiều, còn nếu muốn sum các số đứng trước chữ P và CO thì viết code thế nào? Giúp mình với nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Bác huuthang_bd ơi, giải pháp của Bác thật tuyệt, mình làm thử ok rồi.
Bác giúp mình thêm tí nữa nhé:
- làm sao để lấy sum các số đứng trước chữ P, CO (là những chữ mà hàm ở trên không lấy sum)?
- làm sao để lấy sum các con số chỉ đứng 1 mình, không đi kèm với chữ nào, ví dụ: Sum(4,5 ; 4/4H2; 10/4P/4X) = 18,5 ?
Thật sự là bài toán của mình còn nhiều vấn đề nhưng chỉ sợ đưa lên đây dài quá phiền anh em, mình chỉ mong anh em giải quyết giúp một số vấn đề cơ bản thôi, còn lại mình sẽ tự nghiên cứu tiếp. Cảm ơn Bác huuthang trước nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
ví dụ mình có chuỗi như vầy Bê tông trục 11 : 2*4*6 khi dung ham cua ban no nhan voi so 11 luon, cú pháp mình luôn tách ra bởi dấu : bạn có thể giúp ko
 
Upvote 0
Web KT

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

Back
Top Bottom