hoahuongduong1986
Thành viên thường trực
- Tham gia
- 14/11/18
- Bài viết
- 346
- Được thích
- 40
Bạn thử code nàyEm nhờ Anh chị chút ạ.
Code cho các hàm tại vùng F : H tại Sheet So Giao dich là thế nào ạ. Em có tìm hiểu một số bài nhưng thấy khó quá. Em cảm ơn ạ.
Code trong Module
Option Explicit
Public Chk As Boolean, Dic As Object, aResult()
Sub Vlookup()
Dim wks As Worksheet, SrcRng As Range, sArray
Dim LR As Long, i As Long, n As Long, tmp
On Error Resume Next
Set wks = Sheets("Ma")
Set SrcRng = wks.Range("B2:E7")
sArray = SrcRng.Value
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
aResult(LR, 1) = tmp
aResult(LR, 2) = sArray(i, 2) 'Loai hang
aResult(LR, 3) = sArray(i, 3) 'Cong ty cap
aResult(LR, 4) = sArray(i, 4) 'Hang cong ty
End If
End If
Next
End Sub
Code trong sheet So giao dich
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, result()
Application.EnableEvents = False
Application.ScreenUpdating = False
Set Change = Intersect(Range("B4:B600000"), Target)
If Not Change Is Nothing Then
If Dic Is Nothing Then Vlookup
result = Change.Resize(Change.Rows.Count + 1).Value
ReDim Preserve result(1 To UBound(result), 1 To 3)
For i = 1 To UBound(result) - 1
If Len(result(i, 1)) Then
tmp = result(i, 1)
If Dic.exists(tmp) Then
result(i, 1) = aResult(Dic.Item(tmp), 2) 'Loai hang
result(i, 2) = aResult(Dic.Item(tmp), 3) 'Cong ty cap
result(i, 3) = aResult(Dic.Item(tmp), 4) 'Hang cong ty
Else
result(i, 1) = "Ch" & ChrW(432) & "a có mã"
result(i, 2) = "Ch" & ChrW(432) & "a có mã"
result(i, 3) = "Ch" & ChrW(432) & "a có mã"
End If
End If
Next i
Change.Offset(0, 4).Resize(, 3).Value = result
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Anh ơi, Code chỉ chạy khi có biến động mã tại Cột B tai Sheet So giao dịch. Khi em xóa vùng kết quả đi và tạo một Nút bấm Button với Macro Vlookup thì nó không nhảy. Có cách gì tạo bao cáo bằng cách bấm nút thay vì chỉ khi có biến động mã mới chạy không ạ. E cảm ơn ạ.Bạn thử code này
Mã:Code trong Module Option Explicit Public Chk As Boolean, Dic As Object, aResult() Sub Vlookup() Dim wks As Worksheet, SrcRng As Range, sArray Dim LR As Long, i As Long, n As Long, tmp On Error Resume Next Set wks = Sheets("Ma") Set SrcRng = wks.Range("B2:E7") sArray = SrcRng.Value 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 aResult(LR, 1) = tmp aResult(LR, 2) = sArray(i, 2) 'Loai hang aResult(LR, 3) = sArray(i, 3) 'Cong ty cap aResult(LR, 4) = sArray(i, 4) 'Hang cong ty End If End If Next End Sub Code trong sheet So giao dich Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, result() Application.EnableEvents = False Application.ScreenUpdating = False Set Change = Intersect(Range("B4:B600000"), Target) If Not Change Is Nothing Then If Dic Is Nothing Then Vlookup result = Change.Resize(Change.Rows.Count + 1).Value ReDim Preserve result(1 To UBound(result), 1 To 3) For i = 1 To UBound(result) - 1 If Len(result(i, 1)) Then tmp = result(i, 1) If Dic.exists(tmp) Then result(i, 1) = aResult(Dic.Item(tmp), 2) 'Loai hang result(i, 2) = aResult(Dic.Item(tmp), 3) 'Cong ty cap result(i, 3) = aResult(Dic.Item(tmp), 4) 'Hang cong ty Else result(i, 1) = "Ch" & ChrW(432) & "a có mã" result(i, 2) = "Ch" & ChrW(432) & "a có mã" result(i, 3) = "Ch" & ChrW(432) & "a có mã" End If End If Next i Change.Offset(0, 4).Resize(, 3).Value = result End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub
Bạn thử sub nàyAnh ơi, Code chỉ chạy khi có biến động mã tại Cột B tai Sheet So giao dịch. Khi em xóa vùng kết quả đi và tạo một Nút bấm Button với Macro Vlookup thì nó không nhảy. Có cách gì tạo bao cáo bằng cách bấm nút thay vì chỉ khi có biến động mã mới chạy không ạ. E cảm ơn ạ.
Public Sub Test()
Dim sArr(), dArr(), tArr(), I As Long, J As Long, R As Long, Col As Long, Rws As Long
With Sheets("Ma")
sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 4).Value
End With
R = UBound(sArr)
With CreateObject("Scripting.Dictionary")
For I = 1 To R
.Add sArr(I, 1), I
Next I
With Sheets("So giao dich")
tArr = .Range("B4", .Range("B4").End(xlDown)).Value
R = UBound(tArr)
Col = 3
ReDim dArr(1 To R, 1 To Col)
End With
For I = 1 To R
If .Exists(tArr(I, 1)) Then
Rws = .Item(tArr(I, 1))
For J = 1 To Col
dArr(I, J) = sArr(Rws, J + 1)
Next J
End If
Next I
End With
Sheets("So giao dich").Range("F4").Resize(R, Col) = dArr
End Sub
Nó chạy được rồi anh ạ. A giỏi quá. Anh cho em hỏi thêm chút ạ, nếu nó tìm mà không có mã thì nó hiện ra "Cần nhập mã vào" mà không để trống ạ (Chú ý cột mã hàng cột B của Sheet So giao dich phải là khác rỗng, nếu trống thì không hiện ạ). Em cảm ơn Anh.Bạn thử sub này
Mã:Public Sub Test() Dim sArr(), dArr(), tArr(), I As Long, J As Long, R As Long, Col As Long, Rws As Long With Sheets("Ma") sArr = .Range("B2", .Range("B2").End(xlDown)).Resize(, 4).Value End With R = UBound(sArr) With CreateObject("Scripting.Dictionary") For I = 1 To R .Add sArr(I, 1), I Next I With Sheets("So giao dich") tArr = .Range("B4", .Range("B4").End(xlDown)).Value R = UBound(tArr) Col = 3 ReDim dArr(1 To R, 1 To Col) End With For I = 1 To R If .Exists(tArr(I, 1)) Then Rws = .Item(tArr(I, 1)) For J = 1 To Col dArr(I, J) = sArr(Rws, J + 1) Next J End If Next I End With Sheets("So giao dich").Range("F4").Resize(R, Col) = dArr End Sub
Bạn thử lạiNó chạy được rồi anh ạ. A giỏi quá. Anh cho em hỏi thêm chút ạ, nếu nó tìm mà không có mã thì nó hiện ra "Cần nhập mã vào" mà không để trống ạ (Chú ý cột mã hàng cột B của Sheet So giao dich phải là khác rỗng, nếu trống thì không hiện ạ). Em cảm ơn Anh.
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4)
End With
With Sheet1
SoGiaoDich = .Range(.[B4], .[B65000].End(3))
ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
Set Dic = CreateObject("Scripting.dictionary")
For i = 1 To UBound(Ma)
Item = CStr(Ma(i, 1))
If Not Dic.exists(Item) Then
Dic.Add CStr(Ma(i, 1)), i
End If
Next i
For i = 1 To UBound(SoGiaoDich)
Item = CStr(SoGiaoDich(i, 1))
If Dic.exists(Item) Then
KQ(i, 1) = Ma(Dic.Item(Item), 2)
KQ(i, 2) = Ma(Dic.Item(Item), 3)
KQ(i, 3) = Ma(Dic.Item(Item), 4)
Else
KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
End If
Next i
.[F4:H65000].ClearContents
.[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
Bạn thử lại
Mã:Option Explicit Sub Test2() Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object With Sheet2 Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) End With With Sheet1 SoGiaoDich = .Range(.[B4], .[B65000].End(3)) ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3) Set Dic = CreateObject("Scripting.dictionary") For i = 1 To UBound(Ma) Item = CStr(Ma(i, 1)) If Not Dic.exists(Item) Then Dic.Add CStr(Ma(i, 1)), i End If Next i For i = 1 To UBound(SoGiaoDich) Item = CStr(SoGiaoDich(i, 1)) If Dic.exists(Item) Then KQ(i, 1) = Ma(Dic.Item(Item), 2) KQ(i, 2) = Ma(Dic.Item(Item), 3) KQ(i, 3) = Ma(Dic.Item(Item), 4) Else KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" End If Next i .[F4:H65000].ClearContents .[F4].Resize(i - 1, 3) = KQ Set Dic = Nothing End With End Sub
Anh ơi, em hỏi anh chút ạ. Đoạn nào trong Code để nó hiểu rằng Việc Vlookup sẽ thực hiện từ Cột F mà không phải thực hiện từ Cột D, E ạ. Em cảm ơn ạBạn thử lại
Mã:Option Explicit Sub Test2() Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object With Sheet2 Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) End With With Sheet1 SoGiaoDich = .Range(.[B4], .[B65000].End(3)) ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3) Set Dic = CreateObject("Scripting.dictionary") For i = 1 To UBound(Ma) Item = CStr(Ma(i, 1)) If Not Dic.exists(Item) Then Dic.Add CStr(Ma(i, 1)), i End If Next i For i = 1 To UBound(SoGiaoDich) Item = CStr(SoGiaoDich(i, 1)) If Dic.exists(Item) Then KQ(i, 1) = Ma(Dic.Item(Item), 2) KQ(i, 2) = Ma(Dic.Item(Item), 3) KQ(i, 3) = Ma(Dic.Item(Item), 4) Else KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" End If Next i .[F4:H65000].ClearContents .[F4].Resize(i - 1, 3) = KQ Set Dic = Nothing End With End Sub
Bạn nên gửi file để biết chỉnh và hướng dẫn nhéAnh ơi, em hỏi anh chút ạ. Đoạn nào trong Code để nó hiểu rằng Việc Vlookup sẽ thực hiện từ Cột F mà không phải thực hiện từ Cột D, E ạ. Em cảm ơn ạ
Option Explicit
Sub Test2()
Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object
With Sheet2
Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) 'bat dau từ b2 Resize(, 4) => tới cột E'
End With
With Sheet1
SoGiaoDich = .Range(.[B4], .[B65000].End(3))
ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3)
Set Dic = CreateObject("Scripting.dictionary")
For i = 1 To UBound(Ma)
Item = CStr(Ma(i, 1))
If Not Dic.exists(Item) Then
Dic.Add CStr(Ma(i, 1)), i
End If
Next i
For i = 1 To UBound(SoGiaoDich)
Item = CStr(SoGiaoDich(i, 1))
If Dic.exists(Item) Then
KQ(i, 1) = Ma(Dic.Item(Item), 2) 'Từ mã hàng tới Loại hàng'
KQ(i, 2) = Ma(Dic.Item(Item), 3) ''Từ mã hàng tới cong ty cấp''
KQ(i, 3) = Ma(Dic.Item(Item), 4) 'Từ mã hàng tới Hạng công ty'
Else
KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã"
End If
Next i
.[F4:H65000].ClearContents
.[F4].Resize(i - 1, 3) = KQ
Set Dic = Nothing
End With
End Sub
Ý em hỏi là tại Sheet 1 ạ: Đoạn nào thể hiện nó sẽ thực hiện VLookup trả kết quả từ F4 đến H mà không phải từ C, D, hoặc E ạ.B
Bạn nên gửi file để biết chỉnh và hướng dẫn nhé
Mã:Option Explicit Sub Test2() Dim i As Long, KQ(), Ma(), SoGiaoDich(), Item, Dic As Object With Sheet2 Ma = Range(.[B2], .[B65000].End(3)).Resize(, 4) 'bat dau từ b2 Resize(, 4) => tới cột E' End With With Sheet1 SoGiaoDich = .Range(.[B4], .[B65000].End(3)) ReDim KQ(1 To UBound(SoGiaoDich), 1 To 3) Set Dic = CreateObject("Scripting.dictionary") For i = 1 To UBound(Ma) Item = CStr(Ma(i, 1)) If Not Dic.exists(Item) Then Dic.Add CStr(Ma(i, 1)), i End If Next i For i = 1 To UBound(SoGiaoDich) Item = CStr(SoGiaoDich(i, 1)) If Dic.exists(Item) Then KQ(i, 1) = Ma(Dic.Item(Item), 2) 'Từ mã hàng tới Loại hàng' KQ(i, 2) = Ma(Dic.Item(Item), 3) ''Từ mã hàng tới cong ty cấp'' KQ(i, 3) = Ma(Dic.Item(Item), 4) 'Từ mã hàng tới Hạng công ty' Else KQ(i, 1) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 2) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" KQ(i, 3) = "C" & ChrW(7847) & "n nh" & ChrW(7853) & "p mã" End If Next i .[F4:H65000].ClearContents .[F4].Resize(i - 1, 3) = KQ Set Dic = Nothing End With End Sub
Là muốn trả kết quả về C,D,E thay vì kết quả code đang trả về F,G,H hay sao? nếu đúng thì chỉ chỉnh dòng nàyÝ em hỏi là tại Sheet 1 ạ: Đoạn nào thể hiện nó sẽ thực hiện VLookup trả kết quả từ F4 đến H mà không phải từ C, D, hoặc E ạ.
Sửa dòng này
.[F4:H65000].ClearContents
.[F4].Resize(i - 1, 3) = KQ
Thành
.[C4:E65000].ClearContents
.[C4].Resize(i - 1, 3) = KQ
1 cách:Em nhờ Anh chị chút ạ.
Code cho các hàm tại vùng F : H tại Sheet So Giao dich là thế nào ạ. Em có tìm hiểu một số bài nhưng thấy khó quá. Em cảm ơn ạ.
Sub hoahuongduong1986()
Dim i As Long
For i = Range("B" & Rows.Count).End(3).Row To 4 Step -1
Range(Cells(i, "F"), Cells(i, "H")).FormulaArray = "=VLOOKUP(B" & i & ",Ma!$B:$E,{2,3,4},0)"
With Range("F4:H" & Range("B" & Rows.Count).End(3).Row)
.Value = .Value
.Replace "#N/A", "Không có "
End With
Next
End Sub
Cảm ơn nhiều ạ !1 cách:
PHP:Sub hoahuongduong1986() Dim i As Long For i = Range("B" & Rows.Count).End(3).Row To 4 Step -1 Range(Cells(i, "F"), Cells(i, "H")).FormulaArray = "=VLOOKUP(B" & i & ",Ma!$B:$E,{2,3,4},0)" With Range("F4:H" & Range("B" & Rows.Count).End(3).Row) .Value = .Value .Replace "#N/A", "Không có " End With Next End Sub