Chạy tự động hàm vlookup

Liên hệ QC

huy_barca

Thành viên mới
Tham gia
29/6/10
Bài viết
27
Được thích
0
Em chào Anh!
Có thể giúp em xây dựng code chạy vlookup tự động từ sheet 1 sang sheet 2 của file excel đươc không ah. Em đã làm sẵn cho mã FPT, có cách nào mình chạy tự động cho hai mã PET va POT không ạh.
Thanks các Anh.
 

File đính kèm

Em chào Anh!
Có thể giúp em xây dựng code chạy vlookup tự động từ sheet 1 sang sheet 2 của file excel đươc không ah. Em đã làm sẵn cho mã FPT, có cách nào mình chạy tự động cho hai mã PET va POT không ạh.
Thanks các Anh.
Chưa hiểu ý bạn lắm, bạn cần lấy dữ liệu gì qua sheet2, Date hay Close?
Bạn cứ thử dùng công thức này cho ô B3 trên sheet2: =VLOOKUP($A3,Sheet1!$A:$F,COLUMN(B$1),0) và fill cho toàn bảng (các cột A:F) xem có đúng ý bạn không.
 
Upvote 0
Dạ. Em cần lấy dự liệu close của từng mã cổ phiếu qua sheet 2. Thay vì em phải làm tay là dùm hàm vlookup của mã FPT qua sheet2, sau đó em phải tiếp dùm vlookup cho mã PET...tức là em phải tiếp tục dùng công thức" VLOOKUP(A3,Sheet1!C2:$D$874,2,FALSE)" cho cột C ở sheet 2. Làm như vậy thì lâu quá. Anh có thể viết code giúp em nhấn nút 1 cái là tự động vlookup cho em 3 mã FPT, PET và POT không ah?
 
Upvote 0
Em chào Anh!
Có thể giúp em xây dựng code chạy vlookup tự động từ sheet 1 sang sheet 2 của file excel đươc không ah. Em đã làm sẵn cho mã FPT, có cách nào mình chạy tự động cho hai mã PET va POT không ạh.
Thanks các Anh.
Bạn dùng công thức này cho ô B3 của Sheet2. Cần tìm mã nào thì nhập mã đó vào ô B2 của Sheet2
Mã:
 =VLOOKUP(A3,OFFSET(Sheet1!$A$2,,MATCH($B$2,Sheet1!$1:$1,0)-2,COUNTA(OFFSET(Sheet1!$A:$A,,MATCH($B$2,Sheet1!$1:$1,0)-2)),2),2,0)
 
Upvote 0
Dạ. Em cần lấy dự liệu close của từng mã cổ phiếu qua sheet 2. Thay vì em phải làm tay là dùm hàm vlookup của mã FPT qua sheet2, sau đó em phải tiếp dùm vlookup cho mã PET...tức là em phải tiếp tục dùng công thức" VLOOKUP(A3,Sheet1!C2:$D$874,2,FALSE)" cho cột C ở sheet 2. Làm như vậy thì lâu quá. Anh có thể viết code giúp em nhấn nút 1 cái là tự động vlookup cho em 3 mã FPT, PET và POT không ah?
Bạn dùng tạm code này nhé:
PHP:
Sub LookupValue()
    Dim i As Long, j As Byte, Cll As Range
    Sheet2.Activate
    On Error Resume Next
    Range([A], [A65536].End(xlUp)).Offset(, 1).Resize(, 3).Clear
    For i = 3 To [A65536].End(xlUp).Row
        Set Cll = Sheet1.[A:A].Find(Range("A" & i), Sheet1.[A2], xlValues, xlWhole)
        For j = 0 To 2
            Range("B" & i).Offset(, j) = Cll.Offset(, 2 * j + 1)
        Next j
    Next i
End Sub
 

File đính kèm

Upvote 0
Anh nghiaphuc. Hình như code anh bị viết sai hay sao đó. Tại vì đúng thì 7/7/2008 của cổ phiếu PET phải có giá 17.7 chứ không phải là 14.5. Tức là đối với cổ phiếu PET anh phải tham chiếu ngày 7/7/2008 (tức là giá trị ô A3 ở sheet 2) đến cột C tức là cột date của cổ phiếu PET, tương tư đối với cổ phiếu POT anh phải tham chiếu ngày 7/7/2008 (tức là giá trị ô A3 ở sheet 2) đến cột E ở sheet 1 tức là cột date của cổ phiếu POT.
Anh xem lại dùm em. Thanks Anh.
 
Upvote 0
Anh nghiaphuc. Hình như code anh bị viết sai hay sao đó. Tại vì đúng thì 7/7/2008 của cổ phiếu PET phải có giá 17.7 chứ không phải là 14.5. Tức là đối với cổ phiếu PET anh phải tham chiếu ngày 7/7/2008 (tức là giá trị ô A3 ở sheet 2) đến cột C tức là cột date của cổ phiếu PET, tương tư đối với cổ phiếu POT anh phải tham chiếu ngày 7/7/2008 (tức là giá trị ô A3 ở sheet 2) đến cột E ở sheet 1 tức là cột date của cổ phiếu POT.
Anh xem lại dùm em. Thanks Anh.
Bài này dùng Advance Filter là ra ngay (dùng Advanced Filter 3 lần)
Nếu viết code thì cũng sẽ dựa trên thao tác này ---> Vòng lập For quét 3 lần
 
Upvote 0
Anh có thể viết dùm em code được không? Tại vì em viết code còn yếu lắm, Anh có thể viết để em tham khảo thêm được không Anh?
 
Upvote 0
Anh có thể viết dùm em code được không? Tại vì em viết code còn yếu lắm, Anh có thể viết để em tham khảo thêm được không Anh?
Đầu tiên tôi sửa lại dữ liệu ở sheet1 như vầy:

untitled1.JPG


Bên sheet2 giữ nguyên và code như sau:
PHP:
Sub Loc()
  Dim SrcRng As Range, CritRng As Range, i As Long, title
  Set SrcRng = Sheet1.Range("A2").CurrentRegion
  Set CritRng = Sheet2.Range("A2").CurrentRegion
  title = Array("FPT Date", "PET Date", "POT Date")
  For i = 0 To 2
    Sheet2.Range("A2").Value = title(i)
    SrcRng.Resize(, 2).Offset(, i * 2).AdvancedFilter 2, CritRng, Sheet2.Range("C2").Offset(, i * 2)
  Next
End Sub
 

File đính kèm

Upvote 0
Dạ. Nhưng làm vậy thì giống lần trước anh đã chỉ em rùi ( lần mà anh chỉ em gộp 10 cái lọc thành 1 cái lọc đó Anh). Nhưng lần này thì khác, em gởi anh file excel phải làm bằng tay, em lấy dữ liệu từ sheet 1 qua bên sheet 2. Em phải sử dụng vlookup tới 3 lần, Với lại ở sheet 2 có cái dòng hiện chữ "N/A" anh có thể viết code chay ra y chan như em đã làm tay bên sheet 2 được không Anh?
Tại vì thực tế là em tới 400 mã cổ phiếu, chứ không phải là 3 mã đâu...làm tay chắc em chết.
Thanks Anh.
 

File đính kèm

Upvote 0
Dạ. Nhưng làm vậy thì giống lần trước anh đã chỉ em rùi ( lần mà anh chỉ em gộp 10 cái lọc thành 1 cái lọc đó Anh). Nhưng lần này thì khác, em gởi anh file excel phải làm bằng tay, em lấy dữ liệu từ sheet 1 qua bên sheet 2. Em phải sử dụng vlookup tới 3 lần, Với lại ở sheet 2 có cái dòng hiện chữ "N/A" anh có thể viết code chay ra y chan như em đã làm tay bên sheet 2 được không Anh?
Tại vì thực tế là em tới 400 mã cổ phiếu, chứ không phải là 3 mã đâu...làm tay chắc em chết.
Thanks Anh.
Thì sau khi lọc bằng Advanced Filter xong, bạn xóa những cột không cần thiết là được rồi
 
Upvote 0
Dạ, tại vì thêm kiểu lọc của Anh nó sẽ mất các dòng chứa chữ "N/A" mà em cũng cần phải có các dòng đó. Với lại em chạy 400 mã như vậy em phải xóa 200 cột như vậy thì mắc công quá mà em phải chạy 6 lần file excel dạng như vậy tức là em phải xóa các dong rất nhiều. Anh có thể giúp dùm em. Em có gởi Anh file excel anh xem giúp dùm em
Thanks Anh.
 
Upvote 0
Dạ, tại vì thêm kiểu lọc của Anh nó sẽ mất các dòng chứa chữ "N/A" mà em cũng cần phải có các dòng đó. Với lại em chạy 400 mã như vậy em phải xóa 200 cột như vậy thì mắc công quá mà em phải chạy 6 lần file excel dạng như vậy tức là em phải xóa các dong rất nhiều. Anh có thể giúp dùm em. Em có gởi Anh file excel anh xem giúp dùm em
Thanks Anh.
Nếu dữ liệu của bạn khác hơn so với file đưa lên ở đây thì bạn phải post lại file nha (dữ liệu khác, code cũng phải khác)
Còn như dữ liệu y chang thì tôi viết luôn trong file cái vụ "dọn rác" này
(thêm nữa, tôi cũng không hiểu bạn nói mấy chữ "N/A" nghĩa là cái gì nữa)
 

File đính kèm

Upvote 0
Ah... xin lỗi bạn! Xem kỹ lại tôi mới hiểu cái vụ "N/A" nghĩa là như thế nào
Vậy thì chỉ có mỗi cách dùng VLOOKUP thôi, nhưng viết thành VBA để cho bạn nhấn nút ra kết quả
PHP:
Sub Loc()
  Dim fRng As Range, SrcRng As Range, i As Long
  Application.ScreenUpdating = False
  Set fRng = Sheet2.Range(Sheet2.[A3], Sheet2.[A60000].End(xlUp))
  Set SrcRng = Sheet1.Range("A1").CurrentRegion.Resize(, 2)
  For i = 1 To 3
    With fRng.Offset(, i)
      .Value = "=VLOOKUP(RC[-" & i & "], Sheet1!" & SrcRng.Address(, , 2) & ",2,0)"
      .Value = .Value
    End With
    Set SrcRng = SrcRng.Offset(, 2)
  Next
  Application.ScreenUpdating = True
End Sub
Xem lại file mới này nha
 

File đính kèm

Upvote 0
Dạ, Anh quan sát file của Anh sau khi nhấn chữ " Run Code" thì đúng là hiện ra 3 cột như em mong muốn rùi, nhưng Anh thử rê thanh lăn xuống dòng 134, Anh thấy rằng đối với cột A bị dư ra 3 hàng so với các cột còn lại, Em ví dụ đối với trường hợp FPT (tức là cột B sheet 2) thì giá 37.8751 đúng ra là nó phải nằm ở dòng 137 thì mới đúng.
Anh thử làm bằng tay bằng vlookup (VLOOKUP(A3,Sheet1!$A$3:$B$1057,2,FALSE)) đối với cột B ở sheet 2 đi, Anh sẽ thấy có những đòng nó sẽ để chữ " #NA" tức là dòng đó không có dự liệu bên sheet 1 và con số 37.8751 chắc chắn sẽ nằm ở dòng 137.
Thanks Anh/
 
Upvote 0
(thêm nữa, tôi cũng không hiểu bạn nói mấy chữ "N/A" nghĩa là cái gì nữa)
Tức là ngày nào trong dữ liệu không có thì kết quả là "N/A" chứ không phải dồn lên như Bác làm. Bác Dùng Advance Filter rồi mà lại xóa mất cột ngày thì kết quả lại sai do có một số ngày trong dữ liệu không có. Kéo xuống dưới sẽ thấy các cột kết quả ngắn hơn cột ngày, chứng tỏ kết quả đã bị lệch dòng so với cột ngày rồi.
Thôi thì dùng Vlookup() luôn. Bạn huy_barca xem thử có xài được không.
PHP:
Sub Test()
    Dim Rng As Range, Cll As Range
    Set Rng = Sheet2.Range(Sheet2.[A3], Sheet2.[A65536].End(xlUp))
    For Each Cll In Sheet1.[1:1].SpecialCells(2, 23)
        Set Rng = Rng.Offset(, 1)
        Rng.Offset(-1)(1, 1).Value = Cll
        Rng.FormulaR1C1 = "=VLOOKUP(RC1,Sheet1!C" & (Cll.Column - 1) & ":C" & Cll.Column & ",2,0)"
        Rng.Value = Rng.Value
    Next
End Sub
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom