lỗi cụ thể là lỗi j bạn? bạn thử chụp hình lên đây xem saoChào mọi người
Cho em hỏi là cùng 1 đoạn code mà trên máy em lại không chạy được nhưng qua máy khác lại chạy được.
Mọi người chỉ cho em khắc phục lỗi này với ạ. Em cám ơn!
lỗi cụ thể là lỗi j bạn? bạn thử chụp hình lên đây xem saoChào mọi người
Cho em hỏi là cùng 1 đoạn code mà trên máy em lại không chạy được nhưng qua máy khác lại chạy được.
Mọi người chỉ cho em khắc phục lỗi này với ạ. Em cám ơn!
Em gửi file đính kèm. nhờ mọi người xem giúp em. bình thường em mở file là nó chạy bình thường nhưng giờ nó không chạy được. nhưng đem qua máy khác thì vẩn chạy bình thường. em cám ơn!lỗi cụ thể là lỗi j bạn? bạn thử chụp hình lên đây xem sao
Dạ e gửi ảnh và file đính kèm rồi đó ahThì ít ra bạn cũng lôi cái code đó lên đây.Và xem nó lỗi ở đâu.Tốt nhất gửi file lỗi lên.
Mình gửi vd lên nhờ các bắc bớt chút thời gian chỉ dùm vài chiêu
Cảm ơn các bạn nhiều!!!
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
Range("C4") = "=IFERROR(VLOOKUP(RC[-1],MA!R3C2:R7C4,2,0),"""")"
Range("D4") = "=IFERROR(VLOOKUP(RC[-2],MA!R3C2:R7C4,3,0),"""")"
Range("C4:d4").Value = Range("C4:d4").Value
End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B4")) Is Nothing Then
Range("C4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,2,0),"""")")
Range("D4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,3,0),"""")")
End If
End Sub
Cái mồ này đã tám năm rồi mà.Ngắn hơn một chút:
...
Tôi có mở file, nhìn code vậy tôi cũng chưa ra được lỗi gì? Máy này chạy được, máy kia ko chạy được có thể do phần Path (không tồn tại đường dẫn này).Em gửi file đính kèm. nhờ mọi người xem giúp em. bình thường em mở file là nó chạy bình thường nhưng giờ nó không chạy được. nhưng đem qua máy khác thì vẩn chạy bình thường. em cám ơn!
dạ em cám ơn ạ!Tôi có mở file, nhìn code vậy tôi cũng chưa ra được lỗi gì? Máy này chạy được, máy kia ko chạy được có thể do phần Path (không tồn tại đường dẫn này).
Như một số chuyên gia có tư vấn, việc gộp File bạn nên dùng thử Power Query, có tài liệu của thầy @ptm0412.
Thử xem sao nhé
Ngắn nhất cho bạn. Dể hiểu nhất cho bạn......Buye
Mã:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B4")) Is Nothing Then Range("C4") = "=IFERROR(VLOOKUP(RC[-1],MA!R3C2:R7C4,2,0),"""")" Range("D4") = "=IFERROR(VLOOKUP(RC[-2],MA!R3C2:R7C4,3,0),"""")" Range("C4:d4").Value = Range("C4:d4").Value End If End Sub
Chào bạn,Ngắn hơn một chút:
PHP:Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B4")) Is Nothing Then Range("C4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,2,0),"""")") Range("D4").Value = Evaluate("=IFERROR(VLOOKUP(B4,MA!$B$3:$D$7,3,0),"""")") End If End Sub
Dùng thử phương thức tìm kiếm Find xem sao, click UpdateChào bạn,
Tương tự như yêu cầu của chủ đề,
Bạn ban đầu Vlookup cho 1 giá trị. Nếu mở rộng thêm nhiều giá trị tương tự thì code VBA thế nào vậy, có thể giúp mình được không.
Thanks
Sub FindMethod()
Dim i&, Rng As Range, KQ(), Ma()
Ma = Range(Sheets("CT").[B4], Sheets("CT").[B500].End(3))
ReDim KQ(1 To UBound(Ma), 1 To 2)
For i = 1 To UBound(Ma)
Set Rng = Sheets("MA").[B3:B500].Find(Ma(i, 1), , , 1)
If Not Rng Is Nothing Then
KQ(i, 1) = Rng(, 1)
KQ(i, 2) = Rng(, 2)
End If
Next
Sheets("CT").[C4].Resize(i - 1, 2) = KQ
End Sub
yêu câu thứ 1: khi thay đổi bất kỳ bên sheet "LLNV" thì sheet "chitiet" cập nhật theo (giống tính năng của hàm vlookup)
cái này có thể sử dụng find method trong sự kiện worksheet change cho sheet "LLNV"
tuy nhiên cho hỏ là: các mã cột C của sheet "chi tiet" có trùng nhau ko?
câu hỏi 2: nếu nằm ở file khác thì phức tạp hơn là phải mở file đó ra rồi dùng phương pháp Find
(hoặc dùng ADO, cái này thì tôi chỉ biết là vậy chứ chưa biết làm)
Câu 2 bạn đã nhận được sự giúp đỡ chưa? Mình cũng đang tìm đề tài này.yêu câu thứ 1: khi thay đổi bất kỳ bên sheet "LLNV" thì sheet "chitiet" cập nhật theo (giống tính năng của hàm vlookup)
cái này có thể sử dụng find method trong sự kiện worksheet change cho sheet "LLNV"
tuy nhiên cho hỏ là: các mã cột C của sheet "chi tiet" có trùng nhau ko?
câu hỏi 2: nếu nằm ở file khác thì phức tạp hơn là phải mở file đó ra rồi dùng phương pháp Find
(hoặc dùng ADO, cái này thì tôi chỉ biết là vậy chứ chưa biết làm)
Nên chăng copy dữ liệu nguồn vào 1 sheet, tha hồ tìm kiếm, truy vấn...chào mọi người
cho em hỏi nếu link từ 1 file khác sang thi nên dùng code nào ạ
Mong mọi người giúp đỡ
Link File thì không cần dùng code, cứ gõ dấu = ; hoặc copy - paste link thông thường của Excel là đượcchào mọi người
cho em hỏi nếu link từ 1 file khác sang thi nên dùng code nào ạ
Mong mọi người giúp đỡ
Code viết rất hay, cảm on bạn sẽ để dành dùng khin cầnCái ni cũng vừa đủ sòai nề
PHP:Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B4:B99")) Is Nothing Then Dim Rng As Range, sRng As Range, Sh As Worksheet Set Sh = ThisWorkbook.Worksheets("MA") Set Rng = Sh.Range(Sh.[b2], Sh.[b2].End(xlDown)) Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole) If sRng Is Nothing Then MsgBox "Nothing" Else Target.Offset(, 1).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value End If End If End Sub
Code viết rất hay, cảm on bạn sẽ để dành dùng khin cần
Bạn thử Code.Chào các bác.
Nhờ các bác thêm giúp e đoạn code để có thể tìm từ cột MA sang nhiều sheet với ạ.
Hiện tại ở File e đã lấy từ một bác ở trên, chạy khá ổn, giờ e muốn nó chạy thêm vài sheet nữa để.
Sub laydulieu()
Dim i As Long, lr As Long, dic As Object, a As Long, sh As Worksheet, kq, arr, dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheets("Ma")
lr = .Range("B" & Rows.Count).End(xlUp).Row
If lr < 3 Then Exit Sub
arr = .Range("B3:E" & lr).Value
For i = 1 To UBound(arr)
dk = arr(i, 1)
If Not dic.exists(dk) Then
dic.Add dk, arr(i, 4)
End If
Next i
End With
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> "MA" Then
With sh
lr = .Range("B" & Rows.Count).End(xlUp).Row
If lr > 3 Then
arr = .Range("B4:C" & lr).Value
ReDim kq(1 To UBound(arr), 1 To 1)
For i = 1 To UBound(arr)
dk = arr(i, 1)
If dic.exists(dk) Then
kq(i, 1) = dic.Item(dk)
End If
Next i
End If
.Range("G4:G" & lr).Value = kq
End With
End If
Next
End Sub
Bác Coppy đoạn code này và chạy thử trong file đính kèm giúp em. e đã thử mà không được ạ.Bạn thử Code.
Mã:Sub laydulieu() Dim i As Long, lr As Long, dic As Object, a As Long, sh As Worksheet, kq, arr, dk As String Set dic = CreateObject("scripting.dictionary") With Sheets("Ma") lr = .Range("B" & Rows.Count).End(xlUp).Row If lr < 3 Then Exit Sub arr = .Range("B3:E" & lr).Value For i = 1 To UBound(arr) dk = arr(i, 1) If Not dic.exists(dk) Then dic.Add dk, arr(i, 4) End If Next i End With For Each sh In ThisWorkbook.Worksheets If sh.Name <> "MA" Then With sh lr = .Range("B" & Rows.Count).End(xlUp).Row If lr > 3 Then arr = .Range("B4:C" & lr).Value ReDim kq(1 To UBound(arr), 1 To 1) For i = 1 To UBound(arr) dk = arr(i, 1) If dic.exists(dk) Then kq(i, 1) = dic.Item(dk) End If Next i End If .Range("G4:G" & lr).Value = kq End With End If Next End Sub
Bác nào giúp em với ạ.Bác Coppy đoạn code này và chạy thử trong file đính kèm giúp em. e đã thử mà không được ạ.
Bạn xem thử file đính kèm xem đúng yêu cầu của bạn không nhé!Bác nào giúp em với ạ.
Dạ đúng rồi ạ. Em cảm ơn bác nhiều nhéBạn xem thử file đính kèm xem đúng yêu cầu của bạn không nhé!
Bác quick87 em thấy file bác rất hay. em muốn áp dụng vào file cửa em nhưng không rõ phải sửa đổi chỗ nào nào mò mãi không được. bác giúp em với.Bạn xem thử file đính kèm xem đúng yêu cầu của bạn không nhé!
Không chỉ riêng mình mà rất nhiều thành viên khác sẽ giúp được bạn nhưng file như thế này thì sao giúp được bạn đây:Bác quick87 em thấy file bác rất hay. em muốn áp dụng vào file cửa em nhưng không rõ phải sửa đổi chỗ nào nào mò mãi không được. bác giúp em với.
chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!Không chỉ riêng mình mà rất nhiều thành viên khác sẽ giúp được bạn nhưng file như thế này thì sao giúp được bạn đây:
View attachment 261339
Thêm nữa, không nên nhờ đích danh một cá nhân thì kết quả bạn sẽ nhận được nhiều hơn bạn mong đợi đó!
các bác cho em hỏi. em làm nhưng sao nó cú chạy là các dữ liệu ở sheet khác bị xóa sạch. các giúp em với?chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!
Nếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.chết em quên mất bỏ cái mật khẩu. Tại em thấy code cửa bác hay đúng mình đang cần nên nếu được bác trực tiếp chỉ giáo thì thật tốt. bác xem giúo em với!
Bạn đã chạy thử chưa. nếu thấy ưng ý thì nhờ mọi người giúp đỡ cái vụ Data Validation có cỡ chữ nhỏ muốn phóng to lên hơn thì phải làm thế nào , Cỡ chữ của Data validation to lên thì xem dễ hơn và thao tác chọn cũng dễ hơn.Nếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.
Ở sh MASTER Danpla mình đã làm Data validation cho bạn rồi, cứ kích chọn một mã trong danh sách sổ xuống và xem diễn biến ở các ô cần lấy dữ liệu. Có điều danh sách sổ xuống cõ chữ nhỏ quá mà mình tìm mãi để nó to lên mà không được.
file cửa bác rất hay, nhưng nó lại không cập nhật khi mình thay đổi nội dung ở sheet DMSP. em làm theo code bắcNếu bạn vẫn còn quan tâm và muốn dùng code thì thử xem sao.
Ở sh MASTER Danpla mình đã làm Data validation cho bạn rồi, cứ kích chọn một mã trong danh sách sổ xuống và xem diễn biến ở các ô cần lấy dữ liệu. Có điều danh sách sổ xuống cõ chữ nhỏ quá mà mình tìm mãi để nó to lên mà không được.
file cửa bác rất hay, nhưng nó lại không cập nhật khi mình thay đổi nội dung ở sheet DMSP. em làm theo code bắc
quick87
ở trên thì mày mò ra được cho file cửa em ở dưới. 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!
1- vâng! fiile này em thây đổi cột mã đưa về đầu để làm cho dễ. nhưng nó chạy ra được nhưng các Sheet khách không liên quan bị xóa nội dùng, em cũng muốn bác Quick87 tư vấn nhưng forum không có phần chat riêng sao đó. các bác cao nhân hiểu về VBA giúp em với.1/ file bạn gửi có cấu trúc không giống với file ỏ bài #229 và file bạn gửi của sổ VBE có pass --> không mở được (bạn lưu ý lần sau nhé), và cứ bám vào bác Quick87 để hỏi nhé.
2/ file mình làm cho bạn đã Define name động phần mã sản phẩm (Thùng/mã vạch) cột (D sh DMSP Danpla )rồi. bạn thử thêm một mã mới vào chạy thử xem).
Nếu thay đổi lại nội dung của các cột khác (<> D) thì phải chạy lại dòng đó bên sh MASTER danpla.
Bạn up lại file của bạn có code của anh Quick87lên đi (nhớ là gỡ bỏ pass) nhé, để mình xem có giúp được không?1- vâng! fiile này em thây đổi cột mã đưa về đầu để làm cho dễ. nhưng nó chạy ra được nhưng các Sheet khách không liên quan bị xóa nội dùng, em cũng muốn bác Quick87 tư vấn nhưng forum không có phần chat riêng sao đó. các bác cao nhân hiểu về VBA giúp em với.
2- em biết file bác làm chạy được nhưng chỉ có nhược điểm việc cập nhật thông tin thay đổi ở sheet DMSP Danpla thì lại phải load lại hết mã ở sheet MASTER danpla. mà file cửa em nó phải để trên 18000 dòng, mà đôi khi mình quên dẫn đến sai. bác có cách nào khác phuc giúp em!
Vâng bác. bài #233 em có up file mới bỏ pass và đưa được code cửa bác @quick87 vào thì chạy được như lại bị lỗi xóa nội dung ở các sheet khác (sheet "Bảng mã nguyên vật liệu"....). đang nhờ mọi người và bác ấy giúp ạ!Bạn up lại file của bạn có code của anh Quick87lên đi (nhớ là gỡ bỏ pass) nhé, để mình xem có giúp được không?
Bác phải thay đổi nội dung ở sheet DMSP hoặc nhập mã ở sheet MÁTER. Để nó chạy update dữ liệu thì mới bị ạMở ở của máy mình bình thường mà có sao đâu?
Sheet MASTER có quan hệ thế nào với Sh Bang Ma NVL? mình nghi ngờ là sub Update ấy tác động đến Sh Bang ma NVL ở đoạn code trong sh DMSP DanplaBác phải thay đổi nội dung ở sheet DMSP hoặc nhập mã ở sheet MÁTER. Để nó chạy update dữ liệu thì mới bị ạ
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.Sheet MASTER có quan hệ thế nào với Sh Bang Ma NVL? mình nghi ngờ là sub Update ấy tác động đến Sh Bang ma NVL ở đoạn code trong sh DMSP Danpla
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é.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.
file chạy ngon luôn bác! thank bác rất nhiều!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.file chạy ngon luôn bác! thank bác rất nhiều!
Đúng là file em nó lắm công thức quá load nâu thật.hihi!
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.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.
- 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.Đã 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ùybạ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.
View attachment 262063
Em quên không bỏ part.
- 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ạ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?
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.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!
Vâng! Chắc tại máy em để em thử máy khác xem ạ.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:
- 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 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
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)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
----------------
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
Ví dụ như trong bài này có 17 cột , nếu em muốn lấy chỉ một số cột nhất định trong 17 cột đó thì sẽ thay đổi ở đâu ạ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:
- 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 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
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)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
----------------
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
(1) Ví dụ như trong bài này có 17 cột , nếu em muốn lấy chỉ một số cột nhất định trong 17 cột đó thì sẽ thay đổi ở đâu ạ
(2) Hãy copy B6:B10000 ở sheet LLNV rồi paste vào C6 tại sheet này
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(1) Bạn phải cho biết những cột nào cần Ccopy.
(2) ???
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.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ạ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.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 "
macro sau sẽ hiện kết quả 3 cột (thêm cột đầu) ở trang 'ChiTiet':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
Sub Auto_Open()
Dim Wks As Worksheet, SrcRng As Range, sArray
Dim lR As Long, I As Long, J As Long, Num As Long, Tmp
' On Error Resume Next '
Set Wks = Sheets("LLNV")
lR = Wks.[B6].CurrentRegion.Rows.Count '+ + '
Set SrcRng = Wks.Range("B6:R" & lR) '* * '
sArray = SrcRng.Value: lR = 0 ''
ReDim aResult(1 To UBound(sArray, 1), 1 To UBound(sArray, 2))
Set Dic = CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArray, 1)
If CStr(sArray(I, 1)) <> "" Then
Tmp = sArray(I, 1)
If Not Dic.Exists(Tmp) Then
lR = lR + 1
Dic.Add Tmp, lR
For J = 1 To UBound(sArray, 2) Step 2 '17 '
Num = Num + 1
aResult(lR, Num) = sArray(I, J)
Next
Num = 0
End If
End If
Next
Sheets("Chitiet").[C6].Resize(lR, 3).Value = aResult()
End Sub
em có xóa bỏ được công thức. nhưng có vấn đề là khi kéo hoặc paste nhiều mã NVL ở cột Z thì nó chỉ chạy có đúng 1 dòng trên , cú phải nhấp vào rồi enter từng cái 1 mới chạy code không được như cột mã sản phẩm ở cột A. và khi thay đổi j đó ở Sh ma NVL thì nó không auto thay đổi ở Sh bang MASTER. lại phải kích vào enter mới cập nhật. làm sao để nó hoạt động auto như phần nhập mã sản phẩm ạ. Bác xem giúp em với!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.
Nhờ anh chị nào giúp code dùng mãng thay thế cho dùng vba vlookup do dữ liệu lớn nên vlookup chạy giật quá. Xin cám ơn
Trong khi chờ các giải pháp khác thử tham khảo code trong file sauNhờ anh chị nào giúp code dùng mãng thay thế cho dùng vba vlookup do dữ liệu lớn nên vlookup chạy giật quá. Xin cám ơn
Bài đã được tự động gộp: