Xử lý số liệu excel

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

pingping2288

Thành viên chính thức
Tham gia
1/11/11
Bài viết
86
Được thích
1
Em có file như thế này, mình có số liệu nguồn. Mọi người cho em hỏi có marco hay hàm nào để ra được bước số liệu cuối cùng như trong file mà không phải làm các bước thủ công không ạ? Trong file em phải làm qua rất nhiều bước mới ra được kết quả cuối cùng, mà bước ngại nhất là phải copy ra word để xử lý ạ?
 

File đính kèm

Em có file như thế này, mình có số liệu nguồn. Mọi người cho em hỏi có marco hay hàm nào để ra được bước số liệu cuối cùng như trong file mà không phải làm các bước thủ công không ạ? Trong file em phải làm qua rất nhiều bước mới ra được kết quả cuối cùng, mà bước ngại nhất là phải copy ra word để xử lý ạ?
Như mình đã nói ở bài trước của bạn, bạn phải nói rõ máy của bạn đang dùng dấu . hay , để phân cách thập phân. Có vậy mới có giải pháp được nhé.
Mình có làm cho bạn từ ô j8 đến l8, bạn tham khảo. Điều kiện là luôn có 4 số sau dấu . ở cột A.
 

File đính kèm

Lần chỉnh sửa cuối:
Như mình đã nói ở bài trước của bạn, bạn phải nói rõ máy của bạn đang dùng dấu . hay , để phân cách thập phân. Có vậy mới có giải pháp được nhé.
Mình có làm cho bạn từ ô j8 đến l8, bạn tham khảo. Điều kiện là luôn có 4 số sau dấu . ở cột A.
Bạn có thể tự tìm lấy, và sử dụng nếu công thức không quá phức tạp.
Thập phân =IF(mid(1/2,2,1)=".", "chấm", "phẩy")
Trong VBA cũng tương tự.
 
Như mình đã nói ở bài trước của bạn, bạn phải nói rõ máy của bạn đang dùng dấu . hay , để phân cách thập phân. Có vậy mới có giải pháp được nhé.
Mình có làm cho bạn từ ô j8 đến l8, bạn tham khảo. Điều kiện là luôn có 4 số sau dấu . ở cột A.
Máy em dùng định dạng Việt Nam, nghĩa là số 12,34 (mười hai phẩy ba tư); 1.000 (Một ngàn). Giờ làm cách nào chỉ cần xử lý 1 lần để cột A ra kết quả thành cột N mà không phải qua các bước trung gian. Em xin cám ơn ạ!
 
Lần chỉnh sửa cuối:

Dùng tạm, dữ liệu phải chuẩn y mới được, chưa lường hết các tình huống nguy hiểm.
=ToadoCuoi(A3;$J$1:$L$1)

Mã:
Option Explicit
'Option Base 1
Function ToadoCuoi(ToadoTruoc As Range, GiatriTang As Range)
Dim ArrToadoTruoc, ArrGiatriTang, ArrToadoCuoi
Dim i&
ArrToadoTruoc = Split(ToadoTruoc, ",")
ArrGiatriTang = GiatriTang.Value
ReDim ArrToadoCuoi(1 To 3)
For i = 1 To 3 Step 1
ArrToadoCuoi(i) = CDbl(ArrToadoTruoc(i - 1)) + ArrGiatriTang(1, i)
Next
ToadoCuoi = Join(ArrToadoCuoi, ",")
End Function
 
Em có file như thế này, mình có số liệu nguồn. Mọi người cho em hỏi có marco hay hàm nào để ra được bước số liệu cuối cùng như trong file mà không phải làm các bước thủ công không ạ? Trong file em phải làm qua rất nhiều bước mới ra được kết quả cuối cùng, mà bước ngại nhất là phải copy ra word để xử lý ạ?
Bạn thử tham khảo, hàm tự tạo.
Mã:
Function KetQua(nguon As String, a As Long, b As Long, c As Long) As String
Dim x:
x = Split(nguon, ",")
KetQua = x(0) + a & "," & x(1) + b & "," & x(2) + c
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Em có file như thế này, mình có số liệu nguồn. Mọi người cho em hỏi có marco hay hàm nào để ra được bước số liệu cuối cùng như trong file mà không phải làm các bước thủ công không ạ? Trong file em phải làm qua rất nhiều bước mới ra được kết quả cuối cùng, mà bước ngại nhất là phải copy ra word để xử lý ạ?
Bạn tham khảo code cùi bắp sau (Cho đủ 5 từ)
Mã:
Sub pingping2828()
Dim i&, Lr&
Dim N1, N11, N12, N13
Dim N2, N21, N22, N23
Dim N3, N31, N32, N33
Dim Arr(), KQ(), S
With Sheet1
    Lr = .Cells(10000, 1).End(3).Row
    Arr = .Range("A3:A" & Lr).Value
    ReDim KQ(1 To UBound(Arr), 1 To 1)
    For i = 1 To UBound(Arr)
        S = Split(Mid(Arr(i, 1), 1, Len(Arr(i, 1)) - 1), ",")
        N1 = (--(S(0)) / 10000 + .[J1]): N11 = Split(N1, ",")(0): N12 = Split(N1, ",")(1): N13 = N11 & "." & N12
        N2 = (--S(1)) / 10000 + .[K1]: N21 = Split(N2, ",")(0): N22 = Split(N2, ",")(1): N23 = N21 & "." & N22
        N3 = (--S(2)) / 10000 + .[L1]: N31 = Split(N3, ",")(0): N32 = Split(N3, ",")(1): N33 = N31 & "." & N32
        KQ(i, 1) = N13 & "," & N23 & "," & N33
    Next i
        .Range("N3").Resize(10000, 1).ClearContents
        .Range("N3").Resize(i - 1, 1) = KQ
End With
MsgBox "Đa xong"
End Sub
Nhấn nút chạy code để xem và kiểm tra kết quả tại N3:N....
Bạn dùng hàm RandBetWeen(...) nên khi chạy code và Gán xuống Sheet thì hàm này đã chạy nên cho kết quả khác với kết quả của Randbetween(...)+F3, Rand...+G3, H3 trước khi chạy code.
 

File đính kèm

Bạn thử tham khảo, hàm tự tạo.
Mã:
Function KetQua(nguon As String, a As Long, b As Long, c As Long) As String
Dim x: x = Split(nguon, ","): KetQua = x(0) + a & "," & x(1) + b & "," & x(2) + c
End Function
Bạn biết nguồn gốc và nhiệm vụ của từ khóa ":" không?
Với thiết bị máy tính hiện nay, sử dụng ":" là một thói quen xấu.
 
Em có file như thế này, mình có số liệu nguồn. Mọi người cho em hỏi có marco hay hàm nào để ra được bước số liệu cuối cùng như trong file mà không phải làm các bước thủ công không ạ? Trong file em phải làm qua rất nhiều bước mới ra được kết quả cuối cùng, mà bước ngại nhất là phải copy ra word để xử lý ạ?
Nếu dấu phân cách thập phân là dấu "."
Mã:
=MID(A3,1,11)+RANDBETWEEN(100,900)/100&","&MID(A3,13,12)+RANDBETWEEN(100,900)/100&","&MID(A3,26,8)+RANDBETWEEN(10,110)/100
Dạng số theo Việt Nam xem công thức thứ 2 trong file
 

File đính kèm

Đây là trang "Hàm và công thức Excel" mà bác phi code cứ vèo vèo, em lưỡng lự mãi mới dám thò cái hàm tự tạo (cũng cùi bắp) ra đấy.
Là tôi thấy các bạn đưa code (hàm UDF) ra tôi mới dám đăng code của mình lên thôi mà. Quả thật là hàm thì tôi dốt, bài này thật sự không biết làm bằng hàm.
 
Dòng này nó báo lỗi là sao bác nhỉ?

1705242941312.png
 
Dòng này nó báo lỗi là sao bác nhỉ?

View attachment 298447
Lạ nhỉ? Chạy trên máy tôi thì OK. Không hiểu tại sao nữa?
Lúc đầu tôi khai báo các biến là N1&,N11&,.... thì chạy không ra kết quả. khi khai lại thành N1, N11, ... thì chạy được.
Tôi không có kiến thức cơ bản. Mong các anh chị có kiến thức uyên thâm ghé xem và giải thích giúp để tôi có thêm được 1 bài học nữa. Trân trọng cảm ơn.
 
Có thể khi đó N1 chỉ có 1 phần tử nên = Split(N1,",") (0) thì được. Còn = Split(N1,",") (1) thì sẽ lỗi chứ không liên quan vụ khai báo biến là gì.
Cảm ơn anh đã xem bài và giải thích. Nếu vậy thì code phải thêm dòng : On Error resume next ở ngay sau khi khai báo biến anh nhỉ?
 
Tiếp bài #9, nguồn gốc và nhiệm vụ của ":"

Ngày xưa, lúc BASIC mới ra đời như một ngôn ngữ tổng quát thì tiêu chuẩn của nó là:
- Mỗi lệnh dùng một dòng
- Mỗi dòng được bắt đầu bằng một con số, nhiệm vụ giống như Label ngày nay. Và mỗi dòng kết thúc bằng ký hiệu xuống dòng (newLine)
Với cách cổ điển này, mỗi con số dòng, tùy theo phiên bản mà có thể chiếm 4~12 bytes.

Với máy MainFrame (IBM xưa) thì có thể không ảnh hưởng bộ nhớ bao nhiêu. Nhưng với máy Midi (máy hạng trung) thì bộ nhớ khá giới hạn, bỏ ra bao nhiêu ấy bytes cho mỗi dòng thì cũng khổ. Vì vậy tiêu chuẩn BASIC ra thêm ký hiệu "thêm dòng", tức là ":". Tức là nhiều dòng có thể nối lại, với dấu ngăn cách ":". Sáng kiến này tiệt kiệm bộ nhớ khá đáng kể (với máy đời xưa).

Tiếp bài #9, ngày nay không nên dùng:

Người nào không quen với cách thức code của bạn sẽ vừa debug vừa chửi thề.

- Tiêu chuẩn BASIC là mỗi dòng, trừ cách lệnh khiển theo từ khóa (IF, FOR, DO,...) thì phải là một lệnh gán hoặc lệnh gọi hàm.

Người bình thường khi debug code thì cứ dựa vào vế bên trái của dòng để biết biến được gán vào lúc nào.
Khi gặp code có ":" thì cứ mỗi dòng lại xét xem bên phải có lệnh gán hay không. Rất bực mình.
Nhất là lệnh gán phần tử mảng, cả chục cái a(i,j) = b(i1, j1) đọc mệt bỏ bố.
 
Mình cũng đoán thế, nhưng chưa thử.
Hình như nếu N1 nó không thấy dấu "," thì phần tử (1) sẽ không tồn tại gây ra lỗi sao á
Nhưng mà bác ấy chạy ra kết quả, nhưng tớ tải về chạy thì báo lỗi ấy.
Trong lúc chờ đợi thì luyện thêm để tìm sơ hở:
=ToadoCuoi(A3;$J$1:$L$1)
hoặc
=ToadoCuoi(A3;$J$1:$L$1;",";";") nếu như có dạng: 528399 , 5486 ; 2494779 , 5947 ; 262 , 3365 ;

Mã:
Option Explicit
'Option Base 1
Function ToadoCuoi(ToadoTruoc As Range, GiatriTang As Range, Optional Dauthapphan$ = ".", Optional Daungan$ = ",")
Dim ArrToadoTruoc, ArrGiatriTang, ArrToadoCuoi
Dim i&
If Dauthapphan = "," Then
Daungan = ";"
End If
ArrToadoTruoc = Split(ToadoTruoc, Daungan)
ArrGiatriTang = GiatriTang.Value
ReDim ArrToadoCuoi(1 To 3)
For i = 1 To 3 Step 1
ArrToadoCuoi(i) = Replace(ArrToadoTruoc(i - 1), Dauthapphan, ".") + ArrGiatriTang(1, i)
Next
ToadoCuoi = Replace(Join(ArrToadoCuoi, Daungan), ".", Dauthapphan)
End Function
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom