Viết code để lọc ra từng đối tượng và tính tổng

Liên hệ QC

chisinhvnn

Thành viên tiêu biểu
Tham gia
7/3/08
Bài viết
478
Được thích
103
Kính nhờ anh chị viết gúp đoạn code:
Lọc ra từng đối tượng, sau đó tính tổng diện tích của đối tượng; (các thửa đất được gom lại 1 hàng theo tờ bản đồ và tính tổng diện tích theo tờ bản đồ của từng đối tượng). Anh chị xem file giúp. Xin cảm ơn
 

File đính kèm

  • Hoi GPE.xlsx
    11.3 KB · Đọc: 18
Kính nhờ anh chị viết gúp đoạn code:
Lọc ra từng đối tượng, sau đó tính tổng diện tích của đối tượng; (các thửa đất được gom lại 1 hàng theo tờ bản đồ và tính tổng diện tích theo tờ bản đồ của từng đối tượng). Anh chị xem file giúp. Xin cảm ơn
Lấy họ tên dài lằng ngoằng thế kia làm khóa duy nhất để tổng hợp thì hỏng bét. Gõ sai 1 chút: "Bà Trần Thị Hia" với "Bà Trần Thị Hia" hoặc "Bà Trần Thị Hia " thì chắc chắn bị hiểu là 3 bà.
 
Upvote 0
Lấy họ tên dài lằng ngoằng thế kia làm khóa duy nhất để tổng hợp thì hỏng bét. Gõ sai 1 chút: "Bà Trần Thị Hia" với "Bà Trần Thị Hia" hoặc "Bà Trần Thị Hia " thì chắc chắn bị hiểu là 3 bà.
Dữ liệu thật cũng đang bị như thế anh ạ.
 
Upvote 0
Upvote 0
Cái này chắc địa chính địa phương họ quản lý theo mã hộ hay theo tên như thế này nhỉ
Họ cứ theo suy nghĩ thông thường mà nhập liệu thôi. Có tên thì gõ tên, có số tờ số thửa, diện tích thì gõ vào. Đến hồi sai không biết sai chỗ nào.
Bài đã được tự động gộp:

Không khéo là số liệu ảo.
Số liệu đưa lên đây tất nhiên không phải thật rồi, nhưng trên thực tế họ nhập liệu như tôi đã nói thì tất yếu xảy ra sai sót như thế thôi.
 
Upvote 0
Mấy bà này liên quan đến đất đai kiểu này dễ kéo nhau ra tòa lắm.

Không khéo là số liệu ảo.
"Mấy bà này liên quan đến đất đai kiểu này dễ kéo nhau ra tòa lắm." Việc kéo nhau ra tòa thì không liên quan gì ở đây.
"Không khéo là số liệu ảo." Đây cũng là số liệu thật à. Thực tế, khi nhập thì họ tên 1 đối tượng thì không giống nhau do nhập nhiều lần, nhiều đợt. (Cái này mình phải làm thủ công để chuẩn hóa lại). Do đó, đối với file mình gửi lên, cột họ tên cứ xem như là khóa duy nhất. Nhờ anh chị/chị giúp đỡ
 
Upvote 0
Nhờ viết code dễ quá rồi riết bà con mần biếng, chỉ biết vòi code. không chịu học hỏi tìm hiểu thêm gì về Excel.
Cái này là nhiệm vụ của Pivot Table.
(Dựng xong là thấy có dữ liệu lủng củng liền. Chỉ việc chỉnh và refresh)

View attachment 294070
Cảm ơn anh đã xem bài và đưa ra cách giải quyết. Nhưng chưa đúng kết quả em mong muốn. Cảm ơn anh
 
Upvote 0
Ối giàn thiên lý ơi, box này là box lập trình với Excel hay là box dành cho các bô lão vào tám chuyện vậy? Người ta hỏi không trả lời thì thôi, đi bắt mấy chuyện tào lao quá vậy các bô lão.

@chisinhvnn cho bần lão hỏi, các hạ đang dùng excel phiên bản gì, Excel 365 hay phiên bản nào? Nếu dùng Excel 365 thì chỉ cần kết hợp Pivotable + hàm TEXTJOIN + FILTER, không cần viết code.

=TEXTJOIN(";",1,FILTER(Sheet2!$C$6:$C$28,(Sheet2!$B$6:$B$28=$A7)*(Sheet2!$D$6:$D$28=$B7),""))

Slicer.png
[quote
 
Lần chỉnh sửa cuối:
Upvote 0
Ối giàn thiên lý ơi, box này là box lập trình với Excel hay là box dành cho các bô lão vào tám chuyện vậy? Người ta hỏi không trả lời thì thôi, đi bắt mấy chuyện tào lao quá vậy các bô lão.

@chisinhvnn cho bần lão hỏi, các hạ đang dùng excel phiên bản gì, Excel 365 hay phiên bản nào? Nếu dùng Excel 365 thì chỉ cần kết hợp Pivotable + hàm TEXTJOIN + FILTER, không cần viết code.
Cảm ơn anh. Mình dùng excel 2016, nên chắc không áp dụng công thức trên được.
 
Upvote 0
Kính nhờ anh chị viết gúp đoạn code:
Lọc ra từng đối tượng, sau đó tính tổng diện tích của đối tượng; (các thửa đất được gom lại 1 hàng theo tờ bản đồ và tính tổng diện tích theo tờ bản đồ của từng đối tượng). Anh chị xem file giúp. Xin cảm ơn
Kiểm tra lại
Mã:
Sub XYZ()
  Dim arr(), a, b(), res(), dic As Object
  Dim sRow&, sCol&, i&, SoHo&, k&, ik&, t&, j&, key$, tong#
 
  Set dic = CreateObject("scripting.dictionary")
  dic.CompareMode = 1
  arr = Range("B6", Range("E" & Rows.Count).End(xlUp)).Value
  sRow = UBound(arr)

LamLai:
  SoHo = 0: k = 0
  dic.RemoveAll
  sCol = sCol + 10 'Mot ho co nhieu nhat 10 Thua
  ReDim b(1 To sRow, -1 To sCol)
  ReDim res(1 To sRow * 2 + 1, 1 To 5)
  For i = 1 To sRow
    key = Trim(arr(i, 1))'Loai Khoang Trang
    If dic.exists(key) = False Then
      SoHo = SoHo + 1
      dic.Add key, SoHo
      b(SoHo, -1) = key
    End If
    t = dic(key)
    key = key & "|" & arr(i, 3)
    If dic.exists(key) = False Then
      b(t, 0) = b(t, 0) + 1
      If b(t, 0) > sCol Then GoTo LamLai 'Mot ho co nhieu hon sCol Thua
      dic.Add key, Array(arr(i, 2), arr(i, 4))
      b(t, b(t, 0)) = key
    Else
      a = dic(key)
      a(0) = a(0) & ";" & arr(i, 2)
      a(1) = a(1) + arr(i, 4)
      dic(key) = a
    End If
  Next i
  For i = 1 To SoHo
    k = k + 1
    res(k, 1) = i
    res(k, 2) = b(i, -1)
    ik = k
    For j = 1 To sCol
      If b(i, j) = Empty Then Exit For
      k = k + 1
      res(k, 3) = dic(b(i, j))(0)
      res(k, 4) = Split(b(i, j), "|")(1)
      res(k, 5) = dic(b(i, j))(1)
      res(ik, 5) = res(ik, 5) + res(k, 5)
    Next j
    tong = tong + res(ik, 5)
  Next i
  i = Range("K" & Rows.Count).End(xlUp).Row
  If i > 5 Then Range("G6:K" & i).ClearContents
  If k Then
    k = k + 1
    res(k, 5) = tong
    Range("G6").Resize(k, 5) = res
  End If '
End Sub
Lưu ý: Bà Trần Thị Hia trước sau lệch 1 khoảng trắng
 
Upvote 0
Lưu ý: Bà Trần Thị Hia trước sau lệch 1 khoảng trắng
Cùng lưu ý này và thêm một cách khác tham khảo
Mã:
Sub ABC()
    Dim D As Object, a(), b(), i&, Key, k&, r&, n&, Tam$, S, S1, sKey
    Set D = CreateObject("scripting.dictionary")
    With Sheets("Sheet2")
        a = .Range("A6:E" & .Range("B" & Rows.Count).End(3).Row).Value
        For i = 1 To UBound(a)
            Key = Trim(a(i, 2))
            If InStr(1, D.Item(Key), a(i, 4)) = 0 Then
                D(Key) = D(Key) & "*" & a(i, 4)
            End If
            Key = Trim(a(i, 2)) & "#" & a(i, 4)
            D(Key) = D(Key) & "|" & i
        Next
    End With
    ReDim b(1 To UBound(a) * 2, 1 To 5)
    For Each Key In D.keys
        If InStr(1, Key, "#") = 0 Then
            k = k + 1: n = n + 1
            S = Split(D.Item(Key), "*")
            b(k, 1) = n
            b(k, 2) = Key
            For i = 1 To UBound(S)
                sKey = Key & "#" & S(i)
                S1 = Split(D.Item(sKey), "|")
                k = k + 1
                For r = 1 To UBound(S1)
                    If Len(Tam) > 0 Then Tam = Tam & ";" & a(S1(r), 3) Else Tam = a(S1(r), 3)
                    b(k, 4) = S(i)
                    b(k, 5) = b(k, 5) + a(S1(r), 5)
                Next
                b(k, 3) = Tam
                Tam = Empty
            Next
        End If
    Next
    With Sheets("sheet2")
        .Range("G6").Resize(1000, 5).ClearContents
        .Range("G6").Resize(k, 5).Value = b
    End With
End Sub
 
Upvote 0
Upvote 0
Viết công thức ghép số tờ:
So_To:=CONCATENATEX('Table1','Table1'[Tờ bản đồ],";")

Họ tênSố thửaDIEN_TICHSo_To
Bà Phạm Thị Lan và ông Trần Minh Tùng
5​
2,207
112​
Bà Trần Thị Hia
1​
1,043
93​
Bà Trần Thị Hia
2​
429
149​
Bà Trần Thị Thí
5​
4,394
145​
Ông Trần Xuân Uẩn và bà Trần Thị Bông
1​
11,37281;34
Ông Trần Xuân Uẩn và bà Trần Thị Bông
2​
7,503242;127;197;208;209;217
Ông Trần Xuân Uẩn và bà Trần Thị Bông
4​
8,65625;71;152;170
Ông Trần Xuân Uẩn và bà Trần Thị Bông
5​
11,71414;18;19;16;10;2;22
 

File đính kèm

  • Hoi GPE.xlsx
    134.5 KB · Đọc: 12
Upvote 0
hocexcel_1991, tranhungdao12a3 : đúng là ngọa hổ tàng long, cửu âm chân kinh lộ diện. Đa tạ các vị cao thủ võ lâm đã cho bần lão đây mở rộng tầm mắt, bái phục bái phục!
 
Upvote 0
Web KT
Back
Top Bottom