thiennx
Thành viên chính thức
- Tham gia
- 18/9/08
- Bài viết
- 73
- Được thích
- 14
Người ta tạo ra Mã hiệu là để dễ nhớ, dễ quản lý. Chỉ cần biết Mã hiệu là có thể tra ra các thông tin khác. Bạn thì bạn làm ngược lại. Từ nội dung công việc đi tra ngược lại mã hiệu???Em đang lập dự toán cho công trình điện, muốn có công thức dò tìm mã hiệu định mức cho nhanh, nhờ các bác lập cho em cái công thức như yêu cầu trong file đính kèm.
Xin cám ơn nhiều.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [c6]) Is Nothing Then
If [A8].Value = "" Then
MsgBox "Can Nhap Du Lieu Tai [A8]", , "GPE Xin Luu Y:": Exit Sub
End If
Dim Sh As Worksheet, Rng As Range, sRng As Range, RngS As Range
Dim MyAdd As String
Dim DoSau As Double, Sd As Double
Set Sh = Sheets("KL")
Set Rng = Sh.Range(Sh.[b4], Sh.[b65500].End(xlUp))
With Rng.Find(Target.Value, , xlFormulas, xlWhole).Offset(, 4)
DoSau = .Value
Sd = .Offset(, 1).Value
End With
DoSau = Switch(DoSau <= 1, 1, DoSau <= 2, 2, DoSau <= 3, 3, DoSau <= 9, 4)
Sd = Switch(Sd <= 5, 5, Sd <= 15, 15, Sd <= 25, 25, Sd <= 35, 35, Sd <= 50, 50, _
Sd <= 75, 75, Sd <= 100, 100, Sd <= 150, 150, Sd <= 200, 200, Sd <= 250, 250 _
, Sd <= 300, 300, Sd <= 350, 350, Sd <= 400, 400, Sd <= 450, 450)
Set Sh = Sheets("DGDZ")
Set Rng = Sh.Range(Sh.[c2], Sh.[c65500].End(xlUp))
Set sRng = Rng.Find(Sd)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If RngS Is Nothing Then
Set RngS = sRng.Offset(, 1)
Else
Set RngS = Union(RngS, sRng.Offset(, 1))
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Set sRng = RngS.Find(DoSau).Offset(1, 3)
Set Rng = Sh.Range(sRng, sRng.End(xlDown))
With [A8]
Set sRng = Rng.Find(.Value)
If Not sRng Is Nothing Then _
.Offset(, 1).Value = sRng.Offset(, -6).Value
End With
End If
End Sub
Dùng validation hay conditional formatting thì em cũng dùng nhiều rồi nên em cũng biết chút.
Có điều khi thay đổi dữ liệu là cấp đất ở A8 thì cứ lại phại chọn lại dữ liệu ở ô C6 thì dữ liệu ở B8,C8 mới nhảy.
RẤT MONG CÁC BÁC SẼ CÓ GIẢI PHÁP TỐT HƠN NỮA, CÁM ƠN NHIỀU!
Option Explicit
[B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
If Not Intersect(Target, [c6]) Is Nothing Then
GPE_TraCuuDL Target
ElseIf Not Intersect(Target, [A8]) Is Nothing Then
GPE_TraCuuDL [c6]
End If
[B]End Sub[/B]
Sub GPE_TraCuuDL(Targ As Range)
Dim Sh As Worksheet, Rng As Range, sRng As Range, RngS As Range
Dim MyAdd As String
Dim DoSau As Double, Sd As Double
Set Sh = Sheets("KL")
Set Rng = Sh.Range(Sh.[b4], Sh.[b65500].End(xlUp))
With Rng.Find(Targ.Value, , xlFormulas, xlWhole).Offset(, 4)
DoSau = .Value
Sd = .Offset(, 1).Value
End With
DoSau = Switch(DoSau <= 1, 1, DoSau <= 2, 2, DoSau <= 3, 3, DoSau <= 9, 4)
Sd = Switch(Sd <= 5, 5, Sd <= 15, 15, Sd <= 25, 25, Sd <= 35, 35, Sd <= 50, 50, _
Sd <= 75, 75, Sd <= 100, 100, Sd <= 150, 150, Sd <= 200, 200, Sd <= 250, 250 _
, Sd <= 300, 300, Sd <= 350, 350, Sd <= 400, 400, Sd <= 450, 450)
Set Sh = Sheets("DGDZ")
Set Rng = Sh.Range(Sh.[c2], Sh.[c65500].End(xlUp))
Set sRng = Rng.Find(Sd)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If RngS Is Nothing Then
Set RngS = sRng.Offset(, 1)
Else
Set RngS = Union(RngS, sRng.Offset(, 1))
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
Set sRng = RngS.Find(DoSau).Offset(1, 3)
Set Rng = Sh.Range(sRng, sRng.End(xlDown))
With [A8]
Set sRng = Rng.Find(.Value)
If Not sRng Is Nothing Then _
.Offset(, 1).Value = sRng.Offset(, -6).Value
End With
End Sub