cần giúp đỡ viết công thức vẫn về hàm tra cứu (1 người xem)

Liên hệ QC

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

cuonghb644

Thành viên mới
Tham gia
19/2/08
Bài viết
17
Được thích
1
cần tính cột kênh. Dữ liệu tham chiếu trong sheet phuluc. mong được các bạn giúp đỡ. xin cảm ơn.
xin lỗi nha, lúc trước copy thiếu.
ko biết nhập công thức kiểu gì cả. lúc đầu định dùng if kết hợp với Hlookup nhưng hàm dài quá nên ko thể viết đc. bó tay.
 

File đính kèm

Lần chỉnh sửa cuối:
cần tính cột kênh. Dữ liệu tham chiếu trong sheet phuluc. mong được các bạn giúp đỡ. xin cảm ơn.
Chẳng hiểu bạn muốn lấy dữ liệu gì?
Bạn nên nhập thủ công một số dòng để mọi người hiểu ý Bạn muốn làm như thế nào.
Từ chuyên môn của ngành Bạn không phải ai cũng biết, "Kênh"? Rồi NCD1, NCD2, BT...???
 
nếu GT là Nam, Tháng sinh =0: 0<cân nặng<=2: NCD2; 2<cân nặng<=2.5: NCD1; 2.5<cân nặng<=4.7: BT; 4.7<cân nặng<=5.3: NCT1; 5.3<cân nặng: NCT2; tương tự với nữ.
 
nếu GT là Nam, Tháng sinh =0: 0<cân nặng<=2: NCD2; 2<cân nặng<=2.5: NCD1; 2.5<cân nặng<=4.7: BT; 4.7<cân nặng<=5.3: NCT1; 5.3<cân nặng: NCT2; tương tự với nữ.
Dữ liệu của Bạn có là thật không?
STT 1: Nguyễn Thành Đạt, sinh ngày 25/05/2004, ngày cân là 10/01/2010, số tháng tính ra là 67 tháng, cân nặng 16kg, Bạn muốn lấy dữ liệu là gì?
Số liệu không chính xác khó lòng tìm ra công thức chính xác được.
Bạn nên nhập thủ công ý Bạn muốn kết quả thế nào, vài dòng cũng được, sao Bạn "hà tiện" cung cấp ý định của mình thế!
 
Đúng là không dễ để hiểu; chứ không khó để thực hiện iêu cầu của bạn!

PHP:
Option Explicit
Sub TraBang()
 Dim Clls As Range, Rng As Range, sRng As Range, Cll As Range
 Dim Sh As Worksheet, Offs As Byte, Jj As Byte
 
 Set Sh = Sheets("PhuLuc")
 Set Rng = Sh.Range(Sh.[a3], Sh.[a65500].End(xlUp))
 For Each Clls In Range("C2:C" & [c65500].End(xlUp).Row)
   Offs = 10
   If Clls.Offset(, 2).Value = "Nam" Then Offs = 1
   Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      MsgBox "Nothing"
      Clls.Interior.ColorIndex = 34 + Clls.Row Mod 7
   Else
      For Jj = Offs To Offs + 9
         With Clls.Offset(, 3)
            If .Value > sRng.Offset(, Jj).Value _
               And .Value <= sRng.Offset(, Jj + 1).Value Then
               
               .Offset(, 1).Value = Sh.Cells(2, sRng.Offset(, Jj).Column)
               Exit For               
            End If
         End With
      Next Jj
   End If
 Next Clls
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
cảm ơn bạn HYen17. tệp của bạn ok nhưng có cách nào chỉ dùng hàm đc ko? code tôi chả biết gì cả. với lại sau đó tôi nhập liệu số liệu khác thì sao kênh nó ko đi theo!
 
Lần chỉnh sửa cuối:
(1)Nhưng có cách nào chỉ dùng hàm đc ko? code tôi chả biết gì cả;
(2) Với lại sau đó tôi nhập liệu số liệu khác thì sao kênh nó ko đi theo!

(1) Mình chỉ có thể viết cho bạn macro thôi; Còn hàm trong excel thì có khi còn thua bạn nữa ấy chứ!
Mình sẽ suy nghĩ để viết cho bạn hàm tự tạo xem sao;

(2) Bạn phải chạy macro lại thì mới cập nhật dữ liệu từ bảng tra vô [Kenh]

Trong macro trên, mình còn thiếu 1 dòng lệnh
PHP:
 Exit For

Bạn thêm giúp như mình đã sửa ở bài trên nha!

Xin chào & chúc xuân nhiều may mắn!
 
(1) Mình chỉ có thể viết cho bạn macro thôi; Còn hàm trong excel thì có khi còn thua bạn nữa ấy chứ!
Mình sẽ suy nghĩ để viết cho bạn hàm tự tạo xem sao;

(2) Bạn phải chạy macro lại thì mới cập nhật dữ liệu từ bảng tra vô [Kenh]

Trong macro trên, mình còn thiếu 1 dòng lệnh
PHP:
 Exit For

Bạn thêm giúp như mình đã sửa ở bài trên nha!

Xin chào & chúc xuân nhiều may mắn!
chạy macro lại như thế nào bác?
 
chạy macro lại như thế nào bác?
Hãy bấm tổ hợp fím {CTRL}+{SHIFT}+T, là tổ hợp fím mình đã gán cho macro đó;

Nhưng mình đã viết cho bạn hàm tự tạo xong rồi đây, xem trong file đính kèm nha!
PHP:
Option Explicit
Function TraDL(LookUpRange As Range)
 Dim SoThg As Byte, jJ As Byte, SoCot As Byte
 Dim Rng As Range, sRng As Range, Sh As Worksheet, Rng0 As Range
 
 SoThg = DateDiff("M", LookUpRange.Cells(1, 1).Value, Date)
 Set Sh = Worksheets("PhuLuc")
 Set Rng = IIf(LookUpRange.Cells(1, 2).Value = "Nam", Sh.Range("Nam"), Sh.Range("Nu"))
 Set sRng = Rng.Find(SoThg, , xlFormulas, xlWhole):         SoCot = Rng.Columns.Count
 If sRng Is Nothing Then
   TraDL = "Nothing"
 Else
   Set Rng0 = sRng.Resize(, SoCot)
   For Each sRng In Rng0
      jJ = jJ + 1
      With LookUpRange.Cells(1, 3)
         If .Value > sRng.Value And .Value <= sRng.Offset(, 1).Value Then
            TraDL = Rng.Cells(1, jJ).Value
            Exit For
         End If
      End With
   Next sRng
 End If
End Function
(Mình sẽ xóa file trên đó nha!)
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Hãy bấm tổ hợp fím {CTRL}+{SHIFT}+T, là tổ hợp fím mình đã gán cho macro đó;

Nhưng mình đã viết cho bạn hàm tự tạo xong rồi đây, xem trong file đính kèm nha!
PHP:
Option Explicit
Function TraDL(LookUpRange As Range)
Dim SoThg As Byte, jJ As Byte, SoCot As Byte
Dim Rng As Range, sRng As Range, Sh As Worksheet, Rng0 As Range

SoThg = DateDiff("M", LookUpRange.Cells(1, 1).Value, Date)
Set Sh = Worksheets("PhuLuc")
Set Rng = IIf(LookUpRange.Cells(1, 2).Value = "Nam", Sh.Range("Nam"), Sh.Range("Nu"))
Set sRng = Rng.Find(SoThg, , xlFormulas, xlWhole): SoCot = Rng.Columns.Count
If sRng Is Nothing Then
TraDL = "Nothing"
Else
Set Rng0 = sRng.Resize(, SoCot)
For Each sRng In Rng0
jJ = jJ + 1
With LookUpRange.Cells(1, 3)
If .Value > sRng.Value And .Value <= sRng.Offset(, 1).Value Then
TraDL = Rng.Cells(1, jJ).Value
Exit For
End If
End With
Next sRng
End If
End Function

(Mình sẽ xóa file trên đó nha!)

Hình như HYen17 đính kèm lộn tập tin?!?
 
bác xóa luôn cả file dưới rùi cho lại cái khác đc ko!
 
bạn HYeN17 có tài liệu về viết code hoặc macro ko cho tôi xin với. đọc chả hiểu gì cả. cảm ơn nhiều.
 
(1) bạn có tài liệu về viết code hoặc macro ko cho tôi xin với. (2)đọc chả hiểu gì cả. cảm ơn nhiều.

(1) Bạn vô thư viện của chúng ta tìm các tài liệu; Có đầy đủ từ đơn giảm đến fức tạp
Hay vô BOX lập trình, mình có bài chập chững đến VBA đọc tạm trong những ngày rỗi trong dịp xuân về!

(2) Mình sẽ dịch giải thuật này, để bạn hiểu sơ lược về nó. Còn hàm tự tạo thì bạn nhập trúng cú fáp là OK thôi; Cú fáp cũng đơn giản mà!
Chỉ là =TraDL(D2:F2) để có kết quả tra của em thứ nhất. Tuy nhiên trong trang tính 'PhuLuc' đã có 2 vùng được gán tên mà hàm sử dụng đến

Fần dịch các dòng lệnh như sau:

PHP:
Option Explicit   ' Yêu cầu các biến cần được khai báo tường minh'
Function TraDL(LookUpRange As Range) ' Hàm có tên là TraDL & cần được cung cấp 1 tham số kiểu vùng ô'
' Mà cụ thể là 3 ô trên cùng dòng chứa dữ liệu lần lược là: NgaySinh, GioiTinh & CanNang'
Dim SoThg As Byte, jJ As Byte, SoCot As Byte
Dim Rng As Range, sRng As Range, Sh As Worksheet, Rng0 As Range
'Khai báo các biến để sử dụng trong hàm'

SoThg = DateDiff("M", LookUpRange.Cells(1, 1).Value, Date)
' Nhờ hàm DateDiff() trong VBA tính ra số tháng kể từ NgaySinh cho đến ngày hôm nay'
'Hàm này cũng giống như hàm DATEDIF() trong Excel'
Set Sh = Worksheets("PhuLuc") 'Gán trang "PhuLuc" vô biến đối tượng Sh'
Set Rng = IIf(LookUpRange.Cells(1, 2).Value = "Nam", Sh.Range("Nam"), Sh.Range("Nu"))
'Gán vùng đã đặt tên tương ứng của trang "PhuLuc" vô biến Rng, tùy thuộc trị chứa trong fái tính' 
Set sRng = Rng.Find(SoThg, , xlFormulas, xlWhole): SoCot = Rng.Columns.Count
'Dùng fương thức tìm kiếm để tra dữ liệu theo số tháng tương ứng'
If sRng Is Nothing Then 'Nếu không tìm thấy thì:'
      TraDL = "Nothing"   ' Hàm trả về từ cho ta biết hàm không tìm thấy'
'Đây là 1 đề fòng cần thiết cho những ai chưa quen dùng hàm; Cũng giống như bãy lỗi trong công thức'
Else   ' Nếu tìm thấy thì thực hiện tiếp cho đến khi gặp dòng End If'
  Set Rng0 = sRng.Resize(, SoCot)
  'Đem các ô của vùng tra tương ứng mà cùng dòng với ô tìm thấy gán vô biến đã khai báo'
   For Each sRng In Rng0
   'Tạo vòng lặp duyệt toàn bộ các ô chứa trong biến này'
       jJ = jJ + 1
     'Tăng mỗi lần duyệt 1 đơn vị nhằm biết được ta đang duyệt ô nào của biến'
         With LookUpRange.Cells(1, 3)
          'Khai báo là ta sẽ làm việc với ô thứ ba của tham số cung cấp ban đầu của hàm'
              If .Value > sRng.Value And .Value <= sRng.Offset(, 1).Value Then
             'Nếu trị trong ô ta khảo sát nhỏ hơn tham biến (ô 3) & ô bên fải liền kề với ô khảo'
             'sát>= trị của tham biến 3 thì thực hiện các dòng dưới tiếp theo cho đến End If gần nhất'
                 TraDL = Rng.Cells(1, jJ).Value 'Lấy trị trong đầu cột của bảng tra gán vô hàm'
                  Exit For    ' Thoát ngay khỏi vòng lặp - Không cần tiếp nữa tốn thời gian'
              End If
          End With 'Kết thúc With'
   Next sRng  'Kết thúc vòng lặp với biến sRng'
End If  'Khóa đuôi hàm If đầu tiên trong hàm'
End Function
 
Lần chỉnh sửa cuối:
bạn HYeN17 hỗ trợ tôi thêm chút nữa nha:
- Bổ sung thêm cột ngày cân đo chứ ko phải chỉ cân đo đúng vào ngày xét.
- Cái này copy để dùng trong một tệp khác thì làm thế nào.
cảm ơn.
vẫn mong được bạn nào hướng dẫn viết hàm thui. code xem một hồi chưa hiểu gì cả.
 

File đính kèm

Lần chỉnh sửa cuối:
bạn hỗ trợ tôi thêm chút nữa nha:
(1)- Bổ sung thêm cột ngày cân đo chứ ko phải chỉ cân đo đúng vào ngày xét.
(2)- Cái này copy để dùng trong một tệp khác thì làm thế nào.
(1) Bạn sửa hàm tự tạo ấy với 3 dòng lệnh mình đã đánh dấu, như sau

PHP:
Option Explicit
Function TraDL(LookUpRange As Range, Optional NgayCan As Date) '<=|'
 Dim SoThg As Byte, jJ As Byte, SoCot As Byte
 Dim Rng As Range, sRng As Range, Sh As Worksheet, Rng0 As Range
 
 If NgayCan = 0 Then NgayCan = Date   '<=|'
 SoThg = DateDiff("M", LookUpRange.Cells(1, 1).Value, NgayCan)  '<=|'
 Set Sh = Worksheets("PhuLuc")
 Set Rng = IIf(LookUpRange.Cells(1, 2).Value = "Nam", Sh.Range("Nam"), Sh.Range("Nu"))
 Set sRng = Rng.Find(SoThg, , xlFormulas, xlWhole):         SoCot = Rng.Columns.Count
 If sRng Is Nothing Then
   TraDL = "Nothing"
 Else
   Set Rng0 = sRng.Resize(, SoCot)
   For Each sRng In Rng0
      jJ = jJ + 1
      With LookUpRange.Cells(1, 3)
         If .Value > sRng.Value And .Value <= sRng.Offset(, 1).Value Then
            TraDL = Rng.Cells(1, jJ).Value
            Exit For
         End If
      End With
   Next sRng
 End If
End Function

Cách sử dụng: Tại cột I, bắt đầu từ I2 ta nhập cú pháp: =traDL(D2:F2,H2)
(Chú í: dấu fân cách các đối số của bạn có thể là khác)
Sau đó bạn FilllDown xuống đến I12 & tự rút ra kết luận cho riêng mình;
Hàm giờ cần 2 tham số; nhưng tham số thứ hai ta có thể không cần cung cấp; Một khi có cung cấp, nó sẽ lấy ngày đó để tính toán; nếu không cung cấp, nó sẽ lấy ngày hiện hành để công việc được tiếp tục như không có gì sẫy ra!

(2) Bạn thử làm ngược lại: Copy dữ liệu vô trang tính 'Tinh'. Chú ý giữ nguyên các cột như hiện nay vốn có (Do bạn chưa rành VBA nên fải vậy!)
Cách hai: Bạn fải chép nguyên trang 'PhuLuc' & nội dung hàm sang workbook mới. (Chú í tên hai vùng đã đang có bên 'PhucLuc'

Chúc bạn thành công;

Nhắc thêm:
(1) Muốn hiểu hàm tự tạo này, bạn cần thời gian lá 1 tháng; Để viết được vậy, mình fải mất khoảng vài năm tu luyện đó bạn! --=0
(2) Rất mong các nhà siêu công thức thử ra tay xem sao?!
 
Ngày đầu tiên của năm mới. Tham dự một bài cho có khí thế!
Bạn kiểm tra xem có đúng không, mình cũng chưa xem kỹ.
(Dùng công thức thường thôi!)
 

File đính kèm

Ngày đầu tiên của năm mới. Tham dự một bài cho có khí thế!
Bạn kiểm tra xem có đúng không, mình cũng chưa xem kỹ.
(Dùng công thức thường thôi!)

hay quá. cảm ơn bạn nhiều. Có điều giải thích giùm tôi với, vẫn chả hiểu gì mấy công thức bạn lập cả.
 
Lần chỉnh sửa cuối:
Công thức tại F2 của bạn đang là: =IF(E2="","",IF(E2>NCT2,"NCT2",IF(E2>NCT1,"NCT1",IF(E2>BT,"BT",IF(E2>NCD1,"NCD1","NCD2")))))

Công thức này có lẻ còn thiếu nhiều yếu tố:

Phải tra theo số tháng sinh trưởng; Có nghĩa là fải có sự tham gia của [C2] & [H2];

Fải có sự tham gia của fái tính, có nghĩa là của [D2]

Rất mong bạn tiếp tục!

Chúc các bạn vui xuân an lành & nhiều hạnh fúc!
 
Nếu ngày tết chỉ ăn và uống, không chừng bị lụt nghề mất. Phải ôn lại tí.

=INDEX(IF(D3="Nam";LoaiNam;LoaiNu);1;MATCH(E3;OFFSET(IF(D3="Nam";LoaiNam;LoaiNu);MATCH(G3;Thang;0);0);1))
 

File đính kèm

Web KT

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

Back
Top Bottom