Mảng trong vba để gán giá trị tương ứng

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

vippera2

Thành viên mới
Tham gia
27/8/11
Bài viết
21
Được thích
0
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.
 

File đính kèm

  • dien du lieu.xlsx
    9.6 KB · Đọc: 18
Cột A và B lẽ ra nó phải là giá trị duy nhất chứ nhỉ
 
Upvote 0
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.
 
Upvote 0
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.
thử xem bạn :

Mã:
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
 
Upvote 0
thử xem bạn :

Mã:
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
quá xịn, cảm ơn bác rất nhiều
em sẽ còn học hỏi thêm
ah mà bác ko dùng mảng ạ?
tình huống của em dùng mảng đc ko bác nhỉ
 
Upvote 0
Dùng mảng thì thế này:
Kết hợp với dictionary:

PHP:
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
 
Upvote 0
Dùng mảng thì thế này:
Kết hợp với dictionary:

PHP:
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
Cảm ơn bạn nhiều,
làm sao để luyện được những logic như thế này nhỉ
mình suy nghĩ 1 lúc là loạn hết cả lên, hix
rắc rối ở chỗ chạy các vòng lặp duyệt qua các mảng các kiểu
 
Upvote 0
Chỉ có một con đường: Học, học nữa, và học nữa ...
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.
 
Upvote 0
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.
Chưa chắc à bác VetMini
Phản xạ của em là, dù chưa có giải thuật nào trong đầu, mà nhìn thấy trong code của ai đó dùng
PHP:
Cells(i, ...)
hoặc
PHP:
For each cell ...
cell.value =
là tự nhiên toàn thân ngứa ngáy...
Chắc bạn chủ thớt cũng thế.
Hic hic hic
 
Upvote 0
Chưa chắc à bác VetMini
Tôi chịu thua không hiểu bạn "chưa chắc" chỗ nào.

Phản xạ của em là, dù chưa có giải thuật nào trong đầu, mà nhìn thấy trong code của ai đó dùng
PHP:
Cells(i, ...)
hoặc
PHP:
For each cell ...
cell.value =
là tự nhiên toàn thân ngứa ngáy...
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 bạn chủ thớt cũng thế.
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.
 
Upvote 0
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.
Cảm ơn góp ý của bác
để giỏi giải thuật có cần phải giỏi các môn Khoa học tự nhiên không bác nhỉ
mình thiên về khoa học xã hội thì chắc phải đi đường dài..
 
Upvote 0
Cảm ơn góp ý của bác
để giỏi giải thuật có cần phải giỏi các môn Khoa học tự nhiên không bác nhỉ
mình thiên về khoa học xã hội thì chắc phải đi đường dài..
Ý 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.
 
Upvote 0
Các môn ngoại lai có thể hỗ trợ cho thành viên GPE:

1) Tiếng Việt
2) Luật (ra nghề là luật sư, còn gọi là "thầy cãi")
 
Upvote 0
Web KT

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

Back
Top Bottom