giúp em công thức khó

  • Thread starter Thread starter thiennx
  • Ngày gửi Ngày gửi
Liên hệ QC

thiennx

Thành viên chính thức
Tham gia
18/9/08
Bài viết
73
Được thích
14
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.
 

File đính kèm

Lần chỉnh sửa cuối:
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.
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???
 
Hãy tìm kiếm bằng fương thức FIND(), như sau

PHP:
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

Chú ý:
(1) Mình có thêm một số nội dung trong các trang tính, như
(*) Tại 'TT' ô C6 mình thêm Validation cho bạn chọn theo trang 'KL' (Trang 'KL' này cũng nên đổi tên như vậy(?)
(*) Trang 'DGDZ' mình thêm dữ liệu cột c & d, cũng như [G2]; Chuyện này giúp nhiều cho việc tìm kiếm nhanh lẹ; Rất mong bạn chấp thuận!

(2) Để có kết quả do macro đưa lại tại [B8], quy trình cần thực hiện như sau:
(*) Nhập trước tiên dữ liệu vô [A8]
(*) Chọn 1 dòng trong hộp Validation tại [C6]
(*) Chưa kịp rung đùi đã có kết quả cho bạn;

(3) Lần sau bạn nên viết rõ hơn, để đỡ tốn công mọi người có hay không có thiện ý giúp bạn; Này nha:
(*) Tìm gần 30 fút mới biết độ sâu & diện tích hố ở đâu. Bạn nên biết rằng không fải ai cũng trong nghề của bạn, để biết rằng dòm nó ở nơi mô!
Bài này mà làm được công thức thì trên diễn đàn này chỉ vài người là có thể thôi. Nếu bạn không ưa cách làm của mình thì đành chờ các siêu công thức vậy!
 

File đính kèm

Cám ơn bác SA_DQ đã tận tình giúp đỡ. Xin lỗi mọi người nếu yêu có khó hiểu.
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.
Việc thêm dữ liệu giúp việc tìm kiếm nhanh hơn là hoàn toàn cần thiết, em ko thắc mắc gì.
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.
Hôm qua đợi mãi ko thấy ai trả lời em cũng đành dùng tạm hàm if, kết hợp vlookup, index, match chỉ có điều em dùng excel 2003 nên chỉ if được 7 lần và công thức thì hơi dài, tuy nhiên nó cũng đủ đáp ứng cho yêu cầu thiết kế móng của bọn em.
Còn như bác huuthang_bd thì ko đúng rồi, mã hiệu chỉ để tra cứu khi lập dự toán, và khi em làm một dự toán để dùng cho một dự án làm trong toàn tỉnh thì nó sẽ có khoảng 200 loại móng và có nhiều cấp đất tương ứng với các huyện khác nhau. Do vậy khi dùng ứng dụng đó sẽ thuận tiện cho việc thay đổi dữ liêu đầu vào khi cần, không phải ngồi tra mã hiệu cho mỏi mắt, nghĩa là chỉ cần thay đổi tên huyện có công trình cái thì mọi thứ từ cự ly vận chuyển, cấp đất, hệ số nhân công, máy thi công...sẽ tư thay đổi cho phù hợp.
RẤT MONG CÁC BÁC SẼ CÓ GIẢI PHÁP TỐT HƠN NỮA, CÁM ƠN NHIỀU!
 
Vậy bạn chép cặp này, đề lên chổ cũ nha!

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!
Mã:
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]
PHP:
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
Hướng dẫn thêm:
Tạo tại [A8] 1 hộp Validation để chọn cấp công trình & thay thử nó xem.
Hi vọng là bạn không fải nhờ đưa file lên 1 cách cụ thể
 
Cái đó em làm được, cám ơn pác nhé!
 
Web KT

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

Back
Top Bottom