Tìm hàm: tìm kiếm ra vị trí của giá trị cần tìm trong mãng

Liên hệ QC

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Trong VBA mình cần tím 1 hàm có tác dụng như thế này:
vitri = hamcantim(giatri, mãng)
Có nghĩa là số liệu đầu vào là giá trị và mãng, ta tìm ra vị trí (hay khóa) của giá trị đó trong mãng.
VD mang = (0=>xanh, 1=>do, 2=>vang, 3=>tim)
vitri = hamcantim(vang, mang)
KQ vitri = 2

Cho mình hỏi trong VBA có hàm như vậy không?
--------------
Trong ngôn ngữ làm web PHP thì có hàm này tên là array_search(value, array)
và đây là hình ảnh và vd của ngôn ngữ PHP
 

File đính kèm

  • hoi gpe.jpg
    hoi gpe.jpg
    76.7 KB · Đọc: 162
Trong VBA mình cần tím 1 hàm có tác dụng như thế này:
vitri = hamcantim(giatri, mãng)
Có nghĩa là số liệu đầu vào là giá trị và mãng, ta tìm ra vị trí (hay khóa) của giá trị đó trong mãng.
VD mang = (0=>xanh, 1=>do, 2=>vang, 3=>tim)
vitri = hamcantim(vang, mang)
KQ vitri = 2

Cho mình hỏi trong VBA có hàm như vậy không?
--------------
Trong ngôn ngữ làm web PHP thì có hàm này tên là array_search(value, array)
và đây là hình ảnh và vd của ngôn ngữ PHP

Tôi nghĩ chắc phải dùng vòng lặp thôi, nếu là range trên excel thì có thể dùng hàm match
 
hàm Match của VBA có xài được trên mảng 1 chiều
 
Tôi nghĩ chắc phải dùng vòng lặp thôi, nếu là range trên excel thì có thể dùng hàm match
Mình đưa file cụ thể lên, bạn áp dụng hàm match vào giúp mình với nha. Cảm ơn bạn nhiều.

Mà hình như match chỉ dùng cho mãng 1 chiều (theo bạn doveandrose ) vậy là xem như bài toán không giải quyết được bằng hàm rồi.
Dùng for each thì nó tìm được range là cells, thì vị trí của nó là cells.column va cell.row , nhưng mình muốn có 1 hàm hay là cách khác?

VD, tìm vị trí của số max nhất trong range, cho ra vị trí là hàng và cột
 

File đính kèm

  • Tim vi tri cua value trong range.xls
    36 KB · Đọc: 119
Lần chỉnh sửa cuối:
Mình đưa file cụ thể lên, bạn áp dụng hàm match vào giúp mình với nha. Cảm ơn bạn nhiều.

Bạn phải cho biết kết quả mẫu bạn muốn có mặt mũi nó ra sao chứ.
Tìm con số nào? Tìm thấy nhiều vị trí thì sao? v.v...
Nhờ kiểu này hỏi 10 bài chưa xong.
 
Bạn phải cho biết kết quả mẫu bạn muốn có mặt mũi nó ra sao chứ.
Tìm con số nào? Tìm thấy nhiều vị trí thì sao? v.v...
Nhờ kiểu này hỏi 10 bài chưa xong.

Anh chỉ cần tìm ra vị trí thôi, là anh chỉ tìm cho em ra 1 value tương ứng với 1 vitri là xong bài toán
VD, tìm vị trí của số max nhất trong range, ket qua => vị trí là hàng và cột trong range, hay hàng và cột của excel
 

File đính kèm

  • tim max.jpg
    tim max.jpg
    66.4 KB · Đọc: 149
Lần chỉnh sửa cuối:
Dạ thưa anh, những điều anh nói em đã thể hiện ra hết trong file đó anh à. trong code file đó anh. chắc là anh chưa download về. hihi (ở đây em hỏi là trong vba, nên hỏi ở trong code, mong các bạn thứ lỗi)
Mà ở đây chỉ cần tìm ra vị trí thôi, là anh chỉ tìm cho em ra 1 value tương ứng với 1 vitri là xong bài toán, anh có thể lấy bất cứ value nào đề tìm cũng được, ở đây cần thuật toán làm thôi.
Hàm trên Array trong VBA thì tôi chưa có thấy, nhưng nếu bạn muốn viết 1 function cho riêng mình thì ok tôi sẽ hướng dẫn
Mã:
[B]function TimKiem(giatri, Mang)
    Cờ =false
    for i =vi trí đầu to vitri cuoi
          if giatri= Mang(i) then
             co=true
             exit for
        end if
   Next
      TimKiem=co
end function[/B]
kết quả của hàm này trả về true thì tìm thấy, còn false thì sẽ không tìm thấy(vì yêu cầu của bạn là thuật toán nên tôi đưa ra gợi ý như vậy, code như thế nào bạn từ viết nha
 
Lần chỉnh sửa cuối:
Mình đưa file cụ thể lên, bạn áp dụng hàm match vào giúp mình với nha. Cảm ơn bạn nhiều.

Mà hình như match chỉ dùng cho mãng 1 chiều (theo bạn doveandrose ) vậy là xem như bài toán không giải quyết được bằng hàm rồi.
Dùng for each thì nó tìm được range là cells, thì vị trí của nó là cells.column va cell.row , nhưng mình muốn có 1 hàm hay là cách khác?

VD, tìm vị trí của số max nhất trong range, cho ra vị trí là hàng và cột

tôi chưa bao giờ xài class module nên không biết có đúng ko
Mã:
Option Explicit

Private Sub tim_vitri_value_range()
  Dim Ran_Vung As Range, jmax, i, col As Long, r
  
  
  Debug.Print "------Range-------" '-hien ra trong Immediate (Ctrl + G)
  Set Ran_Vung = Range("B3:D8") '-day la range
  
  jmax = Application.Max(Ran_Vung)
  Debug.Print "Gia tri lon nhat : " & jmax
  For i = 1 To Ran_Vung.Columns.Count
    r = Application.Match(jmax, Ran_Vung.Columns(i), 0)
    If TypeName(r) <> "Error" Then Exit For
  Next
  Debug.Print "Vi tri cua no la : " & "hang " & r & " cot " & i
  
End Sub
 
Anh chỉ cần tìm ra vị trí thôi, là anh chỉ tìm cho em ra 1 value tương ứng với 1 vitri là xong bài toán
VD, tìm vị trí của số max nhất trong range, ket qua => vị trí là hàng và cột trong range, hay hàng và cột của excel

Viết 1 Hàm cho bạn đây, tuỳ nghi sử dụng.
PHP:
Public Function GPE(Tim, Rng As Range, Optional DK1 As Long = 0, Optional DK2 As String = Empty) As Long
Dim I As Long, J As Long
For I = 1 To Rng.Rows.Count
    For J = 1 To Rng.Columns.Count
        If Rng(I, J) = Tim Then
            If DK1 = 1 Then
                If DK2 = "Sh" Then
                    GPE = Rng(I, J).Column
                Else
                    GPE = J
                End If
            Else
                If DK2 = "Sh" Then
                    GPE = Rng(I, J).Row
                Else
                    GPE = I
                End If
            End If
            Exit Function
        End If
    Next J
Next I
End Function
 

File đính kèm

  • Tim vi tri cua value trong range.rar
    9.9 KB · Đọc: 189
tôi chưa bao giờ xài class module nên không biết có đúng ko

[GPECODE=vb]Option Explicit
Private Sub tim_vitri_value_range()
Dim Ran_Vung As Range, jmax, i, col As Long, r
Debug.Print "------Range-------" '-hien ra trong Immediate (Ctrl + G)
Set Ran_Vung = Range("B3:D8") '-day la range
jmax = Application.Max(Ran_Vung)
Debug.Print "Gia tri lon nhat : " & jmax
For i = 1 To Ran_Vung.Columns.Count
r = Application.Match(jmax, Ran_Vung.Columns(i), 0)
If TypeName(r) <> "Error" Then Exit For
Next
Debug.Print "Vi tri cua no la : " & "hang " & r & " cot " & i
End Sub[/GPECODE]
Code chạy đúng ý mình đó, cảm ơn bạn rất nhiều. Dù VB chưa có sẵn hàm tìm vị trí value trong array, nhưng với cái này sài là tốt rồi.

BaTê đã viết:
[GPECODE=vb]Public Function GPE(Tim, Rng As Range, Optional DK1 As Long = 0, Optional DK2 As String = Empty) As Long
Dim I As Long, J As Long
For I = 1 To Rng.Rows.Count
For J = 1 To Rng.Columns.Count
If Rng(I, J) = Tim Then
If DK1 = 1 Then
If DK2 = "Sh" Then
GPE = Rng(I, J).Column
Else
GPE = J
End If
Else
If DK2 = "Sh" Then
GPE = Rng(I, J).Row
Else
GPE = I
End If
End If
Exit Function
End If
Next J
Next I
End Function[/GPECODE]
Tuy hoi dài và khó hiểu nhưng vẫn làm việc được, cảm ơn tất cả các bạn GPE, chúc các bạn luôn vui vẻ.
 
Lần chỉnh sửa cuối:
Tiện thể đây cho mình hỏi thêm về của sổ Immediate (Ctrl + G)
Mình chỉ biết câu lệnh hiện thông báo ra của sổ Immediate la
Debug.Print "hien thong bao " & gia tri

Mình chưa biết 2 cách làm sau:
1. Câu lệnh để clear số liệu hiện ra trong của sổ Immediate
2. Câu lệnh để hiện các phần từ của array hay range ra của sổ Immediate

Mong các bạn chỉ giúp?
 
Lần chỉnh sửa cuối:
Mình đưa file cụ thể lên, bạn áp dụng hàm match vào giúp mình với nha. Cảm ơn bạn nhiều.

Mà hình như match chỉ dùng cho mãng 1 chiều (theo bạn doveandrose ) vậy là xem như bài toán không giải quyết được bằng hàm rồi.
Dùng for each thì nó tìm được range là cells, thì vị trí của nó là cells.column va cell.row , nhưng mình muốn có 1 hàm hay là cách khác?

VD, tìm vị trí của số max nhất trong range, cho ra vị trí là hàng và cột

dùng công thức cũng tìm được mà !!!
giết gà đâu cần đến dao mổ trâu
 

File đính kèm

  • Tim vi tri cua value trong range.xls
    43.5 KB · Đọc: 75
dùng công thức cũng tìm được mà !!!
giết gà đâu cần đến dao mổ trâu

Công thức có đúng đâu!
Theo dữ liệu trong file, nếu cell D8 cũng =25.6 thì cell N2 cho kết quả $C$8 (mà lý ra phải là $C$7 hoặc $D$8) ---> Từ đó dẫn đến các công thức bên dưới cũng sai luôn
 
Công thức có đúng đâu!
Theo dữ liệu trong file, nếu cell D8 cũng =25.6 thì cell N2 cho kết quả $C$8 (mà lý ra phải là $C$7 hoặc $D$8) ---> Từ đó dẫn đến các công thức bên dưới cũng sai luôn
thế thì đổi lại thế này anh ndu nhỉ? (max cột với 3 con số)
=ADDRESS(INT(MAX(IF(B3:D8=J3,(ROW(B3:D8)+COLUMN(B3:D8)*10^-3),""))),MOD(MAX(IF(B3:D8=J3,(ROW(B3:D8)+COLUMN(B3:D8)*10^-3),"")),1)*1000)
 
Nếu chỉ tìm trong bảng tính thì nó là hàm Find.
Nếu là mảng trong bộ nhớ thì bắt buộc phải viết hàm duyệt mảng
 
Nếu chỉ tìm trong bảng tính thì nó là hàm Find.
Nếu là mảng trong bộ nhớ thì bắt buộc phải viết hàm duyệt mảng
Ô C1 viết công thức = 1 ô bất kỳ trong vùng
Tìm với giá trị ô C1, có trong range B2:B12, xuất ra nó thuộc hàng cột nào? Find không có tìm thấy, đó là nhược điểm của find
Các bạn kiểm tra file gửi kèm xem có khắc phục được nhược điểm này không? thì mới dám sử dụng find

[GPECODE=vb]'?? find tim khong ra ket qua, mat du mat thuong nhin thay ket qua
'-biet value, tim vi tru hang cot trong range bang find khong duoc.

Sub Find_vitri()
Dim rng, RngKQ As Range
Dim jValue As Double

Set rng = Range("B2:B12")
jValue = [C1].Value

'-su dung find
Set RngKQ = rng.Find(What:=jValue, LookIn:=xlValues, LookAt:=xlWhole)

If RngKQ Is Nothing Then
MsgBox "Find khong tim thay vi tri"
Else
MsgBox "Find tim thay vi tri"
'-code xac dinh vi tri hang cot
End If
End Sub[/GPECODE]
 

File đính kèm

  • Find khong tim thay vi tri.xls
    30 KB · Đọc: 28
  • 11.jpg
    11.jpg
    82.3 KB · Đọc: 20
Lần chỉnh sửa cuối:
Ô C1 viết công thức = 1 ô bất kỳ trong vùng
Tìm với giá trị ô C1, có trong range B2:B12, xuất ra nó thuộc hàng cột nào? Find không có tìm thấy, đó là nhược điểm của find
Các bạn kiểm tra file gửi kèm xem có khắc phục được nhược điểm này không? thì mới dám sử dụng find

[GPECODE=vb]'?? find tim khong ra ket qua, mat du mat thuong nhin thay ket qua
'-biet value, tim vi tru hang cot trong range bang find khong duoc.

Sub Find_vitri()
Dim rng, RngKQ As Range
Dim jValue As Double

Set rng = Range("B2:B12")
jValue = [C1].Value

'-su dung find
Set RngKQ = rng.Find(What:=jValue, LookIn:=xlValues, LookAt:=xlWhole)

If RngKQ Is Nothing Then
MsgBox "Find khong tim thay vi tri"
Else
MsgBox "Find tim thay vi tri"
'-code xac dinh vi tri hang cot
End If
End Sub[/GPECODE]

do mình tìm hiểu chưa tới thôi chứ ko phải là nó hạn chế
Find nó tìm chính xác cái gì mà mình nhìn thấy trên sheet
con số của bạn là "6.082763"
nhưng khi bạn chuyển [c1] thành value thì nó như vậy "6.08276253029822" nên nó ko tìm thấy
vì vậy bạn phải làm tròn nó thành con số chính xác mà bạn thấy trên sheet
Mã:
jValue = Round([C1], 6)
 
do mình tìm hiểu chưa tới thôi chứ ko phải là nó hạn chế
Find nó tìm chính xác cái gì mà mình nhìn thấy trên sheet
con số của bạn là "6.082763"
nhưng khi bạn chuyển [c1] thành value thì nó như vậy "6.08276253029822" nên nó ko tìm thấy
vì vậy bạn phải làm tròn nó thành con số chính xác mà bạn thấy trên sheet
Mã:
[/FONT]
[FONT=Verdana]jValue = Round([C1], 6)

Đã thêm round, và cũng định dạng cho hiện 3 số sau dấu phẩy, vậy mà một vài trường hợp find vẫn tìm không ra, và đây là code và file minh họa.
[GPECODE=vb]Sub Find_vitri()
Dim rng, RngKQ As Range
Dim jValue
Dim i
Range("C3:D19").Clear
For i = 3 To 19
[C1] = Cells(i, 2).Value
Set rng = Range("B3:B19")
rng.Interior.ColorIndex = 4
'jValue = Application.RoundDown([C1].Value, 3)
jValue = Round([C1].Value, 3)
'-su dung find
Set RngKQ = rng.Find(What:=jValue, LookIn:=xlValues, LookAt:=xlPart)
If RngKQ Is Nothing Then
'MsgBox "Find khong tim thay vi tri"
Cells(i, 4) = "No"
Else
'-tim thay thi lam
RngKQ.Interior.ColorIndex = 8
RngKQ.Offset(0, 1).Value = RngKQ.Address & " Yes"
End If
Next
End Sub
[/GPECODE]
 

File đính kèm

  • Find khong tim thay vi tri hoi gpe.xls
    64.5 KB · Đọc: 15
sao nó cứ quay vòng vòng ko load bài lên được?
 

File đính kèm

  • Find khong tim thay vi tri hoi gpe.xls
    69.5 KB · Đọc: 20
Web KT
Back
Top Bottom