Tính tỷ lệ sở hữu các cá nhân/pháp nhân trong Tập đoàn

Liên hệ QC

nhatminh.2810

Thành viên mới
Tham gia
9/2/18
Bài viết
5
Được thích
0
Giới tính
Nam
Xin chào các bác, nay em có bài toán này nhờ các bác giải đáp giúp.

Em đang có trong file là 1 bảng cơ cấu vốn và 1 bảng tỷ lệ sở hữu, câu hỏi đặt ra là làm thế nào để tính nhanh tỷ lệ sở hữu của 1 cá nhân (hoặc công ty) trong 1 công ty bất kỳ mà không cần phải mò lần từng ô một.

Trong file em có:
- Hàng dọc là các công ty, hàng ngang là các chủ sở hữu tương ứng
- Bảng màu cam là số vốn của mỗi công ty và phần góp của mỗi chủ đầu tư, bảng màu xanh là tỷ lệ sở hữu tương ứng (công thức từ bảng cam)

Ví dụ để tính tỷ lệ sở hữu của Mr. A tại Công ty C:
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty A: = D2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 33% ở Công ty C => 8%*33% = 3%)
- Tỷ lệ nắm giữ gián tiếp thông qua Công ty A: = D3*C2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 18% ở Công ty B, Công ty B nắm 50% ở Công ty C => 8%*18%*50% = 1%)
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty B: = D3*C5 (Mr.A nắm 36% ở Công ty B, Công ty B nắm 50% ở Công ty C => 36%*50% = 18%)

==> Tổng cộng tỷ lệ của Mr. A tại Công ty C là 22% như trong file

1648544172947.png
 

File đính kèm

  • Tính tỷ lệ sở hữu vốn.xlsx
    10.5 KB · Đọc: 7
Xin chào các bác, nay em có bài toán này nhờ các bác giải đáp giúp.

Em đang có trong file là 1 bảng cơ cấu vốn và 1 bảng tỷ lệ sở hữu, câu hỏi đặt ra là làm thế nào để tính nhanh tỷ lệ sở hữu của 1 cá nhân (hoặc công ty) trong 1 công ty bất kỳ mà không cần phải mò lần từng ô một.

Trong file em có:
- Hàng dọc là các công ty, hàng ngang là các chủ sở hữu tương ứng
- Bảng màu cam là số vốn của mỗi công ty và phần góp của mỗi chủ đầu tư, bảng màu xanh là tỷ lệ sở hữu tương ứng (công thức từ bảng cam)

Ví dụ để tính tỷ lệ sở hữu của Mr. A tại Công ty C:
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty A: = D2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 33% ở Công ty C => 8%*33% = 3%)
- Tỷ lệ nắm giữ gián tiếp thông qua Công ty A: = D3*C2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 18% ở Công ty B, Công ty B nắm 50% ở Công ty C => 8%*18%*50% = 1%)
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty B: = D3*C5 (Mr.A nắm 36% ở Công ty B, Công ty B nắm 50% ở Công ty C => 36%*50% = 18%)

==> Tổng cộng tỷ lệ của Mr. A tại Công ty C là 22% như trong file

1648544172947.png
Bài này thấy đăng mấy lần rồi mà.
 
Loại bài này không phải là chuyện của Excel hay VBA. Giải bằng VBA cũng được nhưng phép duyệt cây nhị phân rất luộm thuộm cho nên tôi không muốn viết.

Thớt nên đem qua bên góc "các ngôn ngữ lập trình khác" mà hỏi. Những ngôn ngữ mới như Python giải loại này cái vèo.

1649839587704.png

Hỏi riêng thớt: cái này là công việc hay tính đầu tư vậy?
- Nếu là công việc thì bảo chủ tăng lương, tính cái này là bậc cao của kế toán.
- Nếu là chuyện tính đầu tư thì đi tìm các công ty đầu tư xem họ dùng phần mềm gì?
Đây là chuyện tính toán đầu tư (cá nhơn hay cho công ty cũng vậy) cho nên nếu muốn tôi viết code VBA thì phải trả phí. Tôi không lấy phí cá nhơn cho mình. Nếu tôi viết thì thớt phải trả bằng cách "đóng góp vào diễn đàn".
Giá phí của tôi bỏ nhẹ là 240.000 đồng/giờ. Tôi bấm giờ đơn vị 6 phút (tức là mỗi đơn vị 24.000).
Nếu sau đó chỉnh sửa thêm thì giá 360.000 đồng/giờ.

Giá vậy là bèo lắm. Tôi nhớ có vị nào đó tính 200 đô mẽo một tiết dạy Xê-cọng-cọng. Mà đó chỉ là trình độ chôm code mạng, không có một tẹo kiến thức về Hướng Đối Tượng.
 
Mấy bác có căn bản lập trình nên có chuyện cây nhị phân, chứ tôi cứ theo bố trí trên trang tính mà duyệt, lấy số liệu, tính toán cộng trừ nhân chia thì ra kết quả. --=0
1649848994313.png
 
Lần chỉnh sửa cuối:
Tìm trong diễn đàn này, có bài viết code VBA đệ quy.
 
Tìm trong diễn đàn này, có bài viết code VBA đệ quy.
Đệ quy thì dễ rồi. Chỉ việc mò tới.
Thuật toán ưu hoá mới khó. Phải lập một sàng, cái nào tính rồi thì không tính lại.
Vả lại, bài toán của thớt còn chỗ rắc rối là có sở hữu vòng. Công ty B sở hữu 50% C nhưng C cũng sở hữu 45%, đệ quy sẽ đi đến bất tận nếu không có luật chận sở hữu vòng.
 
đệ quy sẽ đi đến bất tận nếu không có luật chận sở hữu vòng.
Lý ra sở hữu vòng phải được chặn từ luật pháp chứ không phải luật của code. Sở hữu vòng dễ bị lợi dụng để trốn thuế và rửa tiền.
 
Đệ quy thì dễ rồi. Chỉ việc mò tới.
Thuật toán ưu hoá mới khó. Phải lập một sàng, cái nào tính rồi thì không tính lại.
Vả lại, bài toán của thớt còn chỗ rắc rối là có sở hữu vòng. Công ty B sở hữu 50% C nhưng C cũng sở hữu 45%, đệ quy sẽ đi đến bất tận nếu không có luật chận sở hữu vòng.
Cho code đệ quy chạy thoải mái, khi kết quả - kết quả trước <= sai số cho phép thì dừng
 
Xin chào các bác, nay em có bài toán này nhờ các bác giải đáp giúp.

Em đang có trong file là 1 bảng cơ cấu vốn và 1 bảng tỷ lệ sở hữu, câu hỏi đặt ra là làm thế nào để tính nhanh tỷ lệ sở hữu của 1 cá nhân (hoặc công ty) trong 1 công ty bất kỳ mà không cần phải mò lần từng ô một.

Trong file em có:
- Hàng dọc là các công ty, hàng ngang là các chủ sở hữu tương ứng
- Bảng màu cam là số vốn của mỗi công ty và phần góp của mỗi chủ đầu tư, bảng màu xanh là tỷ lệ sở hữu tương ứng (công thức từ bảng cam)

Ví dụ để tính tỷ lệ sở hữu của Mr. A tại Công ty C:
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty A: = D2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 33% ở Công ty C => 8%*33% = 3%)
- Tỷ lệ nắm giữ gián tiếp thông qua Công ty A: = D3*C2*B5 (Mr.A nắm 8% ở Công ty A, Công ty A nắm 18% ở Công ty B, Công ty B nắm 50% ở Công ty C => 8%*18%*50% = 1%)
- Tỷ lệ nắm giữ trực tiếp thông qua Công ty B: = D3*C5 (Mr.A nắm 36% ở Công ty B, Công ty B nắm 50% ở Công ty C => 36%*50% = 18%)

==> Tổng cộng tỷ lệ của Mr. A tại Công ty C là 22% như trong file

1648544172947.png
Cách tính của bạn chưa tính đầy đủ tỷ lệ sở hữu khi có sở hữu chéo giữa các đơn vị, muốn tính đầy đủ làm theo cách bài 9# khá phức tạp
Tạm dùng hàm tự tạo TyleSH theo cách tính của bạn khá đơn giản, code cũng dể, nhưng tính bị thiếu khi có sở hữu chéo
Mã:
Option Explicit
Function TyleSH(ByVal rng As Range, ByVal ChuSH, ByVal cTy, Optional bTyLe As Boolean = True)
  Dim dic As Object, arr(), i&, res#

  Set dic = CreateObject("scripting.dictionary")
  If bTyLe = True Then arr = rng.Value Else arr = TinhTyLe(rng)
 
  For i = 2 To UBound(arr)
    dic.Add arr(i, 1), i
  Next i
  Call DeQuy(res, arr, dic, cTy, ChuSH, "," & ChuSH & ",", 1)
  Set dic = Nothing: Set rng = Nothing
  TyleSH = res
End Function

Private Sub DeQuy(ByRef res, ByRef arr, ByRef dic, ByRef cTy, ByVal sh$, ByVal tmp$, ByVal tl#)
  Dim i&, j&
  i = dic.Item(sh)
  For j = 2 To UBound(arr, 2)
    If arr(i, j) <> Empty Then
      If cTy = arr(1, j) Then
        res = res + tl * arr(i, j)
      ElseIf InStr(1, tmp, "," & arr(1, j) & ",") = 0 Then
        Call DeQuy(res, arr, dic, cTy, arr(1, j), tmp & arr(1, j) & ",", tl * arr(i, j))
      End If
    End If
  Next j
End Sub

Private Function TinhTyLe(ByRef rng)
  Dim arr(), tmp(), sRow&, sCol&, i&, j&
  arr = rng.Value
  sRow = UBound(arr): sCol = UBound(arr, 2)
  ReDim tmp(1 To sRow, 1 To sCol)
  For j = 2 To sCol
    For i = 2 To sRow
      tmp(1, j) = tmp(1, j) + arr(i, j)
    Next i
    For i = 2 To sRow
      arr(i, j) = arr(i, j) / tmp(1, j)
    Next i
  Next j
  TinhTyLe = arr
End Function
Xem 2 cách dùng hàm trong file
 

File đính kèm

  • Tính tỷ lệ sở hữu vốn.xlsm
    18.7 KB · Đọc: 13
Cách tính của bạn chưa tính đầy đủ tỷ lệ sở hữu khi có sở hữu chéo giữa các đơn vị, muốn tính đầy đủ làm theo cách bài 9# khá phức tạp
Tạm dùng hàm tự tạo TyleSH theo cách tính của bạn khá đơn giản, code cũng dể, nhưng tính bị thiếu khi có sở hữu chéo
Mã:
Option Explicit
Function TyleSH(ByVal rng As Range, ByVal ChuSH, ByVal cTy, Optional bTyLe As Boolean = True)
  Dim dic As Object, arr(), i&, res#

  Set dic = CreateObject("scripting.dictionary")
  If bTyLe = True Then arr = rng.Value Else arr = TinhTyLe(rng)
 
  For i = 2 To UBound(arr)
    dic.Add arr(i, 1), i
  Next i
  Call DeQuy(res, arr, dic, cTy, ChuSH, "," & ChuSH & ",", 1)
  Set dic = Nothing: Set rng = Nothing
  TyleSH = res
End Function

Private Sub DeQuy(ByRef res, ByRef arr, ByRef dic, ByRef cTy, ByVal sh$, ByVal tmp$, ByVal tl#)
  Dim i&, j&
  i = dic.Item(sh)
  For j = 2 To UBound(arr, 2)
    If arr(i, j) <> Empty Then
      If cTy = arr(1, j) Then
        res = res + tl * arr(i, j)
      ElseIf InStr(1, tmp, "," & arr(1, j) & ",") = 0 Then
        Call DeQuy(res, arr, dic, cTy, arr(1, j), tmp & arr(1, j) & ",", tl * arr(i, j))
      End If
    End If
  Next j
End Sub

Private Function TinhTyLe(ByRef rng)
  Dim arr(), tmp(), sRow&, sCol&, i&, j&
  arr = rng.Value
  sRow = UBound(arr): sCol = UBound(arr, 2)
  ReDim tmp(1 To sRow, 1 To sCol)
  For j = 2 To sCol
    For i = 2 To sRow
      tmp(1, j) = tmp(1, j) + arr(i, j)
    Next i
    For i = 2 To sRow
      arr(i, j) = arr(i, j) / tmp(1, j)
    Next i
  Next j
  TinhTyLe = arr
End Function
Xem 2 cách dùng hàm trong file
Cám ơn bác rất nhiều, ngoài thực tế thì lúc thay đổi cơ cấu vốn thì sẽ phải tránh trường hợp sở hữu chéo, nhưng công ty em đang làm tái cấu trúc mà cả group tận hơn trăm công ty lận nên chắc ko tránh khỏi :D
 
Web KT
Back
Top Bottom