[Cần giúp đỡ] Code VBA trả về giá trị tương ứng (6 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Bạn không thêm chỉ số cho mảng thì làm sao mà nó chẳng báo lỗi.
Chỉ sô cho mảng tham chiếu (vùng dữ liệu) được đặt trong 2 ô A2 và A3 bạn nhìn trong code có dòng này không?
Set goctren = .Range("A2")
Set gocduoi = .Range("A3")
Arr = .Range(goctren & ":" & gocduoi).Value

bạn xem hình tôi thêm A2=D3; A3=G16 và chạy code. Bạn cũng thêm vào A2,A3 như trong hình và chạy code thử xem.
Mình thử code ok rồi bạn, cho mình hỏi cái vùng: Arr = .Range("C3:F" & Lr).Value ví dụ mình muốn chọn nhiều vùng chi tiết trong vùng C3:F ví dụ là vùng C3, Vùng E3:F ( bỏ qua vùng D3) thì cần chỉnh code như thế nào bạn ?
 
Lần chỉnh sửa cuối:
Mình thử code ok rồi bạn, cho mình hỏi cái vùng: Arr = .Range("C3:F" & Lr).Value ví dụ mình muốn chọn nhiều vùng chi tiết trong vùng C3:F ví dụ là vùng C3, Vùng E3:F ( bỏ qua vùng D3) thì cần chỉnh code như thế nào bạn ?
tạm hiểu là vùng (mảng) là một hình chữ nhật (hoặc hình vuông) có góc trên và góc dưới. bạn cứ thay vị trí 2 góc đó vào 2 ô A2,A3 và chạy thử code thì sẽ thấy.
 
tạm hiểu là vùng (mảng) là một hình chữ nhật (hoặc hình vuông) có góc trên và góc dưới. bạn cứ thay vị trí 2 góc đó vào 2 ô A2,A3 và chạy thử code thì sẽ thấy.
2 ô A2,A3 thì chỉ chọn được 1 vùng, mình muốn chọn đồng thời các vùng C3 và E3:F thì code chỉnh thế nào bạn
 
2 ô A2,A3 thì chỉ chọn được 1 vùng, mình muốn chọn đồng thời các vùng C3 và E3:F thì code chỉnh thế nào bạn
Thì bạn ngâm cứu phương thức UNION()
Ví dụ:
PHP:
Sub ChonNhieuVung()
 Dim Rng As Range

 Set Rng = Union([C3].CurrentRegion, [E3].CurrentRegion)
 MsgBox Rng.Address
End Sub
 
2 ô A2,A3 thì chỉ chọn được 1 vùng, mình muốn chọn đồng thời các vùng C3 và E3:F thì code chỉnh thế nào bạn
Có phải ý của bạn là có 2 hoặc nhiều hơn vùng tham chiếu nằm cách quãng nhau phải không? Nhưng là 1 Mảng kết quả , hay là nhiều mảng kết quả tương ứng?
 
Có phải ý của bạn là có 2 hoặc nhiều hơn vùng tham chiếu nằm cách quãng nhau phải không? Nhưng là 1 Mảng kết quả , hay là nhiều mảng kết quả tương ứng?
Ừ ý của mình là có 2 hoặc nhiều hơn 2 vùng tham chiều nằm cách quãng nhau, trả về 1 mảng kết quả như ban đầu trong cột A2 ,tùy vào mình sử dụng mà sẽ chọn những vùng nào, như trong bài khi code tìm được trong bảng Btra có các kí tự đó sẽ ghi kết quả tương ứng trong cột A2, nếu để vùng tham chiếu rộng từ C3:F có những cột vẫn chứa kí tự như trong cột Btra nhưng mình không muốn code dò tìm trong cột đó
 
Ừ ý của mình là có 2 hoặc nhiều hơn 2 vùng tham chiều nằm cách quãng nhau, trả về 1 mảng kết quả như ban đầu trong cột A2 ,tùy vào mình sử dụng mà sẽ chọn những vùng nào, như trong bài khi code tìm được trong bảng Btra có các kí tự đó sẽ ghi kết quả tương ứng trong cột A2, nếu để vùng tham chiếu rộng từ C3:F có những cột vẫn chứa kí tự như trong cột Btra nhưng mình không muốn code dò tìm trong cột đó
Nếu vậy Thì bạn cứ lấy Mảng tham chiếu theo chỉ số trong ô A2,A3 (mảng này sẽ chứa cả những cột không muốn tham chiếu (ví dụ cột không muốn thamn chiếu là cột F tức là cột số 4 trong mảng Arr(C3:G16) có 5 cột . Sau đó trong vòng lặp chạy và bỏ qua cột không muốn ấy bằng cách
For i = 1 to R
For j = 1 To C
If j=4 then goto tiep
.......
......
tiep:
next j
next i
Bạn xem code
Mã:
Sub THU()
Dim i&, j&, Lr&, R&, C&
Dim Arr(), ArrBtra(), KQ()
Dim RngB As Range, goctren As Range, gocduoi As Range
Set RngB = Sheets("Btra").Range("A1").CurrentRegion
ArrBtra = Sheets("Btra").Range("A1:B" & RngB.Rows.Count).Value
With Sheets("DL")
'Set Rng = .Range("H2").CurrentRegion
'Lr = Rng.Rows.Count
Set goctren = .Range("A2")
Set gocduoi = .Range("A3")
Arr = .Range(goctren & ":" & gocduoi).Value

R = UBound(Arr): C = UBound(Arr, 2)
ReDim KQ(1 To R, 1 To 1)
For i = 1 To R
    For j = 1 To C
    If j = 4 Then GoTo tiêp
        If Arr(i, j) <> Empty Then
            For k = 1 To UBound(ArrBtra)
               If UCase(Trim(Arr(i, j))) Like ArrBtra(k, 1) & "*" Then
                    KQ(i, 1) = ArrBtra(k, 2)
               End If
            Next k
        End If
tiêp:
    Next j
Next i
.Range("E3").Resize(i, 1).ClearContents
.Range("E3").Resize(i - 1, 1) = KQ
End With
MsgBox "Xong", vbInformation, "THÔNG BÁO"
End Sub
Hãy thử copy code trên và chạy thử.
 
Nếu vậy Thì bạn cứ lấy Mảng tham chiếu theo chỉ số trong ô A2,A3 (mảng này sẽ chứa cả những cột không muốn tham chiếu (ví dụ cột không muốn thamn chiếu là cột F tức là cột số 4 trong mảng Arr(C3:G16) có 5 cột . Sau đó trong vòng lặp chạy và bỏ qua cột không muốn ấy bằng cách
For i = 1 to R
For j = 1 To C
If j=4 then goto tiep
.......
......
tiep:
next j
next i
Bạn xem code
Mã:
Sub THU()
Dim i&, j&, Lr&, R&, C&
Dim Arr(), ArrBtra(), KQ()
Dim RngB As Range, goctren As Range, gocduoi As Range
Set RngB = Sheets("Btra").Range("A1").CurrentRegion
ArrBtra = Sheets("Btra").Range("A1:B" & RngB.Rows.Count).Value
With Sheets("DL")
'Set Rng = .Range("H2").CurrentRegion
'Lr = Rng.Rows.Count
Set goctren = .Range("A2")
Set gocduoi = .Range("A3")
Arr = .Range(goctren & ":" & gocduoi).Value

R = UBound(Arr): C = UBound(Arr, 2)
ReDim KQ(1 To R, 1 To 1)
For i = 1 To R
    For j = 1 To C
    If j = 4 Then GoTo tiêp
        If Arr(i, j) <> Empty Then
            For k = 1 To UBound(ArrBtra)
               If UCase(Trim(Arr(i, j))) Like ArrBtra(k, 1) & "*" Then
                    KQ(i, 1) = ArrBtra(k, 2)
               End If
            Next k
        End If
tiêp:
    Next j
Next i
.Range("E3").Resize(i, 1).ClearContents
.Range("E3").Resize(i - 1, 1) = KQ
End With
MsgBox "Xong", vbInformation, "THÔNG BÁO"
End Sub
Hãy thử copy code trên và chạy thử.
Mình tạo lại bảng và chỉnh code theo bảng dưới nhưng bạn chỉnh giúp mình sao cho khi chạy code vẫn đổi như trong bảng tra nhưng những kí tự không thuộc bảng tra trong cột (Package, Short) không bị xóa đi, các kí tự có trong bảng tra vẫn xuất ra bình thường.

1635172622165.png
 

File đính kèm

Lần chỉnh sửa cuối:
Mình tạo lại bảng và chỉnh code theo bảng dưới nhưng bạn chỉnh giúp mình sao cho khi chạy code vẫn đổi như trong bảng tra nhưng những kí tự không thuộc bảng tra trong cột (Package, Short) không bị xóa đi, các kí tự có trong bảng tra vẫn xuất ra bình thường.

View attachment 268292
Khi code chạy nó sẽ lấy từng phần tử (arr(i,j)) trong mảng Tham chiếu Arr (vùng A5:AG300) nếu phần tử đó không rỗng Arr(i,j)<> empty thì tiếp tục lấy từng phần tử trong mảng ArrBtra(i,j) (các ký tự đầu) để so sánh với Arr(i,j), nếu trùng thì lấy phần tử cột 2 trong mảng ArrBtra(k,2) để ghi vào mảng kết quả KQ(i,1), sau khi duyệt xong hết các phần tử của mảng tham chiếu Arr ta được một mảng kết quả và đem gán mảng kết quả này xuống Sheet.
Nếu bạn muốn giữ nguyên các giá trị thì chỉ còn cách không dùng mảng kết quả mà cứ duyệt xong Cells(i,j) trong vùng tham chiếu là gán luôn kết quả tìm được trong ArrBtra vào Sheet .cells(i,4)=ArrBtra(k,2)
Bạn nên tìm hiểu thêm về Array .
 

File đính kèm

Khi code chạy nó sẽ lấy từng phần tử (arr(i,j)) trong mảng Tham chiếu Arr (vùng A5:AG300) nếu phần tử đó không rỗng Arr(i,j)<> empty thì tiếp tục lấy từng phần tử trong mảng ArrBtra(i,j) (các ký tự đầu) để so sánh với Arr(i,j), nếu trùng thì lấy phần tử cột 2 trong mảng ArrBtra(k,2) để ghi vào mảng kết quả KQ(i,1), sau khi duyệt xong hết các phần tử của mảng tham chiếu Arr ta được một mảng kết quả và đem gán mảng kết quả này xuống Sheet.
Nếu bạn muốn giữ nguyên các giá trị thì chỉ còn cách không dùng mảng kết quả mà cứ duyệt xong Cells(i,j) trong vùng tham chiếu là gán luôn kết quả tìm được trong ArrBtra vào Sheet .cells(i,4)=ArrBtra(k,2)
Bạn nên tìm hiểu thêm về Array .
Cảm ơn bạn, Khi mình chỉ cho code chạy trong các cột bôi vàng, cột bôi xanh là các cột mà mình không muốn code chạy vào đó vì có thể có các kí tự giống trong Btra nên kết quả nếu code chạy trong các cột xanh đó thì kết quả sẽ không còn đúng mà nếu như nhập các cột không muốn code chạy vào: If j = 4 Or j = 34 Then GoTo tiêp như trong bài thì trong trường hợp của mình sẽ từ cột 6 tới cột 33 sẽ Or rất dài.

1635256583589.png
 

File đính kèm

Cảm ơn bạn, Khi mình chỉ cho code chạy trong các cột bôi vàng, cột bôi xanh là các cột mà mình không muốn code chạy vào đó vì có thể có các kí tự giống trong Btra nên kết quả nếu code chạy trong các cột xanh đó thì kết quả sẽ không còn đúng mà nếu như nhập các cột không muốn code chạy vào: If j = 4 Or j = 34 Then GoTo tiêp như trong bài thì trong trường hợp của mình sẽ từ cột 6 tới cột 33 sẽ Or rất dài.

View attachment 268364
Nếu các cột liền nhau không cách quãng (ví dụ: 6 34 chứ không là 6,7,10,11,13
thì bạn dùng If J>= 6 and I<= 34 then goto tiep,
Nếu các cột cách quãng thì bạn có thể dùng mảng 1 chiều ( ví dụ: cot=Arrray(6,7,10,11,13...)để ghi lại các côt mà code sẽ bỏ qua, khi ấy code sẽ phải thêm một vòng lặp để duyệt các phần tử của mảng cot, khi j = phân tử của mảng cot ấy sẽ bỏ qua.
......
For j=1 to C
For k= 0 to Ubound(cot)
If j=cot(k) then goto tiep
........
end if
next k
next j
......

nếu bạn không muốn mở Code để sửa thì có thể ghi lại các cột bị bỏ qua ây vào trên sh và dùng hàm split để ghi vào mảng cot ( ví dụ cot = Split(Sheet1.range("A4"), ", ") )
Chúc bạn thành công.
 
Web KT

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

Back
Top Bottom