Có anh. Sheet Master nấy thông tin nguyên liệu ở sh NVL ( em có dùng hàm Vlock up ). Đúng là cái phần auto nó nỗi. Do em nấy code ở file bác quick87 viết nó sẽ chạy cho nhiều sheet phía sau giống nhau ở bài # 224. Mà em mò hoài ko biết cách thoát khỏi cái đó mà file vẫn cập nhật bình thường.
Bây giờ mình làm theo hướng liên hệ qua lại giữa 2 sh DMSP và sh MASTER thôi nhé, Có nghĩa là nếu Sh MASTER thay đổi (thêm dòng chẳng hạn) thì nó sẽ lấy dữ liệu từ Sh DMSP điền vào các ô theo yêu cầu, và ngược lại khi sh DMSP thay đổi (thay đổi các mục tên sản phẩm, hay kích thước ...) thì những dòng của sh MASTER có liên quan cũng thay đỏi theo. còn các sh không liên quan nhé.
nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!
Mình xóa bỏ hết code ở sh DMSP và sửa lại sự kiện Workbook_Change là khi có thay đổi ở range (A5:I1000000) thì chạy sub LOAD để cập nhật lại các dòng của Sh MASTER.
(SH Bang ma NVL bạn để nhiều công thức quá --> file nặng---> load chậm)
nhưng cú 1 lần load là nó xóa xạch dữ liệu các sheet khác không liên quan. mà chưa biết sửa thế nào. các bác xem sửa giúp em!
Mình xóa bỏ hết code ở sh DMSP và sửa lại sự kiện Workbook_Change là khi có thay đổi ở range (A5:I1000000) thì chạy sub LOAD để cập nhật lại các dòng của Sh MASTER.
(SH Bang ma NVL bạn để nhiều công thức quá --> file nặng---> load chậm)
Bạn giải thích một cách cụ thể về cách lấy dữ liệu vào sh Bang ma NVL ỏ các ô và dòng tương ứng thì tin chắc sẽ có nhiều người giúp bạn dùng VBA để lấy không phải dùng công thức(nhất là những worksheets có nhiều dòng nhiều cột phải lấy dũ liệu bằng công thức)---> file sẽ nhẹ hơn--> load sẽ nhanh hơn.
Mình có sửa lại code của sh DMSP để đảm bảo khi dữ liệu của Sh MASTER nhiều dòng thì khi sửa dữ liệu của sh DMSP sẽ đồng thời sửa lại dữ liệu Sh MASTER ở dòng tương ứng (nhanh hơn).
bạn xem code trong file đính kèm và sửa lại dữ liệu, chạy thử nhé. nếu thấy ưng ý thì thay code trong Sh DMSP.
Bạn giải thích một cách cụ thể về cách lấy dữ liệu vào sh Bang ma NVL ỏ các ô và dòng tương ứng thì tin chắc sẽ có nhiều người giúp bạn dùng VBA để lấy không phải dùng công thức(nhất là những worksheets có nhiều dòng nhiều cột phải lấy dũ liệu bằng công thức)---> file sẽ nhẹ hơn--> load sẽ nhanh hơn.
Mình có sửa lại code của sh DMSP để đảm bảo khi dữ liệu của Sh MASTER nhiều dòng thì khi sửa dữ liệu của sh DMSP sẽ đồng thời sửa lại dữ liệu Sh MASTER ở dòng tương ứng (nhanh hơn).
bạn xem code trong file đính kèm và sửa lại dữ liệu, chạy thử nhé. nếu thấy ưng ý thì thay code trong Sh DMSP.
file bác em đã up vào file em chạy ngon luôn bác. nhưng cái code này em mò mãi không hiểu. định tự làm cái chạy mã nguyên liệu nhưng không ra. bác giúp em lốt phát này là File em ngon lành.
- Cũng giống như cái cái trước là mã thành phẩm thì cái này là nhập mã nguyên liệu thì nó chạy tự động và tự động cập nhật các thông số từ Sheet "Ma NL"sang sheet " MASTER Danpla" #cập nhật# Em nay chèn thêm 4 hàng mã sản phẩm mới ở sh DMSP thì sang sh MASTER nó lại không cập nhật lên. mà phải thao tác vào từng ô dữ liệu cửa các mã mới đó thì nó mới load sang.
file bác em đã up vào file em chạy ngon luôn bác. nhưng cái code này em mò mãi không hiểu. định tự làm cái chạy mã nguyên liệu nhưng không ra. bác giúp em lốt phát này là File em ngon lành.
- Cũng giống như cái cái trước là mã thành phẩm thì cái này là nhập mã nguyên liệu thì nó chạy tự động và tự động cập nhật các thông số từ Sheet "Ma NL"sang sheet " MASTER Danpla" #cập nhật# Em nay chèn thêm 4 hàng mã sản phẩm mới ở sh DMSP thì sang sh MASTER nó lại không cập nhật lên. mà phải thao tác vào từng ô dữ liệu cửa các mã mới đó thì nó mới load sang.
Đã sửa lại code, có sửa tự cập nhật Dic khi có thay đổi rồi, chạy thử nhé. Các cột AC,AD,AF mình đã làm cho tự cập nhật công thức rồi đó nếu thấy không cần thì gỡ bỏ.
Còn cái đoạn code
Set SRng = Intersect(Range("AB5:AB60000"), Target)
If Not SRng Is Nothing Then
sRow = SRng.Rows.Count
For i = 1 To sRow
....... đến đoạn
ElseIf UCase(DonVi) Like "T?M" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
ElseIf UCase(DonVi) Like "THANH" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/INT(RC[2]/RC[-10])"
Else
Rng.Offset(, 1) = Empty
End If
Next i
End If
End If
ở sh MASTER đấy để làm gì nếu không cần thiết thì gỡ bỏ cho code chạy nhanh và mượt hơn (tùy bạn- mình không can thiệp)
Dữ liệu ở cột O sh MaNVL được lấy ở đâu vào?
Nên đặt tên file bằng TÊN TIẾNG VIỆT -nhưng viết tắt cũng được, Tên Sh nên đặt bằng tiếng việt không dấu- viết tắt và ngắn bấy nhiêu , gọn bấy nhiêu)
Đã sửa lại code, có sửa tự cập nhật Dic khi có thay đổi rồi, chạy thử nhé. Các cột AC,AD,AF mình đã làm cho tự cập nhật công thức rồi đó nếu thấy không cần thì gỡ bỏ.
Còn cái đoạn code
Set SRng = Intersect(Range("AB5:AB60000"), Target)
If Not SRng Is Nothing Then
sRow = SRng.Rows.Count
For i = 1 To sRow
....... đến đoạn
ElseIf UCase(DonVi) Like "T?M" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
ElseIf UCase(DonVi) Like "THANH" Then
Rng.Offset(, 1).FormulaR1C1 = "=RC[-15]/INT(RC[2]/RC[-10])"
Else
Rng.Offset(, 1) = Empty
End If
Next i
End If
End If
ở sh MASTER đấy để làm gì nếu không cần thiết thì gỡ bỏ cho code chạy nhanh và mượt hơn (tùy bạn- mình không can thiệp)
Dữ liệu ở cột O sh MaNVL được lấy ở đâu vào?
Nên đặt tên file bằng TÊN TIẾNG VIỆT -nhưng viết tắt cũng được, Tên Sh nên đặt bằng tiếng việt không dấu- viết tắt và ngắn bấy nhiêu , gọn bấy nhiêu)
- Anh ơi! em chạy thay đổi mã nguyên liệu nó cú báo lỗi như trên rồi out ra. bác xem giúp em.
- đoạn code đó em để chạy công thức tự động cho cột AC và AF theo mỗi loại nguyên liệu dựa vào đơn vị nguyên liệu ở cột AB và AE ( file trước em để ví dụ hơn ít và ít loại nguyên liệu khác nhau lên không thể hiện rõ, em có gửi lai file nhiều dữ kiệm ở sheet MASTER ).
- dữ liệu ở cộ O Sheet Ma NVL là công thức cộng tổng nguyên liệu ở Sheet Master ạ. tại em xóa bớt Sheet nên nó bị lỗi.
- Anh ơi! em chạy thay đổi mã nguyên liệu nó cú báo lỗi như trên rồi out ra. bác xem giúp em.
- đoạn code đó em để chạy công thức tự động cho cột AC và AF theo mỗi loại nguyên liệu dựa vào đơn vị nguyên liệu ở cột AB và AE ( file trước em để ví dụ hơn ít và ít loại nguyên liệu khác nhau lên không thể hiện rõ, em có gửi lai file nhiều dữ kiệm ở sheet MASTER ).
- dữ liệu ở cộ O Sheet Ma NVL là công thức cộng tổng nguyên liệu ở Sheet Master ạ. tại em xóa bớt Sheet nên nó bị lỗi.
file bạn gửi không có code mà mình đã gửi. lấy code ở trong file mình gửi lại và chạy thử
nhớ là copy toàn bộ code ở các modul và ở các sh (kể cả ở This WorkBook) nhé!
file bạn gửi không có code mà mình đã gửi. lấy code ở trong file mình gửi lại và chạy thử
nhớ là copy toàn bộ code ở các modul và ở các sh (kể cả ở This WorkBook) nhé!
- File em up lại là em mới up code bài #245 cửa bác. em đang để thấy shett MASTER sử dụng nhiều lại nguyên liệu nhiều công thưc tính khác nhau thôi ạ.
- File bác mới Up ở bài #247 và #251 em tải về thi đổi mã nguyên liệu khác ở cột Z thì nó báo lỗi như anh bác ak. hay do máy em nó thiếu phần j nên báo vậy nhi?
- File em up lại là em mới up code bài #245 cửa bác. em đang để thấy shett MASTER sử dụng nhiều lại nguyên liệu nhiều công thưc tính khác nhau thôi ạ.
- File bác mới Up ở bài #247 và #251 em tải về thi đổi mã nguyên liệu khác ở cột Z thì nó báo lỗi như anh bác ak. hay do máy em nó thiếu phần j nên báo vậy nhi?
File mình up cho bạn là mình đã thử và sửa rất nhiều lần trên máy mình rồi chạy êm ru, không vấp lỗi gì mà.
bạn up lại file bi lỗi lên mình xem lại xem có vấn đề gì tại máy hay tại code.
File mình up cho bạn là mình đã thử và sửa rất nhiều lần trên máy mình rồi chạy êm ru, không vấp lỗi gì mà.
bạn up lại file bi lỗi lên mình xem lại xem có vấn đề gì tại máy hay tại code.
em chỉ tải về chạy luôn khôn động chạm j cả. chắc máy em nó thiếu cái j đó rùi. em dùng win 7, off13.
mà code cũ không thêm cái phần mã nguyên liệu thì được. lạ thật!
File đính kèm
lỗi 1.png
459.1 KB
· Đọc: 4
lỗi 2.png
464.4 KB
· Đọc: 4
MASTER ĐỊNH MỨC 1-7 (nhập liệu nguyê liệu ) (1).xlsb
em chỉ tải về chạy luôn khôn động chạm j cả. chắc máy em nó thiếu cái j đó rùi. em dùng win 7, off13.
mà code cũ không thêm cái phần mã nguyên liệu thì được. lạ thật!
Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Autpen lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Autpen lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
Thật ra tôi rất thích tranh luận để chứng minh vấn đề
Vậy thay vì nói suông ta làm cuộc thí nghiệm với 10000 dòng dữ liệu giữa code của tôi VS với VLOOKUP nhé (xem file)
Tại sheet ChiTiet, điền dữ liệu vào cột C rồi lookup 16 cột còn lại bên phải
Code của tôi như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
Dim Arr(), tmp
On Error Resume Next
TG = Timer
If Dic Is Nothing Then Auto_Open
If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
Set rTarget = Intersect(Range("C6:C65536"), Target)
If IsArray(rTarget.Value) Then
aTarget = rTarget.Value
Else
ReDim aTarget(1 To 1, 1 To 1)
aTarget(1, 1) = rTarget.Value
End If
ReDim Arr(1 To UBound(aTarget, 1), 1 To 17)
For i = 1 To UBound(aTarget, 1)
If aTarget(i, 1) <> "" Then
tmp = aTarget(i, 1)
If Dic.Exists(tmp) Then
For j = 2 To 17
Arr(i, j - 1) = aResult(Dic.Item(tmp), j)
Next
End If
End If
Next
rTarget.Offset(, 1).Resize(, 16).Value = Arr
MsgBox Timer - TG
End If
End Sub
- Còn code "mượn" VLOOKUP như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
Dim Arr(), tmp
On Error Resume Next
TG = Timer
If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
Set rTarget = Intersect(Range("C6:C65536"), Target)
With rTarget.Offset(, 1).Resize(, 16)
.Value = "=IF(RC3="""","""",VLOOKUP(RC3,LLNV!R5C2:R10000C18,2,0))"
.Value = .Value
End With
MsgBox Timer - TG
End If
End Sub
Code này tương đương bạn tự tay gõ hàm VLOOKUP vào rồi copy/paste value thôi (tôi nghĩ không khó hiểu đối với bạn)
----------------
Giờ so sánh khi copy paste 10000 dòng dữ liệu vào cột C của sheet ChiTiet (dữ liệu tôi đã làm sẵn tại sheet1)
- Code tôi viết trên nền tảng xử lý mảng cho kết quả trong vòng 1.1 giây
- Code dùng VLOOKUP cho kết quả không vòng 25 giây
Đó là chưa nói code dùng VLOOKUP chỉ tìm duy nhất trên cột 2 ---> Nếu tìm 1 lần 16 cột như code của tôi dùng Array chắc là cách dùng VLOOKUP sẽ... đói luôn
Nếu thay đoạn "VLOOKUP(RC3,LLNV!R5C2:R10000C18, 2,0)" thành "VLOOKUP(RC3,LLNV!R5C2:R10000C18, COLUMNS(RC3:RC),0)" để lookup luôn 16 cột thì... Ẹc.. Ẹc... tôi không kiên nhẩn để chờ (lâu quá, treo máy luôn)
Đương nhiên khi làm cuộc thí nghiệm này tôi đã thử bằng rất nhiều cách với VLOOKUP... Chẳng hạn dùng WorksheetFunction.Vlookup ---> Kết quả còn tệ hơn rất nhiều
Bạn muốn dữ liệu "chuẩn" thế nào, hoặc muốn sửa VLOOKUP như thế nào, cứ đưa lên đây, chúng ta sẽ cùng thí nghiệm để bạn tâm phục khẩu phục về tốc độ của xửF
Thật ra tôi rất thích tranh luận để chứng minh vấn đề
Vậy thay vì nói suông ta làm cuộc thí nghiệm với 10000 dòng dữ liệu giữa code của tôi VS với VLOOKUP nhé (xem file)
Tại sheet ChiTiet, điền dữ liệu vào cột C rồi lookup 16 cột còn lại bên phải
Code của tôi như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
Dim Arr(), tmp
On Error Resume Next
TG = Timer
If Dic Is Nothing Then Auto_Open
If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
Set rTarget = Intersect(Range("C6:C65536"), Target)
If IsArray(rTarget.Value) Then
aTarget = rTarget.Value
Else
ReDim aTarget(1 To 1, 1 To 1)
aTarget(1, 1) = rTarget.Value
End If
ReDim Arr(1 To UBound(aTarget, 1), 1 To 17)
For i = 1 To UBound(aTarget, 1)
If aTarget(i, 1) <> "" Then
tmp = aTarget(i, 1)
If Dic.Exists(tmp) Then
For j = 2 To 17
Arr(i, j - 1) = aResult(Dic.Item(tmp), j)
Next
End If
End If
Next
rTarget.Offset(, 1).Resize(, 16).Value = Arr
MsgBox Timer - TG
End If
End Sub
- Còn code "mượn" VLOOKUP như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rTarget As Range, aTarget, i As Long, j As Long, n As Long, TG As Double
Dim Arr(), tmp
On Error Resume Next
TG = Timer
If Not Intersect(Range("C6:C65536"), Target) Is Nothing Then
Set rTarget = Intersect(Range("C6:C65536"), Target)
With rTarget.Offset(, 1).Resize(, 16)
.Value = "=IF(RC3="""","""",VLOOKUP(RC3,LLNV!R5C2:R10000C18,2,0))"
.Value = .Value
End With
MsgBox Timer - TG
End If
End Sub
Code này tương đương bạn tự tay gõ hàm VLOOKUP vào rồi copy/paste value thôi (tôi nghĩ không khó hiểu đối với bạn)
----------------
Giờ so sánh khi copy paste 10000 dòng dữ liệu vào cột C của sheet ChiTiet (dữ liệu tôi đã làm sẵn tại sheet1)
- Code tôi viết trên nền tảng xử lý mảng cho kết quả trong vòng 1.1 giây
- Code dùng VLOOKUP cho kết quả không vòng 25 giây
Đó là chưa nói code dùng VLOOKUP chỉ tìm duy nhất trên cột 2 ---> Nếu tìm 1 lần 16 cột như code của tôi dùng Array chắc là cách dùng VLOOKUP sẽ... đói luôn
Nếu thay đoạn "VLOOKUP(RC3,LLNV!R5C2:R10000C18, 2,0)" thành "VLOOKUP(RC3,LLNV!R5C2:R10000C18, COLUMNS(RC3:RC),0)" để lookup luôn 16 cột thì... Ẹc.. Ẹc... tôi không kiên nhẩn để chờ (lâu quá, treo máy luôn)
Đương nhiên khi làm cuộc thí nghiệm này tôi đã thử bằng rất nhiều cách với VLOOKUP... Chẳng hạn dùng WorksheetFunction.Vlookup ---> Kết quả còn tệ hơn rất nhiều
Bạn muốn dữ liệu "chuẩn" thế nào, hoặc muốn sửa VLOOKUP như thế nào, cứ đưa lên đây, chúng ta sẽ cùng thí nghiệm để bạn tâm phục khẩu phục về tốc độ của xử lý Array
Em muốn biết cách thay đổi code ở đâu luôn ấy ạ, ví dụ như file này em muốn lấy 2 cột là người phụ trách và số đt người phụ trạch. Vì em muốn biết để custom vào những file sau luôn
Có thể do máy bạn. máy mình cài win 10, offce 2016 chạy êm du chẳng vấp lỗi nào. Bạn thử quét virut rồi chạy thử, hoặc copy sang máy khác chạy thử xem sao. Hoặc đăng bài mới trên diễn đàn hỏi mọi người xem nó bị sao, để có hướng khắc phục.
Mình gửi lại file đã có sửa lại code để cứ tắt máy thì máy tự xóa bỏ dic đã lưu để tiết kiệm tài nguyên (không ảnh hưởng đến dữ liệu của file), khi mở sub Autpen lại được kích hoạt để nạp Dic sủa dụng cho các Modul appdate và các sự kiện khi thay đổi ở các sh Bang NVL, DMSP .
Và thêm phần tự điền công thức ở cột O và Q rồi nhé. từ đây về sau cứ khi bạn có sự thay đổi nào ở vùng C5:K100000 của sh Bang NVL thì cột O và Q sẽ tự động cập nhật công thức, các dữ liệu của Sh MASTER cũng thay đổi theo.
bác cho em hỏi! em muốn bỏ phần tự chạy công thức ở cột AC; AD; AF để nó chạy như code cũ cửa em. em có xóa đoạn code này đi thì nó lại không chạy được NVL luôn.
"
kTarget.Offset(, -1).Resize(, 15).Value = arr1
kTarget.Offset(, 3).FormulaR1C1 = "=(RC[-7]/1000*RC[-8]/1000)/RC[-5]"
kTarget.Offset(, 4).FormulaR1C1 = "=RC[-1]*RC[-13]"
kTarget.Offset(, 6).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
' kTarget.Offset(, 10).FormulaR1C1 = "=(RC[-5]+RC[-5]*RC[-1])*RC[1]"' DUA VAO CODE CHAY SAI--> CHÂM "
bác cho em hỏi! em muốn bỏ phần tự chạy công thức ở cột AC; AD; AF để nó chạy như code cũ cửa em. em có xóa đoạn code này đi thì nó lại không chạy được NVL luôn.
"
kTarget.Offset(, -1).Resize(, 15).Value = arr1
kTarget.Offset(, 3).FormulaR1C1 = "=(RC[-7]/1000*RC[-8]/1000)/RC[-5]"
kTarget.Offset(, 4).FormulaR1C1 = "=RC[-1]*RC[-13]"
kTarget.Offset(, 6).FormulaR1C1 = "=RC[-15]/RC[-8]/((INT(RC[1]/RC[-11])*INT(RC[2]/RC[-10])))"
' kTarget.Offset(, 10).FormulaR1C1 = "=(RC[-5]+RC[-5]*RC[-1])*RC[1]"' DUA VAO CODE CHAY SAI--> CHÂM "
Bạn xóa bỏ đoạn code đó như thế nào; nếu xóa hoàn toàn như đoạn ở trên thì bạn đã xóa mất đoạn code để nó ghi lại kết quả; các dòng có ....FormulaR1C1="=.... là dòng code điền công thức.
dòng code dưới đây là dòng ghi lại kết quả lên sheet (bạn không được xóa bỏ dòng này-dòng tô đậm). kTarget.Offset(, -1).Resize(, 15).Value = arr1
Có điều khi xóa các dòng tự điền công thức thì cứ mỗi khi bạn thêm dữ liệu lại phải sao chép công thức xuống các ô thôi.
Chúc thành công.