Cần giúp: Tách phần công thức trong chuỗi ra để tính toán (8 người xem)

Liên hệ QC

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

xuongrongdat

Có bao giờ bạn tự hỏi "Tôi là ai?"
Tham gia
30/6/08
Bài viết
1,703
Được thích
1,577
Donate (Momo)
Donate
Nghề nghiệp
Vô tư cùng bạn bè đi khắp nơi.
Tôi tính lương 250 người. Theo yêu cầu của bên phòng Kế toán thì tính xong phải ghi chú cách tính chi tiết lương từng người ngay bên dưới bảng lương (cột B) để người lao động xem tự kiểm tra được, và ô kiểm tra dòng công thức ghi chú có đúng kết quả không (cột K) để nhân viên kế toán nhìn dễ đối chiếu.
Nhờ các chú bác, anh chị giúp dùm công thức ở cột K. Nó phải y như trong file tôi gửi.
Cột B hoàn toàn bằng text hết và có cấu trúc chung giữa 2 dấu "=" y chang nguyên cột.
1598521315584.png

Trong hình và file tôi đã điền sẵn cột K để minh họa. Tôi làm thủ công đó.
Tôi cảm ơn.

PS: tôi còn đang khổ tâm cái vụ ghi chú lương chi tiết cho từng người. Tôi phải gõ tay cho từng người luôn. Đang suy nghĩ làm sao cho nhanh hơn, giờ mỗi khi làm phải mất 1 ngày mới xong vì phải làm xong rồi kiểm tra thật kỹ mới đưa qua phòng Kế toán kiểm tra chéo.
 

File đính kèm

Lần chỉnh sửa cuối:
Là sao ta. Có phải là coi như cột K chưa có gì, làm cách nào để được cột K giống y như trong file của bạn?
 
Tôi tính lương 250 người. Theo yêu cầu của bên phòng Kế toán thì tính xong phải ghi chú cách tính chi tiết lương từng người ngay bên dưới bảng lương (cột B) để người lao động xem, và ô kiểm tra dòng công thức có ghi chú có đúng kết quả không (cột K) để nhân viên kế toán nhìn dễ đối chiếu.
Nhờ các chú bác, anh chị giúp dùm công thức ở cột K. Nó phải y như trong file tôi gửi.
Cột B hoàn toàn bằng text hết và có cấu trúc chung giữa 2 dấu "=" y chang nguyên cột.
View attachment 244262

Tôi cảm ơn.
Bạn sử dụng Text to columns, phân tách bởi dấu"=" là được
 
Là sao ta. Có phải là coi như cột K chưa có gì, làm cách nào để được cột K giống y như trong file của bạn?
Đúng rồi anh.
Bạn sử dụng Text to columns, phân tách bởi dấu"=" là được
À, xong cái mình replace all dấu "." phân cách hàng ngàn bằng "" là xong hén. Để mình mò thử. Thanks bạn.
 
Tôi tính lương 250 người. Theo yêu cầu của bên phòng Kế toán thì tính xong phải ghi chú cách tính chi tiết lương từng người ngay bên dưới bảng lương (cột B) để người lao động xem, và ô kiểm tra dòng công thức có ghi chú có đúng kết quả không (cột K) để nhân viên kế toán nhìn dễ đối chiếu.
Nhờ các chú bác, anh chị giúp dùm công thức ở cột K. Nó phải y như trong file tôi gửi.
Cột B hoàn toàn bằng text hết và có cấu trúc chung giữa 2 dấu "=" y chang nguyên cột.
View attachment 244262

Trong hình và file tôi đã điền sẵn cột K để minh họa. Tôi làm thủ công đó.
Tôi cảm ơn.

PS: tôi còn đang khổ tâm cái vụ ghi chú lương chi tiết cho từng người. Tôi phải gõ tay cho từng người luôn. Đang suy nghĩ làm sao cho nhanh hơn, giờ mỗi khi làm phải mất 1 ngày mới xong vì phải làm xong rồi kiểm tra thật kỹ mới đưa qua phòng Kế toán kiểm tra chéo.
Nghĩa là bạn có 1 cột tính công thức ở đâu đó như cột K trong file
1. Giờ bạn phải gõ ghi chú công thức vào phần cuối cột B ( Ctrl ~ copy công thức sang 1 cột khác dạng text) Sau đó làm hàm nối chuỗi lại.
2. Sau đó bạn lại phải làm từ cột B để có công thức như cột K (Hàm Evaluate)
 
Nghĩa là bạ có 1 cột tính công thức ở đâu đó như cột K trong file
1. Giờ bạn phải gõ ghi chú công thức vào phần cuối cột B
2. Sau đó bạn lại phải làm từ cột B để có công thức như cột K
Đúng rồi á. Mà để ghi chú được cột B thì phải qua 1 loạt tính toán rồi á.
Bạn xem giúp thử file: (Cửa hàng 01 mình đã làm hoàn thiện rồi)
1598522188148.png
 

File đính kèm

Đúng rồi á. Mà để ghi chú được cột B thì phải qua 1 loạt tính toán rồi á.
Bạn xem giúp thử file: (Cửa hàng 01 mình đã làm hoàn thiện rồi)
View attachment 244266
Tôi hiểu file này rồi, để tối tôi thử xem bạn sẽ bớt phần gõ tay. từ ô B18 đến B22. Nhưng mục nghỉ phép bao nhiêu ngày trong ô B 18 đến B22 thì chắc công thức không làm được ( hoặc không có số liệu để làm)
Mục cột K còn lại nếu bạn tự tin về số tiền bạn tính đúng thì bạn lấy số tiền sau dấu bằng cuối cùng. Hoặc dùng Evaluate để tính toán. (phải thêm 1 cột phụ để tách đoạn công thức tính lương đó ra)
 
Đúng rồi á. Mà để ghi chú được cột B thì phải qua 1 loạt tính toán rồi á.
Bạn xem giúp thử file: (Cửa hàng 01 mình đã làm hoàn thiện rồi)
View attachment 244266
Đúng ra bảng nó phải theo kiểu Tên|ngày bắt đầu nghỉ|ngày kết thúc nghỉ|lý do nghỉ| ....
Kiểu như vậy chứ? ai mà làm một chuỗi tùm lum vậy. lấy ra cũng khổ mà nhập vào cũng khổ
P/s: mà cty nghỉ thứ 678 thì giành ở nhà mà nghiên cứu đi chứ, hỏi chi haha
 
Tôi hiểu file này rồi, để tối tôi thử xem bạn sẽ bớt phần gõ tay. từ ô B18 đến B22. Nhưng mục nghỉ phép bao nhiêu ngày trong ô B 18 đến B22 thì chắc công thức không làm được ( hoặc không có số liệu để làm)
Có á, file Bảng chấm công của từng Cửa hàng. Mình phải xin 50 Cửa hàng trưởng nữa (chắc là quên nó đi, thấy cũng mắc công lắm). Vì họ in ra giấy rồi gửi về công ty hàng tháng. Còn cái bảng này là tổng hợp 1 Quý lận. Tui phải tổng hợp cộng lại hết 3 tháng trong 1 Quý để ghi chú. Làm thủ công rất nhiều luôn.

Đây là Bảng tính lương cho phần sản lượng từng Cửa hàng bán vượt chỉ tiêu trong Quý á.
Đúng ra bảng nó phải theo kiểu Tên|ngày bắt đầu nghỉ|ngày kết thúc nghỉ|lý do nghỉ| ....
Kiểu như vậy chứ? ai mà làm một chuỗi tùm lum vậy. lấy ra cũng khổ mà nhập vào cũng khổ
Bạn xem file mình gửi ở bài #7 chưa? Đây là Bảng tính lương cho phần sản lượng từng Cửa hàng bán vượt chỉ tiêu trong Quý á.
Kiểu bạn nói là bên file Bảng chấm công ở từng Cửa hàng á. Mình thì làm tại Văn phòng công ty. :(
 
Cái này mà hỏi ở chuyên mục hàm và công thức thì thua rồi :rolleyes:
 
Cái này mà hỏi ở chuyên mục hàm và công thức thì thua rồi :rolleyes:
Giúp em công thức cột K thôi anh. Cột B để em tìm cách.

Cột K em suy nghĩ vầy:
1. Dùng Mid cắt chuỗi ở cột B ra để được chuỗi từ dấu "=" thứ nhất đến trước dấu "=" thứ hai 2 ký tự.
2. Xong Substitute dấu "." thành "" (chuỗi 1.)
3. Xong Evaluate (chuỗi 2.) => ủa thấy bà, hàm này không có sẵn. Bị @n0thing1988 lừa. =))

Đúng không anh? Tại em chưa làm được 1. nên cũng chưa thử được 2. và 3. :|
 
Giúp em công thức cột K thôi anh. Cột B để em tìm cách.

Cột K em suy nghĩ vầy:
1. Dùng Mid cắt chuỗi ở cột B ra để được chuỗi từ dấu "=" thứ nhất đến trước dấu "=" thứ hai 2 ký tự.
2. Xong Substitute dấu "." thành "" (chuỗi 1.)
3. Xong Evaluate (chuỗi 2.) => ủa thấy bà, hàm này không có sẵn. Bị @n0thing1988 lừa. =))

Đúng không anh? Tại em chưa làm được 1. nên cũng chưa thử được 2. và 3. :|
Làm được. Nhưng cuối cùng công thức bạn nhìn thấy trong cột K là cái gì? Kế toán có kiểm tra được theo yêu cầu không? Nếu lấy kết quả thì lấy thẳng ở cuối chuỗi cột B cho nó nhanh, Evaluate chi cho cực.
 
Mình có công thức này rất tiện cho bạn nhá. Mình có xét thêm trường hợp bạn đánh có chỗ là "vnd" và có chỗ lại là "đ"
Công thức ở cột K18 như sau:
=SUBSTITUTE(TRIM(MID(SUBSTITUTE(TRIM(B18)," ",REPT(" ",LEN(TRIM(B18)))),(LEN(TRIM(B18))-LEN(SUBSTITUTE(B18," ",""))-1)*LEN(TRIM(B18))+1,LEN(TRIM(B18)))),".",",")

Anh minh họa này:
1598526827703.png
 

File đính kèm

Lần chỉnh sửa cuối:
Giúp em công thức cột K thôi anh. Cột B để em tìm cách.

Cột K em suy nghĩ vầy:
1. Dùng Mid cắt chuỗi ở cột B ra để được chuỗi từ dấu "=" thứ nhất đến trước dấu "=" thứ hai 2 ký tự.
2. Xong Substitute dấu "." thành "" (chuỗi 1.)
3. Xong Evaluate (chuỗi 2.) => ủa thấy bà, hàm này không có sẵn. Bị @n0thing1988 lừa. =))

Đúng không anh? Tại em chưa làm được 1. nên cũng chưa thử được 2. và 3. :|
Evaluate là làm đươc theo yêu cầu của bạn ngay. Nhưng như anh Thắng nói đúng. Kế toán muốn kiểm tra thì để tự họ nghĩ công thức. Chứ bạn làm công thức cho họ xong rồi họ cũng biết đúng sai đâu.
 
Nếu lấy số cuối vậy thì thêm một cách nửa. Tại ô K18 công thức như sau:
Mã:
=--TRIM(LEFT(SUBSTITUTE(TRIM(RIGHT(SUBSTITUTE(B18," = ",REPT(" ",200)), 200))," ",REPT(" ",20)),20))
 
Vấn đề không phải làm sao để ra kết quả. Vì để kiểm tra kết quả của biểu thức trong phần ghi chú ở cột B nên công thức bắt buộc phải là biểu thức trong chuỗi ở cột B. Do đó chỉ có thể dùng macro, không thể dùng công thức.
 
Nếu bạn muốn tham khảo thêm VBA thì bạn xem ví dụ dưới đây:

Bạn để ý S_ viết tắc cho Sanbi_ , nếu bạn hay tận dụng các hàm do tôi viết, bạn sẽ quen.
------------------------------
JavaScript:
Option Explicit
#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
#If Win64 Then
  Private gTimerID As LongPtr, gTimerID2 As LongPtr
#Else
  Private gTimerID As Long, gTimerID2 As Long
#End If
Private Val1OArgs(), Val1OIndex As Integer
Function S_Val1(ByVal text) As Variant
  On Error Resume Next
  KillTimer 0&, gTimerID: gTimerID = 0
  S_Val1 = ""
  Dim K As Integer
  K = UBound(Val1OArgs)
  ReDim Preserve Val1OArgs(1 To K + 1)
  Val1OArgs(K + 1) = VBA.Array(text, Application.Caller)
  gTimerID = SetTimer(0&, 0&, 1, AddressOf S_Val1_callback)
End Function
Private Sub S_Val1_callback()
  On Error Resume Next
  Call KillTimer(0&, gTimerID): gTimerID = 0
  Call KillTimer(0&, gTimerID2): gTimerID2 = 0
  Dim UA As Integer
  UA = UBound(Val1OArgs)
  On Error GoTo 0
  If UA > 0 Then
    Val1OIndex = Val1OIndex + 1
    Val1OArgs(Val1OIndex)(1).Formula = "=" & S_Val3(Val1OArgs(Val1OIndex)(0))
    If Val1OIndex >= UA Then
      Erase Val1OArgs: Val1OIndex = 0
    Else
      gTimerID2 = SetTimer(0&, 0&, 1, AddressOf S_Val1_callback2)
    End If
  End If
End Sub
Private Sub S_Val1_callback2()
  S_Val1_callback
End Sub

Private Sub S_Val_test()
   S_Val2 ("TL = 1.013.030*20/78/5,34*1+1.013.030*33/78/4,34*1 = 147.396 d")
End Sub

Function S_Val2(text)
  S_Val2 = S_ValE("\= ((?:[\u0000-\u003C\u003E-\uFFFF])+) .{1,3}$", text)
  S_Val2 = CDec(Replace(S_Val2, ".", ""))
End Function

Function S_Val3(text)
  S_Val3 = S_ValE("(?:TL *= *)*(?:TL *= *)(.*?) *\=", text)
  If Application.International(xlDecimalSeparator) = "." Then
    S_Val3 = Replace(S_Val3, ".", "")
    S_Val3 = Replace(S_Val3, ",", ".")
  End If
End Function

Function S_ValE(ByVal pattern$, _
                ByVal text$, _
       Optional ByVal FrontText As String = "", _
       Optional ByVal BehindText As String = "", _
       Optional ByVal InSubMatches As Integer = -1, _
       Optional ByVal InMatchs As Integer = -1, _
       Optional ByVal bEvaluate As Boolean = False, _
       Optional ByVal bGlobal As Boolean = True, _
       Optional ByVal IgnoreCase As Boolean = True, _
       Optional ByVal bMulLine As Boolean = True, _
       Optional ByVal Delimiter As String = "")
  With VBA.CreateObject("VBScript.RegExp")
    .Global = bGlobal: .IgnoreCase = IgnoreCase: .MultiLine = bMulLine: .pattern = pattern
    Dim M, M2, N, N2, i%, j%, s$
    Set M = .Execute(text)
    If M.Count Then
      If InMatchs >= 0 Then
        If InMatchs < M.Count Then i = InMatchs: GoSub SubMatches
      Else
        For i = 0 To M.Count - 1: GoSub SubMatches: Next
      End If
      If s <> "" Then
        s = FrontText & s & BehindText
        If bEvaluate Then
          S_ValE = Application.Evaluate(s)
        Else
          S_ValE = s
        End If
      End If
    End If
  End With
Exit Function:
SubMatches:
  Set N = M(i).SubMatches
  If N.Count Then
    If InSubMatches >= 0 Then
      If InSubMatches < N.Count Then
        s = s & IIf(s = "", "", Delimiter) & N(InSubMatches)
      End If
    Else
      For j = 0 To N.Count - 1
        s = s & IIf(s = "", "", Delimiter) & N(j)
      Next
    End If
  Else
    s = s & IIf(s = "", "", Delimiter) & M(i)
  End If
Return
End Function
Function S_ValR(ByVal pattern$, _
                ByVal sReplace$, _
                ByVal text$, _
       Optional ByVal FrontText As String = "", _
       Optional ByVal BehindText As String = "", _
       Optional ByVal bEvaluate As Boolean = False, _
       Optional ByVal bGlobal As Boolean = True, _
       Optional ByVal IgnoreCase As Boolean = True, _
       Optional ByVal bMulLine As Boolean = True)
  With VBA.CreateObject("VBScript.RegExp")
    .Global = bGlobal: .IgnoreCase = IgnoreCase: .MultiLine = bMulLine: .pattern = pattern
    Dim s$
    If .test(text) Then
      s = FrontText & .Replace(text, sReplace) & BehindText
      If bEvaluate Then
        S_ValR = Application.Evaluate(s)
      Else
        S_ValR = s
      End If
    End If
  End With
End Function
 
Lần chỉnh sửa cuối:
Mình có công thức này rất tiện cho bạn nhá. Mình có xét thêm trường hợp bạn đánh có chỗ là "vnd" và có chỗ lại là "đ"
Công thức ở cột K18 như sau:
=SUBSTITUTE(TRIM(MID(SUBSTITUTE(TRIM(B18)," ",REPT(" ",LEN(TRIM(B18)))),(LEN(TRIM(B18))-LEN(SUBSTITUTE(B18," ",""))-1)*LEN(TRIM(B18))+1,LEN(TRIM(B18)))),".",",")
Cảm ơn bạn, nhưng bạn hiểu sai ý mình. Cột K mình muốn vừa hiển thị kết quả của dòng công thức trong Ghi chú, vừa biểu diễn được cả đoạn công thức ấy luôn. Như trong file bạn xem đó, Kế toán yêu cầu y như vậy.
Evaluate là làm đươc theo yêu cầu của bạn ngay. Nhưng như anh Thắng nói đúng. Kế toán muốn kiểm tra thì để tự họ nghĩ công thức. Chứ bạn làm công thức cho họ xong rồi họ cũng biết đúng sai đâu.
Uhm. Kế toán họ biết công thức hết chứ. Nhưng Kế toán trưởng yêu cầu tui làm giống trong file á. Lúc tui chuyển file cứng + file mềm qua phòng kế toán, chủ yếu họ sẽ xem file mềm trên máy tính dùng mắt thường nhìn kiểm tra cột B (coi ghi chú đúng không), coi cột K (công thức và kết quả khớp cột B không).
Chắc như anh Thắng và Sanbi nói thì yêu cầu của bài này phải xử lý bằng VBA hén? Tui chưa hiểu được những gì Sanbi viết.
Nếu bạn muốn tham khảo thêm VBA thì bạn xem ví dụ dưới đây:

Bạn để ý S_ viết tắc cho Sanbi_ , nếu bạn hay tận dụng các hàm do tôi viết, bạn sẽ quen.
------------------------------
Cảm ơn bạn. Mình chưa hiểu được những gì bạn viết, bạn thông cảm. :(

@huuthang_bd , @n0thing1988 : nếu đụng đến VBA thì định dạng file đâu còn là đuôi xlsx phải không? Nó chuyển sang thành xlam, xlsb, xlsm. Mà như vậy nó sẽ "khác" với định dạng chung xưa giờ của file Bảng lương năm này qua năm nọ của Công ty á. File này mình làm trực tiếp nhưng sau đó có ít nhất 5 người nữa (đa phần là cấp trên) xem qua.
Sao mình ngồi nghiệm nghiệm mà chưa ra giải pháp ta?!

Hiện tại mình đang xử lý thủ công ở cột K bằng cách sau: phủ khối dòng công thức bên cột B, sang cột K paste và Enter 2 lần, Excel sẽ tự fix bỏ các dấu "." phân cách hàng ngàn để ra kết quả luôn. Và mình vẫn đang làm từ từ như vậy trong khi chờ giải pháp khác.
Cảm ơn mọi người nhiều.
1598574615818.png
 
@huuthang_bd , @n0thing1988 : nếu đụng đến VBA thì định dạng file đâu còn là đuôi xlsx phải không? Nó chuyển sang thành xlam, xlsb, xlsm
Không nhất thiết phải như vậy. xlam là dạng add-in, một file khác không phải file làm việc của bạn, bạn dùng nó để xử lý file làm việc của bạn và kết quả hoàn toàn giống như làm bằng tay.
Nếu rảnh rỗi sẽ có giải pháp thỏa đáng cho bạn.
 
Web KT

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

Back
Top Bottom