Mảng trong vba để gán giá trị tương ứng
Chào diễn đàn
mình đang học về mảng vba nhưng chưa rành lắm
mình có tình huống như sheet đính kèm
ở Sheet "nguon" có 2 dữ liệu ở 2 cột A và H, 2 cột này chứa giá trị giống nhau nhưng khác nhau ở số lượng
mình muốn đưa dữ liệu ở cột A và B tương ứng qua cột F và G như Sheet "ket qua" bằng vba
mình nghĩ tình huống này dùng mảng trong vba là tối ưu nhất nhưng vẫn chưa nghĩ ra dòng code nào
nhờ các bác giúp em vài dòng code cơ bản ạ.Em cảm ơn.
Cột A và B lẽ ra nó phải là giá trị duy nhất chứ nhỉ
không bạn ơi, nó không duy nhất nhưng số lượng các giá trị duy nhất ở cột A luôn nhỏ hơn cột H, còn giá trị cột B là đi kèm với cột A
ở đây mình muốn nó gán giá trị qua cột F và G tương ứng và tự ngắt ra khi hết giá trị ở cột A và B.
thử xem bạn :
Sub CopyMatchingData()
Dim lastRowA As Long, lastRowH As Long, i As Long, j As Long, lastCopiedRow As Long
' Khoi tao lastCopiedRow bang 0
lastCopiedRow = 0
' Xac dinh dong cuoi cung co du lieu trong cot A va H
lastRowA = Cells(Rows.Count, "A").End(xlUp).Row
lastRowH = Cells(Rows.Count, "H").End(xlUp).Row
' Lap qua tat ca cac dong du lieu trong cot A
For i = 1 To lastRowA
' Lap qua cac dong con lai co du lieu trong cot H, bat dau tu dong cuoi cung ma du lieu da duoc sao chep
For j = lastCopiedRow + 1 To lastRowH
' Kiem tra xem gia tri trong cot A co trung voi gia tri trong cot H khong
If Cells(i, "A").Value = Cells(j, "H").Value Then
' Neu co trung, sao chep du lieu tu cot A va B sang cot F va G
Cells(j, "F").Value = Cells(i, "A").Value
Cells(j, "G").Value = Cells(i, "B").Value
' Cap nhat lastCopiedRow voi dong hien tai cua vong lap trong
lastCopiedRow = j
' Thoat khoi vong lap trong
Exit For
End If
Next j
Next i
End Sub
www.giaiphapexcel.com/diendan/threads/m%E1%BA%A3ng-trong-vba-%C4%91%E1%BB%83-g%C3%A1n-gi%C3%A1-tr%E1%BB%8B-t%C6%B0%C6%A1ng-%E1%BB%A9ng.163653/post-1091626
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Dùng mảng thì thế này:
Kết hợp với dictionary:
Option Explicit
Sub ChuyenGiatri()
Dim i&, rng
Dim dic As Object, key
Set dic = CreateObject("Scripting.dictionary")
Sheets("nguon").Activate
rng = Range("A1:B" & Cells(Rows.Count, "A").End(xlUp).Row).Value ' luu vung A:B vào mang rng
'nap A1&B1, A2&B2 vào dictionary
For i = 1 To UBound(rng)
If Not dic.exists(rng(i, 1) & "|" & rng(i, 2)) Then dic.Add rng(i, 1) & "|" & rng(i, 2), rng(i, 1)
Next
rng = Range("F1:H" & Cells(Rows.Count, "H").End(xlUp).Row).Value ' luu vung F:H vào mang rng
For i = 1 To UBound(rng) ' duyet qua tung o trong cot H
For Each key In dic.keys ' duyet qua tung key trong dictionary (cot A)
If dic(key) = rng(i, 3) Then ' neu o trong cot A = o trong cot H thi luu A va B vao mang rng
rng(i, 1) = rng(i, 3)
rng(i, 2) = Split(key, "|")(1)
dic.Remove key ' xoa key trong dic va thoat vong lap key, chuyen qua vong lap i
Exit For
End If
Next
Next
'dan rng tro lai vao vung F:H
Range("F1").Resize(UBound(rng), 3).Value = rng
Set dic = Nothing
End Sub
Không hẳn chỉ có một đường. Có đường tắt và đường dài.
Đường tắt học rất nhanh. Nhưng… chỉ thích hợp với thiên tài.
Đường dài học chậm hơn nhiều. Và thích hợp cho mọi người siêng năng, chịu khó.
Theo kiến thức của tôi thì không có con đường nào cho người không phải thiên tài mà lại muốn học tắt cho nhanh. Chưa vững giải thuật lẫn ngữ pháp đã đòi viết code "tối ưu".
Chưa tính xong giải thuật đã nảy ý kiến "dùng mảng cho nhanh" là tự giới hạn vòng tư duy giải thuật và áp dụng của mình. Nói cách khác là bắt đầu bằng thành kiến và chủ quan.
Lúc tôi lập trình, tôi luôn luôn tìm giải thuật, có giải thuật rồi mới bắt đầu dàn dựng và viết code chi tiết. Giải pháp thì dễ hiểu, dễ sửa, dễ test là điều chính yếu. Tốc độ chỉ là điều thứ yếu.
Dữ liệu, thông tin là mục đích. Thời gian nếu tiết kiệm được thì tốt, nhưng rất hiếm khi là mục đích.
Tôi chịu thua không hiểu bạn "chưa chắc" chỗ nào.
Troing code trên đâu có chỗ nào động đến mảng?
Cells là một thuộc tính của range, nó trả về một range gòm mọt cell duy nhất. Cách nó dùng chỉ số để lấy cell gần giống như mảng nhưng range không có cấu trúc giống mảng.
Chắc chắn là không. Thớt không hề "ngứa" như bạn.
Ở bài #1, tuy câu đầu nói là học VBA nhưng cuối bài rõ ràng là nhờ viết code giùm. Người "ngứa" code thì đã tự viết và chỉ hỏi chỗ bí.
Bài #8 ai cũng thấy là mục đích thổi phồng lỗ mũi người code giùm.
Ý của bạn là thế nào?
Bạn muốn phần trần rằng mình đang làm một công việc ngoài khả năng và kiến thức chuyên môn của mình?
Chuyên Khoa Học Nhân Văn khong phải là cái cớ.
Mà chính thức thì bạn chuyên về cái gì vậy? Hình như ngành Khoa Học Nhân Văn của bạn học thiếu mất Văn Phạm tiếng Việt. Theo đúng văn phạm thì đầu câu phải viết hoa.