Giúp đỡ cập nhập dữ liệu khi lọc và dùng mảng

Liên hệ QC

hoanganhvo2612

Thành viên thường trực
Tham gia
15/11/16
Bài viết
250
Được thích
129
Chào các bạn,
Mình có viết code VBA để cập nhật dữ liệu. Bài toán như sau:
Mình có bảng dữ liệu từ A9:D20, nhưng bảng dữ liệu này mình đang để chế độ lọc theo 1 số mã hàng. Mình cần cập nhật dữ liệu vào bảng này theo dữ liệu nhập ở G2:J2.
1622084963431.png

Mình có viết code để cập nhật như sau:
Mình đưa bảng data vào 1 mảng sau đó dùng vòng lặp để check, sau khi cập nhật mảng thì em dán lại vào sheet. Nhưng vấn đề là khi bảng dữ liệu đang lọc thì dán lại sẽ bị sai ạ.
Mong các bạn xem giúp mình. có cách nào vẫn để lọc và dùng mảng mà cập nhật dữ liệu được đúng không ạ?

Em nghĩ hướng là xét từng ô (cell) nhưng nếu dữ liệu lớn và cần cập nhập nhiều thì không khả thi vì nó sẽ gây chậm ạ. Đây chỉ là dữ liệu giả định để mọi người lắm được vấn đề ạ.

Cảm ơn cả nhà
Mã:
Sub test()
    Dim i As Integer, ar()
    ar = Range("A10:D20").Value
    For i = 1 To UBound(ar)
        If ar(i, 1) = Range("G2") Then
            ar(i, 3) = Range("I2"): ar(i, 4) = Range("J2")
        End If
    Next
    Range("A10").Resize(UBound(ar), UBound(ar, 2)) = ar
End Sub
 

File đính kèm

  • updateloc.xlsm
    16.1 KB · Đọc: 12
Chào các bạn,
Mình có viết code VBA để cập nhật dữ liệu. Bài toán như sau:
Mình có bảng dữ liệu từ A9:D20, nhưng bảng dữ liệu này mình đang để chế độ lọc theo 1 số mã hàng. Mình cần cập nhật dữ liệu vào bảng này theo dữ liệu nhập ở G2:J2.
View attachment 259491

Mình có viết code để cập nhật như sau:
Mình đưa bảng data vào 1 mảng sau đó dùng vòng lặp để check, sau khi cập nhật mảng thì em dán lại vào sheet. Nhưng vấn đề là khi bảng dữ liệu đang lọc thì dán lại sẽ bị sai ạ.
Mong các bạn xem giúp mình. có cách nào vẫn để lọc và dùng mảng mà cập nhật dữ liệu được đúng không ạ?

Em nghĩ hướng là xét từng ô (cell) nhưng nếu dữ liệu lớn và cần cập nhập nhiều thì không khả thi vì nó sẽ gây chậm ạ. Đây chỉ là dữ liệu giả định để mọi người lắm được vấn đề ạ.

Cảm ơn cả nhà
Mã:
Sub test()
    Dim i As Integer, ar()
    ar = Range("A10:D20").Value
    For i = 1 To UBound(ar)
        If ar(i, 1) = Range("G2") Then
            ar(i, 3) = Range("I2"): ar(i, 4) = Range("J2")
        End If
    Next
    Range("A10").Resize(UBound(ar), UBound(ar, 2)) = ar
End Sub
Cách thì có nhưng mà không giống ai cả
Mã:
Sub test()
Dim sArr(), i As Long
Tmp = Range("G2:J2").Value
sArr = Range("A10:D20").Value
For i = 1 To UBound(sArr)
    If sArr(i, 1) = Tmp(1, 1) Then
        Cells(i + 9, 2) = Tmp(1, 2)
        Cells(i + 9, 3) = Tmp(1, 3)
        Cells(i + 9, 4) = Tmp(1, 4)
    End If
Next
End Sub
 
Upvote 0
Cách đơn giản nhất là trước khi dán mảng ra bạn ShowAllData rồi hẵn ghi dữ liệu ra bảng tính đỡ sai xót:
Mã:
    On Error Resume Next
    With ActiveSheet
        .Unprotect
        .ShowAllData
    End With
 
Upvote 0
Cách thì có nhưng mà không giống ai cả
Mã:
Sub test()
Dim sArr(), i As Long
Tmp = Range("G2:J2").Value
sArr = Range("A10:D20").Value
For i = 1 To UBound(sArr)
    If sArr(i, 1) = Tmp(1, 1) Then
        Cells(i + 9, 2) = Tmp(1, 2)
        Cells(i + 9, 3) = Tmp(1, 3)
        Cells(i + 9, 4) = Tmp(1, 4)
    End If
Next
End Sub
ý em không muốn dùng cells ấy ạ, vì nếu em cập nhập cho vài nghìn cells nó gây chậm ấy ạ.
Bài đã được tự động gộp:

Cách đơn giản nhất là trước khi dán mảng ra bạn ShowAllData rồi hẵn ghi dữ liệu ra bảng tính đỡ sai xót:
Mã:
    On Error Resume Next
    With ActiveSheet
        .Unprotect
        .ShowAllData
    End With
Cảm ơn bạn, ý mình là vẫn giữ nguyên bộ lọc bạn, chứ bỏ lọc thì mình làm đơn giản ạ.
 
Upvote 0
Kiểu này gọi là song kiếm hợp bích đó. Đã vừa lọc thủ công lại còn chạy code. :)

Đưa điều kiện lọc đó vào code luôn. Chép toàn bộ vùng dữ liệu vào mảng, xử lý xong chép lại. Đơn giản thế thôi.
 
Upvote 0
ý em không muốn dùng cells ấy ạ, vì nếu em cập nhập cho vài nghìn cells nó gây chậm ấy ạ.
Bài đã được tự động gộp:
Dữ liệu nguồn chỉ có 1 dòng mà bạn cập nhật vào vài nghìn dòng hả? Nghe hợp lý ghê

Tại sao nhất định phải giữ chế độ lọc? Tự làm khó mình chi vậy?
Hay là bạn cứ đưa file thật lên đi, coi nó ra làm sao?
 
Upvote 0
ý em không muốn dùng cells ấy ạ, vì nếu em cập nhập cho vài nghìn cells nó gây chậm ấy ạ.
Bài đã được tự động gộp:


Cảm ơn bạn, ý mình là vẫn giữ nguyên bộ lọc bạn, chứ bỏ lọc thì mình làm đơn giản ạ.
Mình cũng đang dùng khoảng 20.000 dòng và tăng lên hàng ngày. Dùng cell cập nhật update vẫn ok đó bạn. Dữ liệu nguồn mỗi lần update cũng rất nhiều chứ không như dữ liệu mẫu 1 dòng của b

Nếu không thi thố tốc độ mà chỉ lao động thì cứ sử dụng đã. Đạt mục đích là ok

Chắc nên đưa dữ liệu thật nên để các anh em xem thôi.
 
Upvote 0
Dữ liệu nguồn chỉ có 1 dòng mà bạn cập nhật vào vài nghìn dòng hả? Nghe hợp lý ghê

Tại sao nhất định phải giữ chế độ lọc? Tự làm khó mình chi vậy?
Hay là bạn cứ đưa file thật lên đi, coi nó ra làm sao?
Cảm ơn anh, như #1 em nói thì đây chỉ là dữ liệu giả định thôi. Hiện tại dữ liệu thật của em không nhiều, nhưng sau này nó sẽ lớn dần lên, em đưa bài toán này để xem có hướng giải quyết nào ổn không thôi ạ. Nếu không có phương án nào thì em cập nhật trực tiếp trên cells.
Bài đã được tự động gộp:

Mình cũng đang dùng khoảng 20.000 dòng và tăng lên hàng ngày. Dùng cell cập nhật update vẫn ok đó bạn. Dữ liệu nguồn mỗi lần update cũng rất nhiều chứ không như dữ liệu mẫu 1 dòng của b

Nếu không thi thố tốc độ mà chỉ lao động thì cứ sử dụng đã. Đạt mục đích là ok

Chắc nên đưa dữ liệu thật nên để các anh em xem thôi.
vâng, em đưa lên xem có phương án nào mà không phải làm trực tiếp trên cell không ạ
Bài đã được tự động gộp:

Kiểu này gọi là song kiếm hợp bích đó. Đã vừa lọc thủ công lại còn chạy code. :)

Đưa điều kiện lọc đó vào code luôn. Chép toàn bộ vùng dữ liệu vào mảng, xử lý xong chép lại. Đơn giản thế thôi.
Cái này là người dùng người ta lọc để kiểm tra nên mình không thể biết người ta lọc những gì thì mình khó lòng mà đưa vào code được a. Cái khó nó là như thế ạ.
Bài đã được tự động gộp:

Bỏ lọc ra rồi lọc lại theo điều kiện cũ
Cái quan trọng là mỗi lần lọc 1 kiểu anh ạ.
 
Upvote 0
Mình trả lời ở bài #6 rồi mà.
Ý thớt là người khác lọc, mỗi người, mỗi lần lại theo điều kiện khác nhau. Chừ làm sao nhận biết được điều kiện lọc hiện hành để mà gỡ lọc rồi lọc lại cho đúng.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh, như #1 em nói thì đây chỉ là dữ liệu giả định thôi. Hiện tại dữ liệu thật của em không nhiều, nhưng sau này nó sẽ lớn dần lên, em đưa bài toán này để xem có hướng giải quyết nào ổn không thôi ạ. Nếu không có phương án nào thì em cập nhật trực tiếp trên cells.
Bài đã được tự động gộp:


vâng, em đưa lên xem có phương án nào mà không phải làm trực tiếp trên cell không ạ
Bài đã được tự động gộp:


Cái này là người dùng người ta lọc để kiểm tra nên mình không thể biết người ta lọc những gì thì mình khó lòng mà đưa vào code được a. Cái khó nó là như thế ạ.
Bài đã được tự động gộp:


Cái quan trọng là mỗi lần lọc 1 kiểu anh ạ.
Nhìn chung thì có thể làm được nhưng thiệt không đáng tí nào. Bỏ lọc để update cho khỏe
Bạn thử code này xem thế nào. Mình code bài này chỉ là tập thể dục cho bộ não mà thôi.
Mã:
Sub Update_ReloadFIlter()
Dim sArr(), i As Long, tmp As String, Tim, DataRng As Range, dkLoc As String, Nguon()
Set DataRng = Range("A9:D20")
sArr = Range("A10:D20").Value
Nguon = Range("G2:J2").Value
For i = 1 To UBound(sArr)
    tmp = sArr(i, 1)
    Set Tim = Range("A:A").Find(tmp, , , 1)
    If Not Tim Is Nothing Then
        dkLoc = IIf(dkLoc = "", tmp, dkLoc & "," & tmp)
    End If
    If tmp = Nguon(1, 1) Then
        sArr(i, 2) = Nguon(1, 2)
        sArr(i, 3) = Nguon(1, 3)
        sArr(i, 4) = Nguon(1, 4)
    End If
Next
With DataRng
    If .AutoFilter = True Then
        .AutoFilter
        chk = True
    End If
    .Offset(1).Resize(UBound(sArr), UBound(sArr, 2)) = sArr
    If chk = True Then .AutoFilter 1, Array(Split(dkLoc, ",")), Operator:=xlFilterValues
End With
End Sub
 
Upvote 0
Dữ liệu nguồn chỉ có 1 dòng mà bạn cập nhật vào vài nghìn dòng hả? Nghe hợp lý ghê

Tại sao nhất định phải giữ chế độ lọc? Tự làm khó mình chi vậy?
Hay là bạn cứ đưa file thật lên đi, coi nó ra làm sao?
Trời, thành viên mười mấy năm rồi mà còn nói câu như thế. Có giả nai tơ hôn vậy?
Ở GPE này, trung bình là phải vài trăm ngàn đến triệu dòng; dưới trăm ngàn là hàng thiểu số; dưới chục ngàn là đồ quý hiếm; dưới ngàn là vạn nhất cả năm mới thấy một lần.

GPE đáng lẽ nên đổi tên thành GPVBAHK (Giải Pháp VBA Hàng Khủng). Lưu ý là VBA chứ giải pháp hàng khủng của Microsoft (như Data Model) không hoan nghênh.
 
Upvote 0
Bạn search Google "get autofilter criteria vba" ra ngay cách lấy điều kiện lọc, mở lọc, cập nhật dữ liệu rồi lại lọc lại.
 
Upvote 0
Nhìn chung thì có thể làm được nhưng thiệt không đáng tí nào. Bỏ lọc để update cho khỏe
Bạn thử code này xem thế nào. Mình code bài này chỉ là tập thể dục cho bộ não mà thôi.
Mã:
Sub Update_ReloadFIlter()
Dim sArr(), i As Long, tmp As String, Tim, DataRng As Range, dkLoc As String, Nguon()
Set DataRng = Range("A9:D20")
sArr = Range("A10:D20").Value
Nguon = Range("G2:J2").Value
For i = 1 To UBound(sArr)
    tmp = sArr(i, 1)
    Set Tim = Range("A:A").Find(tmp, , , 1)
    If Not Tim Is Nothing Then
        dkLoc = IIf(dkLoc = "", tmp, dkLoc & "," & tmp)
    End If
    If tmp = Nguon(1, 1) Then
        sArr(i, 2) = Nguon(1, 2)
        sArr(i, 3) = Nguon(1, 3)
        sArr(i, 4) = Nguon(1, 4)
    End If
Next
With DataRng
    If .AutoFilter = True Then
        .AutoFilter
        chk = True
    End If
    .Offset(1).Resize(UBound(sArr), UBound(sArr, 2)) = sArr
    If chk = True Then .AutoFilter 1, Array(Split(dkLoc, ",")), Operator:=xlFilterValues
End With
End Sub
Cảm ơn anh, nhưng code của anh mới chỉ là xét tới lọc cột đầu.
Bài đã được tự động gộp:

Cảm ơn các bạn đã đưa ra giải pháp. Mình xin tổng kết lại là có 2 giải pháp:
1. cập nhật cho từng ô (cell)
2. Xác định các điều kiện lọc -> bỏ lọc -> cập nhật -> lọc lại.

Em xin dừng đề tài ở đây ạ.
Chú thêm: Cái cốt lõi ở đây em muốn tìm các giải pháp, tất nhiên mỗi giải pháp có 1 hạn chế, em muốn xem có giải pháp nào thật hợp lý thì em áp dụng thôi ạ.
Cảm ơn mọi người
 
Upvote 0
Cảm ơn anh, nhưng code của anh mới chỉ là xét tới lọc cột đầu.
Bài đã được tự động gộp:

Cảm ơn các bạn đã đưa ra giải pháp. Mình xin tổng kết lại là có 2 giải pháp:
1. cập nhật cho từng ô (cell)
2. Xác định các điều kiện lọc -> bỏ lọc -> cập nhật -> lọc lại.

Em xin dừng đề tài ở đây ạ.
Chú thêm: Cái cốt lõi ở đây em muốn tìm các giải pháp, tất nhiên mỗi giải pháp có 1 hạn chế, em muốn xem có giải pháp nào thật hợp lý thì em áp dụng thôi ạ.
Cảm ơn mọi người
Và 1 giải pháp căn cơ đúng bài đó là sử dụng customView, thì khi đó không cần để ý điều kiện lọc, số cột lọc (filter), cụ thể:
- Ghi Customview
- Showall Filter
- Cập nhật
- Restore (hồi / khôi phục) lại CustomView đã ghi

Tự tìm hiểu CustomView trong VBA Excel nhé, là giải quyết được vấn đề
 
Upvote 0
Và 1 giải pháp căn cơ đúng bài đó là sử dụng customView, thì khi đó không cần để ý điều kiện lọc, số cột lọc (filter), cụ thể:
- Ghi Customview
- Showall Filter
- Cập nhật
- Restore (hồi / khôi phục) lại CustomView đã ghi

Tự tìm hiểu CustomView trong VBA Excel nhé, là giải quyết được vấn đề
Cảm ơn anh, em sẽ tìm hiểu xem thế nào ạ. Có vẻ cách này đợn giản hơn là tìm điều kiện đã lọc.
 
Upvote 0
Dùng Range("A10:A20").SpecialCells(xlCellTypeVisible) lấy mảng điều kiện lọc, xả lọc rồi lọc lại với mảng
 
Upvote 0
Web KT

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

Back
Top Bottom