Tự động cập nhật dữ liệu

  • Thread starter Thread starter ALOAN
  • Ngày gửi Ngày gửi
Liên hệ QC
Thì tôi đang hỏi đây! Mà bạn thì vẫn chưa trả lời rõ ràng... Thật khó khăn cho tôi khi ko biết phải làm theo hướng nào? Giờ bạn nghe kỹ và trả lời 1 lần thật chính xác nhé! NHƯ THẾ NÀO THÌ DC XEM LÀ TRÙNG
Dử liệu của bạn có 4 cột, vậy trùng cột nào thì dc xem là trùng? Hay phải trùng hết cả 4 cột?
Khi đưa yêu cầu trợ giúp các bạn nên nói càng rõ ràng càng tốt, vì chỉ sai 1 ly thôi thì vấn đề đã khác đi rồi...
-------------------------------
Tôi nghĩ phải trùng cả 4 cột mới dc xem là trùng chứ nhỉ... Vì giã sử trùng cột ITEM và ORDER.. nhưng Q'TY và FREI khác nhau... vậy khi lọc sang bảng 3... ngay cột Q'TY và FREI ta sẽ lấy theo em nào của bảng gốc đây... Bạn chứ ý dòng thứ tự 4 và thứ tự 10 trong bảng 1... Nếu xem 2 em này là trùng, tức là ta sẽ lấy 1 đễ trích sang bảng 3... vậy cột Q'TY của bảng 3 ta lấy món nào...
Giờ tốt nhất là như vầy... Tôi gữi dử liệu mà tôi đang giã lập... Bạn cứ theo file này và trích bằng tay cho tôi xem thử...
 

File đính kèm

Lần chỉnh sửa cuối:
Tự động cập nhật dữ liệu Trả Lời Ðề Tài

Cảm ơn sự hướng dẫn của Bác.
Theo bài trên thì không trung nghĩa là cả 2 cột "item" và "order" trên cùng một hàng không trùng là được.
Bác xem file cho rõ ràng nha!
 

File đính kèm

Xem như 2 cột ITEM và ORDER đã giãi quyết xong... Giờ vướng 1 cái khác.. khi trich sang bảng 3 thì cột Q'TY và FREI sẽ lấy theo em trên hay dưới? Tức 2 em trùng này thì Q'TY sẽ lấy số 1000 hay 2000? Và cột FREI sẽ lấy A hay B (lấy sang bảng 3 ấy)
 
Bác cứ lấy theo tên dưới dùm em nha
 
Tự động cập nhật dữ liệu Trả Lời Ðề Tài

Bác cho em hỏi tí luôn
Em đã áp dụng theo cách Bác chỉ dẫn là liệt kê nhưng không cần cột phu.
Nhưng tốc độ máy chậm hẳn. Vì Bang "DS" khoảng 5000 dòng.
VB Bác viết thì em chưa hiểu nên chưa áp dụng được.
Bác xem có cách nào help me!
Best regards
 

File đính kèm

Tôi đã làm dc tới chổ Update thông tin mới của 2 cột ITEM và ORDER... (lọc ra danh sách duy nhất sang bảng 3)... Giờ ko biết làm sao đễ lấy luôn 2 cột Q'TY và FREI sang bảng thứ 3
Theo như bạn ALOAN nói thì nếu gặp dử liệu trùng, sẽ lấy cái nằm dưới cùng... Trong file B6 và B12 trùng, sẽ lấy Q'TY là 2000 và FREI là B
Tới đây mà làm bằng công thức thì cũng ko có vấn đề.. nhưng đang làm bằng VBA, tự dưng chèn công thức vào thấy vô duyên quá
Nhờ các cao thủ tiếp tay cho!
Mến
ANH TUẤN
 

File đính kèm

Tôi đã hoàn tất yêu cầu của bạn bằng vòng lập FOR, khác hoàn toàn thuật toán của bài trước... Bạn tải file về xem thử nha! Bất cứ lúc nào bạn nhập liệu vào Bảng 1 và Bảng 2 thì dử liệu so dc so sánh và cập nhật vào bảng 3... Theo như bạn nói thì dử liệu bảng 1 và 2 là hoàn toàn khác nhau, nên bạn cũng phải đãm bảo dc sự khác nhau này (code chỉ phân biệt dử liệu trùng trong 1 bảng)
-------------------------------------------------------
Nhở các cao thủ xem thử thuật toán trong file có gì ko ổn:
PHP:
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim Er1 As Integer, Er2 As Integer
Dim M1 As Integer, M2 As Integer, n As Integer
Application.ScreenUpdating = False
    If Not Intersect(Range("B3:E10000", "H3:K10000"), Target) Is Nothing Then
       Er1 = Range("B10000").End(xlUp).Row
       Er2 = Range("H10000").End(xlUp).Row
       Range("M3:Q10000").ClearContents
       For i1 = 3 To Er1
          For j1 = i1 + 1 To Er1 + 1
              M1 = 0
              If Cells(i1, 2).Value = Cells(j1, 2).Value And Cells(i1, 3).Value = Cells(j1, 3).Value Then
                 Exit For
              Else: M1 = 1
              End If
          Next j1
          If M1 = 1 Then
             n = n + 1
             Range(Cells(n + 2, 14), Cells(n + 2, 17)).Value = Range(Cells(i1, 2), Cells(i1, 5)).Value
             Cells(n + 2, 13).Value = n
          End If
       Next i1
       For i2 = 3 To Er2
          For j2 = i2 + 1 To Er2 + 1
              M2 = 0
              If Cells(i2, 8).Value = Cells(j2, 8).Value And Cells(i2, 9).Value = Cells(j2, 9).Value Then
                 Exit For
              Else: M2 = 1
              End If
          Next j2
          If M2 = 1 Then
             n = n + 1
             Range(Cells(n + 2, 14), Cells(n + 2, 17)).Value = Range(Cells(i2, 8), Cells(i2, 11)).Value
             Cells(n + 2, 13).Value = n
          End If
       Next i2
    End If
End Sub
Ở đây phát hiện dc nhược điểm là: ko thể Undo nếu nhập sai (phải tự sửa bằng tay)... Làm sao khắc phục dc nhược điểm này?
Mến
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Chào Bác anhtuan1066 bác làm hay lắm. Nhưng bác tuấn này, bác có thể để 3 bảng nằm trên 3 sheet khác nhau được không. Thanks
 
Lần chỉnh sửa cuối:
TigerTiger đã sửa lại và thay đổi thuật toán nhanh hơn, có thể dò tìm xét trùng của cả 2 bảng (có file gửi kèm)


Vì đang bận wa, hy vọng có thời gian quay lại bàn luận thêm

@atuan...: a làm khá hay, nhưng còn hạn chế đó là phải dò tìm nhiều (vì phải dò tìm lại cả nx dòng (Item, Order) mà đã trùng với dòng dò tìm trước đó, hy vọng a xem cách của tigertiger và góp ý _tigeriger sẽ quay lại mạn đàm

xin cám ơn, và mong nhận được góp ý

PHP:
Option Explicit

Private Sub WorkSheet_Change(ByVal Target As Range)
  If Not Intersect(Range("B3:E10000", "H3:K10000"), Target) Is Nothing Then
      Application.ScreenUpdating = False
      UpdateB3
  End If
End Sub

Private Sub UpdateB3()
       Dim N1 As Integer, N2 As Integer, N As Integer, i As Integer, j As Integer, k As Integer, i3 As Integer, Dem As Integer
       Dim Rgn1 As Range, Rgn2 As Range, aCo() As Byte: Dim Item_i, Order_i, Item_j, Order_j
       
       Range("M3", Range("Q10000").End(xlUp).Address).ClearContents
       N1 = Range("B10000").End(xlUp).Row - 3 + 1: N2 = Range("H10000").End(xlUp).Row - 3 + 1: N = N1 + N2
       ReDim aCo(N): For i = 1 To N: aCo(i) = 0: Next i  
       
       Set Rgn1 = Range("A3", Range("A3").Offset(N1 - 1, 4).Address)
       Set Rgn2 = Range("G3", Range("G3").Offset(N2 - 1, 4).Address)
   
       i3 = 0: Dem = 0
       For i = 1 To N
        If aCo(i) = 0 Then
          aCo(i) = 1: k = i: Dem = Dem + 1
          If i <= N1 Then
                Item_i = Rgn1(i, 2): Order_i = Rgn1(i, 3)
          Else: Item_i = Rgn2(i - N1, 2):   Order_i = Rgn2(i - N1, 3): End If
          
          For j = i + 1 To N
            If aCo(j) = 0 Then
                If j <= N1 Then
                        Item_j = Rgn1(j, 2):        Order_j = Rgn1(j, 3)
                Else:   Item_j = Rgn2(j - N1, 2):    Order_j = Rgn2(j - N1, 3): End If
                If Item_i = Item_j And Order_i = Order_j Then: aCo(j) = 1: k = j: Dem = Dem + 1
            End If
          Next j
          
          i3 = i3 + 1: Range("M3").Offset(i3 - 1, 0).Value = i3
          With Range(Range("M3").Offset(i3 - 1, 1).Address, Range("M3").Offset(i3 - 1, 4).Address)
            If k <= N1 Then
                    .Value = Range(Rgn1(k, 2).Address, Rgn1(k, 5).Address).Value
            Else:   .Value = Range(Rgn2(k - N1, 2).Address, Rgn2(k - N1, 5).Address).Value: End If
          End With
        End If
        If Dem = N Then Exit For
       Next i
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Duong gia đã viết:
Chào Bác anhtuan1066 bác làm hay lắm. Nhưng bác tuấn này, bác có thể để 3 bảng nằm trên 3 sheet khác nhau được không. Thanks

Ok, với bài trên - Duong gia chỉ cần thay đổi địa chỉ tham chiếu như của các Rgn1, Rgn2,.... bạn thử sửa xem
 
Tôi cũng lại có 1 cách mới, giúp rút ngắn code đấy! Các bạn xem thử và góp ý giùm:
PHP:
Private Sub WorkSheet_Change(ByVal Target As Range)
Dim Er1 As Integer, Er2 As Integer, Rw As Integer
Dim M1 As Integer, M2 As Integer, n As Integer, K As Integer
Application.ScreenUpdating = False
    If Not Intersect(Range("B3:E10000", "H3:K10000"), Target) Is Nothing Then
       Er1 = Range("B10000").End(xlUp).Row
       Er2 = Range("H10000").End(xlUp).Row
       Range("M3:Q10000").ClearContents
For i = 1 To 2
     If i = 1 Then
           Rw = Er1
     Else: Rw = Er2
     End If
     K = 2 + (i - 1) * 6
       For i1 = 3 To Rw
          For j1 = i1 + 1 To Rw + 1
              M1 = 0
              If Cells(i1, K).Value = Cells(j1, K).Value And Cells(i1, K + 1).Value = Cells(j1, K + 1).Value Then
                 Exit For
              Else: M1 = 1
              End If
          Next j1
          If M1 = 1 Then
             n = n + 1
             Range(Cells(n + 2, 14), Cells(n + 2, 17)).Value = Range(Cells(i1, K), Cells(i1, K + 3)).Value
             Cells(n + 2, 13).Value = n
          End If
       Next i1
Next i
End If
End Sub
ANH TUẤN
 
Duong gia đã viết:
Chào Bác anhtuan1066 bác làm hay lắm. Nhưng bác tuấn này, bác có thể để 3 bảng nằm trên 3 sheet khác nhau được không. Thanks
Như yêu cầu của bạn thì trong code mới của tôi bạn chỉ cần thay chổ này:
Mã:
[COLOR=red]Range(Cells(n + 2, 14), Cells(n + 2, 17)).Value[/COLOR][COLOR=#0000bb] [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Range[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]i1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]K[/COLOR][COLOR=#007700]), [/COLOR][COLOR=#0000bb]Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]i1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]K [/COLOR][COLOR=#007700]+ [/COLOR][COLOR=#0000bb]3[/COLOR][COLOR=#007700])).[/COLOR][COLOR=#0000bb]Value
             [/COLOR][COLOR=red]Cells(n + 2, 13).Value[/COLOR][COLOR=#0000bb] [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]n[/COLOR]
Thành địa chỉ cell nào đó tùy ý (ngay chổ tô màu đỏ)

 
Cập nhật dữ liệu thèo ngày.

Thấy mọi người bàn sôi nổi về vấn đề tự động cập nhật data, mình cũng có 1 bài toán làm không ra. Mong mọi người giúp đở.

Thực ra đây là 1 file để cho nhân viên Bán vé nhập dữ liệu vào. File sẽ được định dạng trước, đơn giản không có công thức gì cả. Nhân viên chỉ mở lên và nhập dữ liệu của ngày hiện tại.
Nhưng vì thị trường luôn thay đổi, nên mình phải luôn ngồi sữa lại cho khớp với thị trường. Mà rất nhìu file, 1 file lại rất nhìu dòng.

Mục đích của mình là tạo thêm 1 Sheet Data có các cột phụ , chứa các thông số hay thay đổi như: Số ghế, Trước ngày bay, Lịch bay.

Và khi mình thay đổi thông số bên Sheet Data thì Sheet Baocao sẽ tự động cập nhật. Mình ko cần phải ngồi sữa từng cái như trước đây nữa.

Mình ko bít giải thích như vậy mọi người có rõ không. Cám ơn mọi người đã nhiệt tình góp ý.
Mình xin gửi file thực để mọi người dể nhìn.

Chân thành cám ơn các Bác.
 

File đính kèm

To Mr. AnhTuan1066, Với đoạn sau trong file: "UPDATED data_Tuan03" của Bác, mình phải sửa chỗ nào để nó trích dữ liệu sang cột A của sheet 2 . Thanks Private Sub WorkSheet_Change(ByVal target As Range) If Not Intersect(target, Range("B2:B1000")) Is Nothing Then Rw = ActiveCell.Row Range("B1:B1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _ "G1"), Unique:=True Range("G2:G1000").Select Selection.Sort Key1:=Range("G2"), Order1:=xlAscending Range("B" & Rw).Select End If End Sub
 
Lần chỉnh sửa cuối:
Chào bạn Duong Gia! Với yêu cầu của bạn, theo tôi cách chắc ăn nhất là bạn chia code này thành 2 phần: 1 cái nằm trong module và 1 cái nằm trong Sheet... Cụ thể như sau:
Code trong Sheet:
PHP:
Private Sub WorkSheet_Change(ByVal target As Range)
     If Not Intersect(target, Range("Sheet1!B2:B1000")) Is Nothing Then
        Call LOC
     End If
End Sub
Và code trong module:
PHP:
Sub LOC()
    Rw = ActiveCell.Row
    Sheets("Sheet1").Range("B2:B1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Sheet2").Range("A2"), Unique:=True
    Sheets("Sheet2").Select
    ActiveSheet.Range("A3:A1000").Select
    Selection.Sort Key1:=Range("A3"), Order1:=xlAscending
    Sheets("Sheet1").Select
    Range("B" & Rw).Select
End Sub
Mọi sự thay đổi dử liệu trong vùng d/k của Sheet1 sẽ dc chuyển đến Run Sub LOC
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
To Mr. anhtuan1066 Bác Tuấn help me lọc dữ liệu theo ĐK. Pls open file đính kèm. Thanks +-+-+-+
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem bài này của tôi đã làm sẳn rồi tự chế theo ý mình nhé...
Tôi nghĩ file của tôi rất giống với yêu cầu của bạn... Tất cả nhiệm vụ còn lại của bạn là mở code ra và thay thế địa chỉ cell cho phù hợp với thực tế file mình
(Nếu dử liêu của bạn ko nhiều, dưới 1000, thì nên dùng công thức)
Mến
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Hic... thôi làm luôn cho bạn... Trang trí lại bảng tính nhé...
Bạn mở code ra xem.. gần như giống đến 90% code file trên của tôi đấy
Còn trục trặc gì chắc bạn tự sửa dc nhỉ
ANH TUẤN
 

File đính kèm

Em có góp ý thế này :

Chúng ta không nên lạm dụng sự kiện WorkSheets_Change, vì mỗi lần thay đổi trong vùng đã định lại chạy sub này thì . . quá mệt.

Em đề nghị :

- Dùng sự kiện WorkSheet_Change : Khi có sự thay đổi sẽ ghi là "DATHAYDOI" vào trong 1Cell nào đó
- Khi Sheet 2 (Sheet Đích) được Active (Worksheet_Active) thì sẽ kiểm tra xem Cell trên có ghi "DATHAYDOI" không ?? Nếu có sẽ tiến hành chạy Sub LOC, và xóa Cell tạm ở trên.

Thân!
 
Web KT

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

Back
Top Bottom