Hàm tự tạo tham chiếu đến 1 vùng dữ liệu thuộc sheet khác (1 người xem)

  • Thread starter Thread starter Lighting
  • Ngày gửi Ngày gửi

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

Lighting

Thành viên mới
Tham gia
15/3/07
Bài viết
49
Được thích
14
Mình có tạo 1 hàm nhưng khi tham chiếu đến 1 range trong sheet khác thì không chạy đúng.
Xin các ban chỉ dẫn:
Mã:
Public Function xoy(ByVal a As Variant, ByVal b As Variant, rg As Range) 'ham tim va thay the nhu toa do y=f(x) (biet x,y ra f va ...)    dai = rg.Columns.Count
    rong = rg.Rows.Count
    goc_r = rg.Cells(1, 1).Row
    goc_c = rg.Cells(1, 1).Column
    j = 0
    For I = goc_c To goc_c + dai   'tim theo hang 1
        If Cells(goc_r, I) = a Then
            k = 1
            GoTo tip
        End If
    Next I
    For I = goc_r + 1 To goc_r + rong     'neu ko duoc tim theo cot 1
            If Cells(I, goc_c) = a Then
            k = 2
            GoTo tip
        End If
    Next I
    For I = goc_r + 1 To goc_r + rong 'neu ko dc tim trong bang
        For j = goc_c + 1 To goc_c + dai
            If Cells(I, j) = a Then GoTo tip
        Next j
    Next I
    xoy = "bo tay"    'ko tim thay a tim b =xoy(b, a, rg) nhung ko can thiet
    Exit Function
tip: If j <> 0 Then
        For l = goc_r To goc_r + rong 'tim trong bang xong thi tim b trong hang hoac cot
            If Cells(l, goc_c) = b Then
                xoy = Cells(goc_r, j)
                Exit For
            End If
        Next l
        For l = goc_c To goc_c + dai
            If Cells(goc_r, l) = b Then
                xoy = Cells(I, goc_c)
                Exit For
            End If
        Next l
     Else
        Select Case k
            Case 1
                For j = goc_r To goc_r + rong  'tim thay a o hang 1, di tim b o cot 1 va cot co a
                    If Cells(j, goc_c) = b Then   'tim thay o cot 1 thi kq tinh theo 2 canh goc vuong
                        xoy = Cells(j, I)
                        Exit For
                    End If
                    If Cells(j, I) = b Then       'tim thay o trong bang thi kq tinh theo canh huyen va canh ngang a
                        xoy = Cells(j, goc_c)
                        Exit For
                    End If
                Next j
            Case 2
                For j = goc_c To goc_c + dai  'tim thay a o cot 1 di tim b o hang 1 va hang co a
                    If Cells(goc_r, j) = b Then   'tim thay o hang 1 thi kq tinh theo 2 canh goc vuong
                        xoy = Cells(I, j)
                        Exit For
                    End If
                    If Cells(I, j) = b Then       'tim thay o trong bang thi kq tinh theo canh huyen va canh do.c a
                        xoy = Cells(goc_r, j)
                        Exit For
                    End If
                Next j
        End Select
     End If
End Function
Chi tiết trong file đính kèm.
Cám ơn các bạn!
 

File đính kèm

Code của bạn rừng bỏ bố. Tên biến gì mà cứ a, b, i, j, k... lười đọc quá.

Đại khái thì các đối tượng Cells(...) của bạn nó luôn luôn được mặc định là của activesheet. Để có thể chiếu qua sheet khác, bạn cần thêm cách cho nó chiếu.

Sửa khai báo chứ ký hàm:

Public Function xoy(ByVal a As Variant, ByVal b As Variant, rg As Range, optional byval wsName as string = "")

Bên trong hàm, ngay sau dòng function, thêm code này:

If wsName = "" Then
If ActiveSheet.Name = "" Then
wsName= Sheets(1),Name
Else
wsName= ActiveSheet.Name
End If
End If

With WorkSheets(wsName)

... code cũ ở đây ...

End With
End Function

Bên trong code cũ, bất cứ chỗ nào có rg, bạn thêm dấu chấm trước nó (thành ra .rg)
và bất cứ chỗ nào có Cells mà không có dấu chấm trước nó thì bạn thêm vào (thành ra .Cells)

Lúc gọi hàm thì thêm tên worksheet:

caiGiDo = xoy( a, b, "SheetGiDo")

=== đính chính: 04-02-15 lúc 12:20 AM ===

Xin bỏ qua câu "bất cứ chỗ nào có rg, bạn thêm dấu chấm trước nó (thành ra .rg)" ở trên. Câu này sai.
rg là một tên biến hẳn hoi chứ không phải là một thuộc tính chung của một đói tượng cho nên không thể đặt tiền tố.
 
Lần chỉnh sửa cuối:
Upvote 0
Ca'm on ban, mi`nh da tim ra cach la dung ham:
PHP:
    sh = rg.Worksheet.CodeName      'xac dinh sheet cua rg tim kiem    
With Worksheets(CStr(ActiveWorkbook.VBProject.VBComponents(sh).Properties("Name"))) 'Tools>Macro>Security..>Trusted Publishers, check Trust access to Visual Basic Project.
nhu vay khong can phai them bien wsname nhung ki la o cho thinh thoang ham moi chay duoc. Bo sung them la neu minh dat pass vb thi no khong chay duoc con neu khong dat pass thi chay duoc. Pass vb la 123.Chang hieu the nao//////. Minh xin gui file len mong cac ban giup do
Unikey va Vietkey may minh cung ko chay duoc, khoi dong lai thi chay duoc 1 luc (mac du da cai ctrinh chong virus ESET) nen cung khong danh duoc tieng Viet, dung bo go tren dien dan cung the. @!##
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu rg là nơi thao tác thì parent là sheet chứa nó. KHi ấy chỉ cần:

Đặt thêm câu này ngay sau dòng Public Function(...
With rg.Parent
Và đăt them câu này ngay trước dòng End Function
End With

Sau đó nhấn Ctrl+h
Find Cells > Replace with .Cells > Replace All
Nhấn ctrl+h lần nữa
Find .. (2 dấu chấm) > Replace with . (1 dấu chấm) > Replace All
(tức là thêm dấu chấm vào trước Cells, trừ những chỗ đã có sẵn)
 
Upvote 0
Hay quá, sao bạn không nói sớm @$@!^%. làm mình cứ mò mẫm ở đâu đâu
 
Upvote 0
Câu hỏi càng tỉ mỉ diễn tả vấn đề thì câu trả lời càng sát với vấn đề.
Tôi đã nói trước code của bạn rối như rừng, tôi lười đoán mò.
 
Upvote 0
Hi, bạn không cần đoán mò mà vẫn giúp được mình đó thôi
 
Upvote 0

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

Back
Top Bottom