Tính sở hữu chéo công ty

Liên hệ QC

maiphuonggif

Thành viên mới
Tham gia
21/12/20
Bài viết
4
Được thích
0
Kính gửi anh chị,

Em đang bế tắc về 1 vấn đề tính sở hữu chéo ( cụ thể em có ví dụ trong file đính kèm hoặc anh chị có thể xem hình dưới)
E ko dùng hàm thông thường được vì logic nó hơi rối , nên nhờ anh chị xem thử sử dụng VBA cho việc tính sở hữu chéo gián tiếp và trực tiếp .
Bảng dữ liệu gốc của em là bảng ( 80 * 80 ) ,nên em chỉ ví dụ trong file đơn giản cho đỡ rối ạ

Cảm ơn anh chị.

1608546626411.png
 
Lần chỉnh sửa cuối:
Upvote 0
Có gì đó sai sai về thực tế. Hình như tác giả đang mặc định giá trị của các cty là như nhau?
B chiếm 40% của D
D chiếm 60% của E
suy ra B chiếm 24% của E? Tức là đang mặc định giá trị D = E?
Giả sử D là GPE và E là tập đoàn Microsoft thì kết quả có còn đúng không?
 
Upvote 0
Có gì đó sai sai về thực tế. Hình như tác giả đang mặc định giá trị của các cty là như nhau?
B chiếm 40% của D
D chiếm 60% của E
suy ra B chiếm 24% của E? Tức là đang mặc định giá trị D = E?
Giả sử D là GPE và E là tập đoàn Microsoft thì kết quả có còn đúng không?
Giả sử D phát hành 1 tỷ đồng cổ phiếu, B mua 40% tức là 400 tr
E phát hành 500 triệu đồng cổ phiếu, D mua 60% tức là D sở hữu 300 tr.
Nhưng trong 300 tr đó có phần của B là 40% -> 120 tr
Vậy B có trong E thông qua D là 120 tr, và 120 tr này tương ứng 24% của 500 tr

khi chia cổ tức của E cho D 100 tr, thì D không hưởng hết, mà phải chia lại cho B 40% = 40 tr.

B sở hữu gián tiếp E thông qua D, chỉ dùng để tính giá trị và chia cổ tức, không được quyền quản lý vì trong tay không có cổ phần. Muốn tham gia quản lý E chẳng hạn bắt E bỏ nuôi gà sang nuôi cọp, phải ép D theo ý B để D ép E
 
Upvote 0
E thì không rành lập trình , nên có nhờ 1 ng bạn viết bên Python, cũng dùng map hay đệ quy gì đó thì phải. Gửi cho các a/chị tham khảo (e thì đọc cũng như mù ) :))) e chỉ biết đọc code VBA tí tẹo thôi

@ptm0412 Thanks bác , để e đọc thử . file bác up lại e thấy đúng số.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Hihi, sorry anh , e đã viết đầy đủ, mới tham gia e không biết :D
 
Upvote 0
Thử viết Sub đệ quy, mượn file của bạn @ptm0412
Mã:
Dim sArr(), Res(), Dic As Object

Sub XYZ()
  Dim CT$, CTName$, sRow&, i&, k&
 
  Set Dic = CreateObject("scripting.dictionary")
  CT = Sheet2.Range("A4").Value
  sArr = Sheet1.Range("A2", Sheet1.Range("E65000").End(xlUp)).Value
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 3)
 
  For i = 1 To UBound(sArr)
    If sArr(i, 1) = CT Then CTName = sArr(i, 2)
    Dic.Item(sArr(i, 1)) = Dic.Item(sArr(i, 1)) & "|" & i
    Dic.Item(sArr(i, 1) & "|" & sArr(i, 3)) = sArr(i, 5)
  Next
  If Dic.exists(CT) Then Call CTyCon(k, CT, Split(Dic.Item(CT), "|"), 1)
 
  Sheet2.Range("B4:E50").ClearContents
  Sheet2.Range("B4").Value = CTName
  If k Then Sheet2.Range("C4").Resize(k, 3).Value = Res
End Sub

Private Sub CTyCon(k, ByVal CTy As String, ByVal Arr As Variant, ByVal TyLe#)
  Dim i&, r&, iK&, S, iKey$, CT$, Tl#
 
  For i = 1 To UBound(Arr)
    r = CLng(Arr(i))
    CT = sArr(r, 3)
    iKey = "#" & CT & "#"
    If Dic.exists(iKey) = False Then
      k = k + 1
      Res(k, 1) = CT
      Res(k, 2) = sArr(r, 4)
      Dic.Add iKey, k
    End If
    Tl = TyLe * Dic.Item(CTy & "|" & CT)
    iK = Dic.Item(iKey)
    Res(iK, 3) = Res(iK, 3) + Tl
    If Dic.exists(CT) Then Call CTyCon(k, CT, Split(Dic.Item(CT), "|"), Tl)
  Next i
End Sub
 

File đính kèm

  • Possession-Calculate-v2.xlsm
    33.4 KB · Đọc: 12
Upvote 0
Giả sử D phát hành 1 tỷ đồng cổ phiếu, B mua 40% tức là 400 tr
...
B sở hữu gián tiếp E thông qua D, chỉ dùng để tính giá trị và chia cổ tức, không được quyền quản lý vì trong tay không có cổ phần....
1. Giá trị của công ty tính theo có trừ nợ. Không phải giá phát hành (giá giấy tờ lúc công ty đưa ra, khác với giá lưu hành là giá trên thị trường) cổ phiếu. Đương nhiên giá lưu hành của cổ phiếu cũng liên hệ với trị giá công ty, nhưng nó còn thêm bớt qua cách các nhà đầu tư đánh giá tương lai của công ty.
Nhóm tài chính dùng bảng báo cáo tài chính (financial report) làm công cụ chính, Balance Sheet để tính sở hữu cố đông, Profit and Loss để kiểm chứng hoạt động, và Cash Flow để xác định hoạt động tương lai.
Trường hợp công ty có nhiều cổ phân fowr công ty khác thì bảng báo cáo tài chính chung (consolidated) rất rắc rối. Hồi xưa tôi học suýt rớt môn này :p

2. Quyền quản lý còn tuỳ theo loại cổ phần. Điển hình Mark Zukerberg nắm cổ phần FB đâu có nhiều bằng các nhà băng. Nhưng hắn ta cũng nắm một số cổ phần xịn, chia lời thì có thể như nhau, nhưng có quyền bầu bán cao hơn các cổ phần khác.
 
Upvote 0
Trường hợp công ty có nhiều cổ phân fowr công ty khác thì bảng báo cáo tài chính chung (consolidated) rất rắc rối. Hồi xưa tôi học suýt rớt môn này :p
2. ... một số cổ phần xịn, chia lời thì có thể như nhau, nhưng có quyền bầu bán cao hơn các cổ phần khác.
Hồi tôi còn đi làm, phân tích lập trình cho BCTC chỉ dám làm hợp cộng, không dám làm hợp nhất. May là khách hàng cũng không đòi do họ cũng chưa lên sàn.
Cổ phiếu không xịn là cố phiếu phổ thông. Cổ phiếu xịn có nhiều loại, trong đó có cổ phiếu ưu đãi, cổ phiếu dành cho nhà sáng lập công ty, ... và tuỳ theo bản điều lệ công ty, chủ sở hữu sẽ có những đặc quyền như thế nào. Thậm chí có loại không được quyền sang nhượng.
_______
Phần giải thích cho bé bo là cho loại phổ thông
 
Upvote 0
Hồi tôi còn đi làm, phân tích lập trình cho BCTC chỉ dám làm hợp cộng, không dám làm hợp nhất. May là khách hàng cũng không đòi do họ cũng chưa lên sàn.
Cổ phiếu không xịn là cố phiếu phổ thông. Cổ phiếu xịn có nhiều loại, trong đó có cổ phiếu ưu đãi, cổ phiếu dành cho nhà sáng lập công ty, ... và tuỳ theo bản điều lệ công ty, chủ sở hữu sẽ có những đặc quyền như thế nào. Thậm chí có loại không được quyền sang nhượng.
_______
Phần giải thích cho bé bo là cho loại phổ thông
Cổ phiếu ưu đãi bạn nói trên có lẽ là prefrence shares. Chúng được chia lời trước cổ phiếu thông dụng (ordinary shares). Và nếu công ty giải toả hay phá sản thì chúng cũng được rút vốn trước cổ phiếu thông dụng. Loại cổ phiếu này thường không có quyền bầu bán.
Loại cổ phiếu này thích hợp cho những người chỉ muốn đầu tư kiếm lãi, gần như ký thác nhà băng (chỉ khác là vốn có thể tăng hay hao), không màng đến hoạt động công ty.
 
Upvote 0
Cổ phiếu ưu đãi bạn nói trên có lẽ là prefrence shares. Chúng được chia lời trước cổ phiếu thông dụng (ordinary shares). Và nếu công ty giải toả hay phá sản thì chúng cũng được rút vốn trước cổ phiếu thông dụng. Loại cổ phiếu này thường không có quyền bầu bán.
Loại cổ phiếu này thích hợp cho những người chỉ muốn đầu tư kiếm lãi, gần như ký thác nhà băng (chỉ khác là vốn có thể tăng hay hao), không màng đến hoạt động công ty.
Những đặc quyền hoặc hạn chế (không bầu bán) cho loại cổ phiếu cụ thể nào đều được ghi hết trong Bản điều lệ công ty, và do những thành viên sáng lập soạn thảo khi thành lập. Nếu sau đó có thay đổi điều lệ thì sẽ bị ràng buộc là không được thay đổi 1 vài điều khoản đặc quyền của nhà sáng lập. Cám ơn anh vì các thông tin bổ ích, chứ tôi chỉ học lý thuyết có năm bảy tiết trong 45 tiết môn "cổ phiếu trái phiếu", ngoài ra đọc truyện hoặc xem phim rồi hiểu thêm chẳng biết đúng hay sai.
 
Upvote 0
Theo bài 1 dữ liệu gốc là bảng 80x80 dòng, thì phải có bảng danh mục 80 dòng và cấu trúc bảng 80x80 phải như hình sau, các ô bị gạch chéo là các ô không có số liệu, nếu có tức là đang bị sở hữu vòng tròn. Ràng buộc thứ 2 của bảng này là tổng từng cột không vượt quá 100%, nên tôi sửa J5 từ 60% còn 50%

1608626427945.png

Sử dụng power query sẽ ra bảng data theo dòng để chạy code, và chỉ chạy trường hợp không sở hữu vòng tròn.

1608626488251.png

Code cũ nhưng có thể tính cùng lúc cho nhiều công ty.

1608626935764.png
 

File đính kèm

  • Possession-Calculate-v3.xlsm
    462.3 KB · Đọc: 14
Upvote 0
Theo bài 1 dữ liệu gốc là bảng 80x80 dòng, thì phải có bảng danh mục 80 dòng và cấu trúc bảng 80x80 phải như hình sau, các ô bị gạch chéo là các ô không có số liệu, nếu có tức là đang bị sở hữu vòng tròn. Ràng buộc thứ 2 của bảng này là tổng từng cột không vượt quá 100%, nên tôi sửa J5 từ 60% còn 50%

View attachment 251643

Sử dụng power query sẽ ra bảng data theo dòng để chạy code, và chỉ chạy trường hợp không sở hữu vòng tròn.

View attachment 251644

Code cũ nhưng có thể tính cùng lúc cho nhiều công ty.

View attachment 251645
Theo mình code chạy trực tiếp trên dữ liệu gốc sẽ dể dùng hơn
 
Upvote 0
Theo mình code chạy trực tiếp trên dữ liệu gốc sẽ dể dùng hơn
Theo bài 1 thì dữ liệu gốc là bảng 80x80 đó anh. Do vụ sở hữu này ít biến động nên chỉ cần tạo query 1 lần, chỉ khi nào thay đổi tỷ lệ sở hữu mới phải refresh query
Chạy trực tiếp trên bảng 80x80 cũng được, nhưng một là tôi ghét dữ liệu không chuẩn, hai là chả biết có sắp xếp ngang dọc như nhau không, có bỏ sót còn 79x80 hay 80 x78 hay không.
 
Upvote 0
Theo bài 1 thì dữ liệu gốc là bảng 80x80 đó anh. Do vụ sở hữu này ít biến động nên chỉ cần tạo query 1 lần, chỉ khi nào thay đổi tỷ lệ sở hữu mới phải refresh query
Chạy trực tiếp trên bảng 80x80 cũng được, nhưng một là tôi ghét dữ liệu không chuẩn, hai là chả biết có sắp xếp ngang dọc như nhau không, có bỏ sót còn 79x80 hay 80 x78 hay không.
Nhìn bảng 80x80 dể hình dung mối quan hệ và kiểm soát được sở hữu vòng qua đường chéo
Máy tính mình và nhiều máy không chạy được power query
 
Upvote 0
Nhìn bảng 80x80 dể hình dung mối quan hệ và kiểm soát được sở hữu vòng qua đường chéo
Máy tính mình và nhiều máy không chạy được power query
Viết được nhưng cũng mất công thôi anh:
- Thêm 2 mảng 1 ngang 1 dọc: mảng dọc chứa công ty cha và mảng ngang chứa công ty con
- Thêm 1 cột dọc hoặc mảng dọc để biết công ty trong mảng dọc có con hay không (nhằm mục đích gán vào Dict). Công thức là Sum hàng ngang điều kiện >0 tức là có con
 
Lần chỉnh sửa cuối:
Upvote 0
Theo bài 1 dữ liệu gốc là bảng 80x80 dòng, thì phải có bảng danh mục 80 dòng và cấu trúc bảng 80x80 phải như hình sau, các ô bị gạch chéo là các ô không có số liệu, nếu có tức là đang bị sở hữu vòng tròn. Ràng buộc thứ 2 của bảng này là tổng từng cột không vượt quá 100%, nên tôi sửa J5 từ 60% còn 50%

View attachment 251643

Sử dụng power query sẽ ra bảng data theo dòng để chạy code, và chỉ chạy trường hợp không sở hữu vòng tròn.

View attachment 251644

Code cũ nhưng có thể tính cùng lúc cho nhiều công ty.

View attachment 251645
Không chắc, nhưng tôi nghĩ PQ vẫn có thể chạy được trường hợp này
 
Upvote 0
Không chắc, nhưng tôi nghĩ PQ vẫn có thể chạy được trường hợp này
Ý bạn nói trường hợp sở hữu vòng tròn? Thật ra có thuật toán là làm được, tại tôi không biết cách giải hợp lý (bên trên tôi có đưa ra 2 cách: đơn giản, và lặp đến khi 1 điều kiện nào đó đạt mức chấp nhận)
Còn trường hợp không vòng tròn thì PQ chỉ cần unpivot là xong (bài #32), hay là ý bạn dùng PQ cho đến kết quả cuối không cần VBA?
 
Upvote 0
Ý bạn nói trường hợp sở hữu vòng tròn? Thật ra có thuật toán là làm được, tại tôi không biết cách giải hợp lý (bên trên tôi có đưa ra 2 cách: đơn giản, và lặp đến khi 1 điều kiện nào đó đạt mức chấp nhận)
Còn trường hợp không vòng tròn thì PQ chỉ cần unpivot là xong (bài #32), hay là ý bạn dùng PQ cho đến kết quả cuối không cần VBA?
Vâng, tôi nghĩ dùng PQ có thể ra bảng cuối luôn, không cần thêm bước dùng Vba, tôi dùng ĐT nên không test được
 
Upvote 0
Viết được nhưng cũng mất công thôi anh:
- Thêm 2 mảng 1 ngang 1 dọc: mảng dọc chứa công ty cha và mảng ngang chứa công ty con
- Thêm 1 cột dọc hoặc mảng dọc để biết công ty trong mảng dọc có con hay không (nhằm mục đích gán vào Dict). Công thức là Sum hàng ngang điều kiện là >0 tức là có con
Chỉ cần mảng tỷ lệ cũng được
Mã:
Dim sArr(), aSoHuu(), aCT(), Res(), Dic As Object, CTm$, tenCTm$

Sub Main()
  Dim sRow&, sCol&, i&, j&, k&
 
  Set Dic = CreateObject("scripting.dictionary")
  aSoHuu = Sheet2.Range("A4:B" & Sheet2.Range("A65000").End(xlUp).Row).Value
  aCT = Sheet1.Range("P2", Sheet1.Range("Q65000").End(xlUp)).Value
  sArr = Sheet1.Range("G1:N7").Value
  sRow = UBound(sArr): sCol = UBound(sArr, 2)
  ReDim Res(1 To sRow * UBound(aSoHuu), 1 To 5)
  For i = 1 To UBound(aCT)
    Dic.Item("^" & aCT(i, 1) & "^") = aCT(i, 2)
  Next i
 
  For i = 2 To sRow
    CTm = sArr(i, 1)
    For j = 2 To sCol
      If Len(sArr(i, j)) > 0 Then
        Dic.Item(CTm) = Dic.Item(CTm) & "|" & sArr(1, j)
        Dic.Item(CTm & "|" & sArr(1, j)) = sArr(i, j)
      End If
    Next j
  Next
  For i = 1 To UBound(aSoHuu)
    CTm = aSoHuu(i, 1)
    tenCTm = Dic.Item("^" & CTm & "^")
    If Dic.exists(CTm) Then Call CTyCon2(k, CTm, Split(Dic.Item(CTm), "|"), 1)
  Next i
  Sheet2.Range("D4:H500").ClearContents
  If k Then Sheet2.Range("D4").Resize(k, 5).Value = Res
End Sub

Private Sub CTyCon2(k, ByVal CTy As String, ByVal Arr As Variant, ByVal TyLe#)
  Dim i&, iK&, iKey$, CT$, Tl#
 
  For i = 1 To UBound(Arr)
    CT = Arr(i)
    iKey = CTm & "#" & CT
    If Dic.exists(iKey) = False Then
      k = k + 1
      Dic.Add iKey, k
      Res(k, 1) = CTm
      Res(k, 2) = tenCTm
      Res(k, 3) = CT
      Res(k, 4) = Dic.Item("^" & CT & "^")
    End If
    Tl = TyLe * Dic.Item(CTy & "|" & CT)
    iK = Dic.Item(iKey)
    Res(iK, 5) = Res(iK, 5) + Tl
    If Dic.exists(CT) Then Call CTyCon2(k, CT, Split(Dic.Item(CT), "|"), Tl)
  Next i
End Sub
 

File đính kèm

  • Possession-Calculate-v2.xlsm
    39 KB · Đọc: 11
Upvote 0
Web KT

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

Back
Top Bottom