Xin Hỏi Về Hàm Cho "BÀI TOÁN CHIA KẸO"

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

tam8678

Đời Xá Chi
Tham gia
30/4/09
Bài viết
417
Được thích
301
Nghề nghiệp
Kế toán
Nhân đọc qua "Bài Toán Chia Kẹo" của anh ThuNghi rất hay, ứng dụng trong thực tế tôi đang làm thì có phần ngược lại, rất mong các anh em trên GPE xem và có thể viết giúp hàm tự tạo trong bài toán này.
Mong muốn được ghi cụ thể trong file đính kèm.

Cám ơn các anh, em nhiều ( nếu không rỏ xin thông báo ).
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn cần xài hàm mảng sau đây:

PHP:
Option Explicit:           Option Base 1
Function GomKeo(LookUpRange As Range, QuiCach As String, SoLuong As Long) As Variant
 Dim Clls As Range
 Dim Dem As Byte, Rws As Long, Ton As Long
 
 Rws = LookUpRange.Rows.Count:            ReDim MDL(Rws, 2)
 For Each Clls In LookUpRange.Cells(1, 1).Resize(Rws)
   If InStr(Clls.Value, QuiCach) > 0 Then
      Dem = Dem + 1
      MDL(Dem, 1) = Clls.Value
      Ton = Clls.Offset(, 2).Value
      If Ton <= SoLuong Then
         MDL(Dem, 2) = Ton
         SoLuong = SoLuong - Ton
      Else
         MDL(Dem, 2) = SoLuong:           SoLuong = 0
         Exit For
      End If
   End If
 Next Clls
 If SoLuong > 0 Then
   Dem = Dem + 1
   MDL(Dem, 1) = QuiCach:                 MDL(Dem, 2) = -SoLuong
 End If
 For Ton = Dem + 1 To Rws
   MDL(Ton, 1) = "":                   MDL(Ton, 2) = ""
 Next Ton
  GomKeo = MDL
End Function

Hướng dẫn sử dụng trước khi dùng:

(*) Tô chọn các cột từ 'D:H' & vô menu Insert để thêm cột;

(*) Cũng dùng chuột, tô chọn vùng 'E3:F8'; Bấm vô đâu đó, để màu nền vùng này trùng với 'A3';
Tiếp theo, bấm chuột lên thanh công thức & nhập cú pháp hàm như sau:
=GomKeo(A3:C10,"2626 1000",700)​
(*) Kết thúc bằng tổ hợp 3 phím dành cho hàm mảng;

(Cũng như vậy với vùng 'E10:F16', nhưng nên tô màu nền vùng này giống với 'A10'
& cú pháp hàm lúc này là: =GomKeo(A3:C10,"5050 850",1100)

Chúc bạn thành công mỹ mãn với hàm mảng tự tạo!
 
Upvote 0
Nhờ giải thích về "BÀI TOÁN GOM KẸO"

Hướng dẫn sử dụng trước khi dùng:

(1) Tô chọn các cột từ 'D:H' & vô menu Insert để thêm cột;

(2) Cũng dùng chuột, tô chọn vùng 'E3:F8'; Bấm vô đâu đó, để màu nền vùng này trùng với 'A3';
Nhờ anh giải thích thêm :
(1) : Thêm cột để làm gì anh nhỉ ?
(2) : Đổ màu nền vùng này trùng với 'A3': không đổ màu nền vẫn ra kết quả mà ?
- Vùng A3:C... : đặt name cho vùng này được phải không ?

---------
Trong trường hợp không lấy theo số lượng từ thấp đến cao mà lấy theo số K từ nhỏ đến lớn thì sao anh nhỉ ?
* Số K : Số Kiện hàng ( số nhỏ vào trước => xuất trước )

Rất cám ơn anh
 
Upvote 0
Nhờ anh giải thích thêm :
(1) : Thêm cột để làm gì anh nhỉ ?
(2) : Đổ màu nền vùng này trùng với 'A3': không đổ màu nền vẫn ra kết quả mà ?
- Vùng A3:C... : đặt name cho vùng này được phải không ?

---------
Trong trường hợp không lấy theo số lượng từ thấp đến cao mà lấy theo số K từ nhỏ đến lớn thì sao anh nhỉ ?
* Số K : Số Kiện hàng ( số nhỏ vào trước => xuất trước )

Rất cám ơn anh
Thuật tóan em tính làm như sau, Anh xem có OK?
1/ Tách Quy cách và K thành 2 cột.
2/ Trích xuất ra temp theo quy cách và sort theo K
3/ Dùng vòng lặp xét đền khi nào SL = SL cần và có xét đến thừa và thiếu.
Để em làm thử.
 
Upvote 0
Nhờ anh giải thích thêm :
(1) : Thêm cột để làm gì anh nhỉ ?
(2) : Đổ màu nền vùng này trùng với 'A3': không đổ màu nền vẫn ra kết quả mà ?
- Vùng A3:C... : đặt name cho vùng này được phải không ?

---------
Trong trường hợp không lấy theo số lượng từ thấp đến cao mà lấy theo số K từ nhỏ đến lớn thì sao anh nhỉ ?
* Số K : Số Kiện hàng ( số nhỏ vào trước => xuất trước )

Rất cám ơn anh
Không yêu cầu nhưng dùng công thức để tham khảo nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ anh giải thích thêm :
(1) : Thêm cột để làm gì anh nhỉ ?
(2) : Đổ màu nền vùng này trùng với 'A3': không đổ màu nền vẫn ra kết quả mà ?
- Vùng A3:C... : đặt name cho vùng này được phải không ?
---------
Trong trường hợp không lấy theo số lượng từ thấp đến cao mà lấy theo số K từ nhỏ đến lớn thì sao anh nhỉ ?
* Số K : Số Kiện hàng ( số nhỏ vào trước => xuất trước )
(1) Thêm cột chẳng qua giữ lại số liệu của bạn để đối chiếu mà thôi.

(2) Đổ màu nền để biết rằng toàn vùng đó thuộc sở hữu của ai đó; & là vì các thành viên của hàm mảng không chứa dữ liệu đã bị biến thành => "" nên khó nhận biết vùng sử dụng của hàm mảng; Tô màu để giảm thiểu khó khăn đó!

(*) Ta có thể đặt name cho vùng này, hiễn nhiên.

(*) (Phải trấn tỉnh 1 hồi mới biết số K là số nào.); Giải pháp:

+ Xếp theo trật tự trước khi dùng hàm, nếu được;

+ Chờ ThuNghi vậy

+ Hãy đợi đấy! Погоди! Wait! Pogodi!
 
Lần chỉnh sửa cuối:
Upvote 0
Mong anh xem và hiểu :
- Đã nhờ các anh em giúp về hàm tự tạo => đứng ở file khác để lấy kết quả ở file nhập liệu.
+ Xếp theo trật tự trước khi dùng hàm, nếu được; ????
+ Hãy đợi đấy! Погоди! Wait! Pogodi!
------
???? => Cẩn thận chổ này, đây là file nhập liệu ( hay là không hiểu ý anh ? )

Không yêu cầu nhưng dùng công thức để tham khảo nhé.
----
Trường hợp này xử dụng công thức vất vả lắm bạn ơi.
File gốc : NHẬP XUẤT TỒN QUY CÁCH- KIỆN
Nhiều người, đứng ở nhiều bảng tính khác để tính toán và phụ thuộc vào file này.

Tôi biết bạn ứng phó công thức nhanh lắm- Cười
Nếu được mời bạn GOM KẸO.

Thân chào
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
----
Trường hợp này xử dụng công thức vất vả lắm bạn ơi.
File gốc : NHẬP XUẤT TỒN QUY CÁCH- KIỆN
Nhiều người, đứng ở nhiều bảng tính khác để tính toán và phụ thuộc vào file này.

Tôi biết bạn ứng phó công thức nhanh lắm- Cười
Nếu được mời bạn GOM KẸO.

Thân chào
Em làm thử như sau, có dùng sh Tmp cho nhanh, lâu quá không viết code nên hơi dài và luộm thuộm. Em sẽ trau chuốt lại sau.
Mã:
Dim i As Long, endR As Long
Dim myRng As Range
Dim Quycach As String, SlCan As Long, SLChia As Long, SlCon As Long
Sub LayData()

With Sheets("Tmp")
  .Range("A2:J1000").ClearContents
End With

With Sheets("Data")
  Quycach = .Range("E2")
  endR = .Cells(65000, 1).End(xlUp).Row
  Sheets("Tmp").Range("D2:D" & endR).Value = .Range("A2:A" & endR).Value
  Sheets("Tmp").Range("C2:C" & endR).Value = .Range("C2:C" & endR).Value
End With
With Sheets("Tmp")
  With .Range("A2:A" & endR)
    .FormulaR1C1 = "=tachquycach(RC4)"
    .Value = .Value
  End With
  With .Range("B2:B" & endR)
    .FormulaR1C1 = "=tachk(RC4)"
    .Value = .Value
  End With
  With .Range("F2")
    .Value = Quycach
  End With
  Set myRng = .Range("A1:C" & endR)

End With
myRng.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Tmp").Range( _
      "F1:F2"), CopyToRange:=Sheets("Tmp").Range("H1:J1"), Unique:=False

 ActiveWorkbook.Names("Criteria").Delete
 ActiveWorkbook.Names("Extract").Delete
Set myRng = Nothing
chia
End Sub
Sub chia()
endR = Sheets("Tmp").Cells(65000, 8).End(xlUp).Row
Set myRng = Sheets("Tmp").Range("H2:J" & endR)
myRng.Sort Key1:=Sheets("Tmp").Range("I2"), Order1:=xlAscending, Header:=xlGuess
j = 2
SlCon = 0
Sheets("data").Select
SlCan = Range("F2")
Range("H2:I100").ClearContents
For i = 1 To endR - 1
  SLChia = myRng(i, 3)
   If SLChia < SlCan Then
      Range("H" & j).Value = myRng(i, 1) & "-" & myRng(i, 2)
      Range("I" & j).Value = SLChia
    Else
      Range("H" & j).Value = myRng(i, 1) & "-" & myRng(i, 2)
      Range("I" & j).Value = SlCan
      GoTo bien
    End If
    SlCan = SlCan - SLChia
    j = j + 1
Next
If SlCan > 0 Then
  Range("H" & j).Value = Quycach
  Range("I" & j).Value = -SlCan
End If
bien:
End Sub
Mã:
Option Explicit
Option Base 1
Function TachChu(MyStr As String, n As Long) As String
Dim aSplit() As String
Dim SearchChar As String
Dim i As Long, j As Long
SearchChar = "-"
MyStr = Trim(MyStr)
If Len(MyStr) = 0 Or n > 3 Then Exit Function
  aSplit = Split(MyStr, SearchChar, 3)
  TachChu = Trim(aSplit(n - 1))
End Function
Function TachQuyCach(MyStr As String) As String
  TachQuyCach = Trim(TachChu(MyStr, 1))
End Function
Function TachK(MyStr As String) As String
  TachK = Trim(TachChu(MyStr, 2))
End Function
Theo file kèm.
 

File đính kèm

Upvote 0
Nghía vô các macro của ThuNghi mà phát ngộp thở luôn

Nếu là macro thì mình sẽ làm như vầy:

(*) Lấy 1 trang tính làm FORM, Xóa dữ liệu trên nó;

(*) Dùng phương thức tìm với thông số XlPart để chép toàn bô các records thỏa điều kiện (= với quy cách) từ trang tính gốc sang đó;

(*) Xếp theo chiều ưng í

(*) Thực hiên tiếp như hàm trên đã viết thôi, OK không vậy?

Chúc vui! --=0 :-= --=0
 
Upvote 0
Nếu là macro thì mình sẽ làm như vầy:

(*) Lấy 1 trang tính làm FORM, Xóa dữ liệu trên nó;

(*) Dùng phương thức tìm với thông số XlPart để chép toàn bô các records thỏa điều kiện (= với quy cách) từ trang tính gốc sang đó;

(*) Xếp theo chiều ưng í

(*) Thực hiên tiếp như hàm trên đã viết thôi, OK không vậy?

Chúc vui! --=0 :-= --=0
Em cũng tính làm theo Find Methode nhưng mà lâu nàgy không dùng nên làm AdFi, phần trích lọc sẽ sửa lại.
Còn em nghĩ, nếu list ds thì nên dùng Sub hay hơn UDF.

From Sa_DQ:
Lúc đầu, tác giả iêu cầu làm UDF, nên mình làm theo & vả chăng lúc đó chưa thấy mức độ khó của nó như giờ.

Nói như BAP thì hàm khó hơn SUB; Vậy nên ta làm SUB trước, OK với chú!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
----
Trường hợp này xử dụng công thức vất vả lắm bạn ơi.
File gốc : NHẬP XUẤT TỒN QUY CÁCH- KIỆN
Nhiều người, đứng ở nhiều bảng tính khác để tính toán và phụ thuộc vào file này.

Tôi biết bạn ứng phó công thức nhanh lắm- Cười
Nếu được mời bạn GOM KẸO.

Thân chào
Cuối cùng cũng xong. Khá vất vả. Bạn dùng thử xem sao nhé:
PHP:
Function ChiaKeo(QuyCachCan As String, SoLuongCan As Integer, BangQuyCach As Range, CotSoLuong As Integer, TT As Integer, Optional SL As Boolean = False) As String
Dim K As Integer, STT As Integer, Rng As Range, Tong
Dim QuyCach()
    STT = 0
    K = Application.WorksheetFunction.CountIf(BangQuyCach.Resize(, 1), QuyCachCan & "*")
ReDim Preserve QuyCach(K - 1)
    For Each cll In BangQuyCach.Resize(, 1)
        If InStr(cll.Value, QuyCachCan) > 0 Then
            QuyCach(STT) = CInt(Right(cll.Value, Len(cll.Value) - InStr(cll.Value, "-")))
            STT = STT + 1
        End If
    Next
    For i = 1 To K
        Set Rng = BangQuyCach.Resize(, 1).Find(what:=QuyCachCan & "-" & Application.WorksheetFunction.Small(QuyCach(), i), After:=BangQuyCach.Cells(BangQuyCach.Rows.Count, 1), LookAt:=xlWhole)
        Tong = Tong + Rng.Offset(, CotSoLuong - 1).Value
        If Tong >= SoLuongCan Then
        K = i
        Exit For
        End If
    Next
        If TT <= K Then Set Rng = BangQuyCach.Resize(, 1).Find(what:=QuyCachCan & "-" & Application.WorksheetFunction.Small(QuyCach(), TT), LookAt:=xlWhole)
        If TT < K Or (TT = K And Tong <= SoLuongCan) Then
            ChiaKeo = IIf(SL = True, Rng.Offset(, CotSoLuong - 1).Value, Rng.Value)
        ElseIf TT = K And Tong > SoLuongCan Then
            ChiaKeo = IIf(SL = True, SoLuongCan + Rng.Offset(, CotSoLuong - 1).Value - Tong, Rng.Value)
        ElseIf TT = K + 1 And Tong < SoLuongCan Then
            ChiaKeo = IIf(SL = True, Tong - SoLuongCan, QuyCachCan)
        End If
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Xin được cám ơn tất cả đã tham gia "GOM KẸO"

Sa_DQ đã viết:
Lúc đầu, tác giả iêu cầu làm UDF, nên mình làm theo & vả chăng lúc đó chưa thấy mức độ khó của nó như giờ.

Nói như BAP thì hàm khó hơn SUB; Vậy nên ta làm SUB trước, OK với chú!
------
Lúc đầu tôi có xin hỏi về hàm tự tạo, còn bây giờ tôi vẫn xin hỏi về hàm tự tạo thôi.

To: Sa_DQ : anh mà thấy khó ....thì tôi tiêu.
( Để làm được có cần sửa cấu trúc dữ liệu không ? Tôi sẽ sửa )
------

To : huuthang_bd : bạn cho tôi thời gian test
------

Không biết sửa dử liệu như thế này có dể làm hơn không ? Mong các bạn xem
Đính kèm file sửa
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi sửa lại một chút. Khai báo lại các biến cho hợp lý.
PHP:
Function ChiaKeo(QuyCachCan As String, SoLuongCan As Double, BangQuyCach As Range, CotSoLuong As Byte, TT As Integer, Optional SL As Boolean = False) As String
Dim K As Integer, STT As Integer, Rng As Range, Tong As Double
Dim QuyCach() As Variant
    STT = 0
    K = Application.WorksheetFunction.CountIf(BangQuyCach.Resize(, 1), QuyCachCan & "*")
ReDim Preserve QuyCach(K - 1)
    For Each cll In BangQuyCach.Resize(, 1)
        If InStr(cll.Value, QuyCachCan) > 0 Then
            QuyCach(STT) = CInt(Right(cll.Value, Len(cll.Value) - InStr(cll.Value, "-")))
            STT = STT + 1
        End If
    Next
    For i = 1 To K
        Set Rng = BangQuyCach.Resize(, 1).Find(what:=QuyCachCan & "-" & Application.WorksheetFunction.Small(QuyCach(), i), After:=BangQuyCach.Cells(BangQuyCach.Rows.Count, 1), LookAt:=xlWhole)
        Tong = Tong + Rng.Offset(, CotSoLuong - 1).Value
        If Tong >= SoLuongCan Then
        K = i
        Exit For
        End If
    Next
        If TT <= K Then Set Rng = BangQuyCach.Resize(, 1).Find(what:=QuyCachCan & "-" & Application.WorksheetFunction.Small(QuyCach(), TT), LookAt:=xlWhole)
        If TT < K Or (TT = K And Tong <= SoLuongCan) Then
            ChiaKeo = IIf(SL = True, Rng.Offset(, CotSoLuong - 1).Value, Rng.Value)
        ElseIf TT = K And Tong > SoLuongCan Then
            ChiaKeo = IIf(SL = True, SoLuongCan + Rng.Offset(, CotSoLuong - 1).Value - Tong, Rng.Value)
        ElseIf TT = K + 1 And Tong < SoLuongCan Then
            ChiaKeo = IIf(SL = True, Tong - SoLuongCan, QuyCachCan)
        End If
End Function
----------------------
Nếu có thể bạn tách Quy cách và Số kiện ra làm 2 cột. Như thế sẽ đơn giản hơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thêm một chút nổ lực nữa, và đây là thành quả

PHP:
Option Explicit:           Option Base 1
Function PhatKeo(LookUpRange As Range, QuiCach As String, SoLuong As Long)
 Dim Temp, Clls As Range, Rng As Range, LRng As Range
 Dim Dem As Byte, DDai As Byte, Rws As Long, Con As Long
 
 Rws = LookUpRange.Rows.Count:            ReDim MDL(Rws, 2)
 ReDim KKK(Rws) As Long:                  DDai = Len(QuiCach)
 Set LRng = LookUpRange.Cells(1, 1).Resize(Rws)
 For Each Clls In LRng
   If InStr(Clls.Value, QuiCach) > 0 Then
      Dem = Dem + 1
      KKK(Dem) = Right(Clls.Value, Len(Clls.Value) - DDai - 1)
   End If
 Next Clls
 DDai = 0
 Do
   DDai = DDai + 1
   For Con = 1 To (Dem - 1)
      If KKK(Con) > KKK(Con + 1) Then
         Temp = KKK(Con):              KKK(Con) = KKK(Con + 1)
         KKK(Con + 1) = Temp
      End If
   Next Con
 Loop While DDai < 7
 Con = 0
 For Rws = 1 To Dem
   Set Clls = LRng.Find(QuiCach & "-" & CStr(KKK(Rws)), , xlFormulas, xlWhole)
   If Not Clls Is Nothing Then
      MDL(Rws, 1) = Clls.Value
      Con = Clls.Offset(, 2).Value
      If Con <= SoLuong Then
         MDL(Rws, 2) = Con
         SoLuong = SoLuong - Con
      Else
         MDL(Rws, 2) = SoLuong:           SoLuong = 0
         Exit For
      End If
   End If
 Next Rws
 If SoLuong > 0 Then
'   Rws = 1 + Rws ' 
   MDL(Rws, 1) = QuiCach:                 MDL(Rws, 2) = -SoLuong
 End If 
 PhatKeo = MDL
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi sửa lại một chút. Khai báo lại các biến cho hợp lý.
------
Nếu có thể bạn tách Quy cách và Số kiện ra làm 2 cột. Như thế sẽ đơn giản hơn.

Tôi biết bạn mệt !$@!! với "GOM KẸO", thành thật xin lỗi.
Hàm của bạn "ngộ" quá tôi không hiểu nổi, nhưng thấy có lý và thực tế lắm.
Tôi đứng trong file của bạn, nhưng từ 1 sheet khác, cùng 1 vị trí, gọi hàm và được kết quả:

E7=ChiaKeo($E$4,$F$4,ChiaKeo!$A$3:$A$10,3,ROW(A1))
F7=ChiaKeo($E$4,$F$4,ChiaKeo!$A$3:$A$10,3,ROW(A1),1)

Nhờ bạn hướng dẫn:
$A$3:$A$10 : Vùng trong cột chứa quy cách ? (a)
3 : Cột thứ 3 tính từ cột chứa quy cách ? (b)
ROW(A1),ROW(A1),1 là sao ? (c)

* Có cách nào khắc phục, hoặc làm thế nào chứ không lẽ fill công thức từ A1:A theo dòng chứa quy cách ( thực tế >= 3000 dòng ) , giải quyết được vấn đề này thì khả thi hơn, không biết viết như thế bạn có hiểu không ?

Mong tin bạn.
 
Upvote 0
Tôi biết bạn mệt !$@!! với "GOM KẸO", thành thật xin lỗi.
Hàm của bạn "ngộ" quá tôi không hiểu nổi, nhưng thấy có lý và thực tế lắm.
Tôi đứng trong file của bạn, nhưng từ 1 sheet khác, cùng 1 vị trí, gọi hàm và được kết quả:

E7=ChiaKeo($E$4,$F$4,ChiaKeo!$A$3:$A$10,3,ROW(A1))
F7=ChiaKeo($E$4,$F$4,ChiaKeo!$A$3:$A$10,3,ROW(A1),1)

Nhờ bạn hướng dẫn:
$A$3:$A$10 : Vùng trong cột chứa quy cách ? (a)
3 : Cột thứ 3 tính từ cột chứa quy cách ? (b)
ROW(A1),ROW(A1),1 là sao ? (c)

* Có cách nào khắc phục, hoặc làm thế nào chứ không lẽ fill công thức từ A1:A theo dòng chứa quy cách ( thực tế >= 3000 dòng ) , giải quyết được vấn đề này thì khả thi hơn, không biết viết như thế bạn có hiểu không ?

Mong tin bạn.
Tôi viết UDF mà quên hướng dẫn bạn cú pháp. Sơ xuất quá. Để tôi giải thích sơ sơ về cú pháp của hàm này:

Cú pháp:
Mã:
=ChiaKeo(MaQuyCach,SoLuong,BangTonKho,CotSoLuong,ThuTuKien,[SL])
MaQuyCach: Là mã quy cách bạn cần tính
SoLuong: Là số lượng bạn cần lấy ứng với MaQuyCach
BangTonKho: Là bảng tồn kho, với cột đầu tiên là Mã Quy Cách
CotSoLuong: Là số thứ tự của cột số lượng tồn trong Bảng Tồn Kho
ThuTuKien: Là thứ tự kiện hàng muốn lấy trong Bảng Tồn Kho. Tham số này bạn cứ cho =Row(A1) ở dòng đầu tiên là được. Giải thích một chút về tham số này: Vì yêu cầu của bạn là trả về một danh sách. Bình thường phải dùng hàm mảng nhưng tôi không dùng hàm mảng và thêm tham số này để xác định từng Mã Quy Cách cần lấy. Ví dụ, bạn cần 100 sản phẩm có quy cách 0000. Hàm sẽ dò trong Bảng Tồn Kho, tìm ra kiện hàng mang số hiệu nhỏ nhất của Quy cách này, đó là kiện hàng thứ nhất. Lấy hết kiện hàng thứ nhất mà chưa đủ số lượng sẽ lấy tiếp kiện hàng thứ 2. Tham số này sẽ giúp hàm phân biệt được bạn đã lấy đến kiện hàng thứ mấy rồi và cần lấy tiếp kiện hàng thứ mấy.
[SL]: Dùng để xác định bạn muốn lấy Tên Kiện Hàng hay muốn lấy số lượng:
- SL = 0: Hàm trả về tên kiện hàng
- SL = 1: Hàm trả về số lượng cần lấy của kiện hàng
* Đây là tham số tùy chọn. Mặc định của tham số này là 0. Nếu bạn không nhập tham số này hàm sẽ ngầm hiểu bạn muốn lấy Tên kiện hàng. Như trong file ví dụ: Cột E lấy tên kiện hàng nên tôi bỏ qua tham số này. Cột F lấy số lượng nên tôi cho tham số này bằng 1.

Chưa hiểu ý bạn chỗ này:
Có cách nào khắc phục, hoặc làm thế nào chứ không lẽ fill công thức từ A1:A theo dòng chứa quy cách ( thực tế >= 3000 dòng ) , giải quyết được vấn đề này thì khả thi hơn, không biết viết như thế bạn có hiểu không ?
 
Lần chỉnh sửa cuối:
Upvote 0
Chưa hiểu ý bạn chỗ này:
* Có cách nào khắc phục, hoặc làm thế nào chứ không lẽ fill công thức từ A1:A theo dòng chứa quy cách ( thực tế >= 3000 dòng ) , giải quyết được vấn đề này thì khả thi hơn, không biết viết như thế bạn có hiểu không ?
------
Rất mong bạn xem file đính kèm sẻ rõ hơn => --=--
 

File đính kèm

Upvote 0
------
Rất mong bạn xem file đính kèm sẻ rõ hơn => --=--
*Bạn phải fill bằng tay cho đến khi ra kết quả <0. Làm như thế có đúng không? nếu đúng có cách gì trị không hả bạn?
Đúng. Vì là công thức nên kết quả chỉ trả về ô bạn nhập công thức. Các ô bên dưới bạn phải fill bằng tay.

Muốn khắc phục điều này bạn có thể fill công thức xuống 200, 300 dòng gì đó, khi lấy hết số lượng kết quả sẽ trả về chuỗi rỗng. Nhưng cách này không hiệu quả do file phải tính thêm nhiều ô chứa công thức không cần thiết.

Tôi làm cách khác. Thêm tùy chọn cho tham số SL. Nếu SL = 2 hàm sẽ trả về kết quả dạng a/b. Với a là số thứ tự dòng hiện tại trong bảng kết quả, b là tổng số dòng trong bảng kết quả. Bạn có thể dựa vào b để biết phải fill công thức đến đâu là đủ. Bạn xem trong file để hiểu rõ hơn. Cột STT này nếu không cần thiết bạn chỉ nhập cho dòng đầu tiên để biết cần fill bao nhiêu dòng thôi. Fill xuống sẽ làm file thêm nhiều công thức mà không có tác dụng.
*Hàm cho ra giá trị text?
Lúc khai báo hàm tôi không để ý. Xóa khai báo kiểu dữ liệu của ChiaKeo là được. Đã sửa lại trong file.
* Hộp thọai hàm không cho nhập ROW(A1),1?
Tôi dùng Excel 2007 và thấy nhập bình thường mà. Bạn kiểm tra lại xem. Kéo thanh Scrol bên phải xuống xem có không.
 

File đính kèm

Upvote 0
Tôi dùng Excel 2007 và thấy nhập bình thường mà. Bạn kiểm tra lại xem. Kéo thanh Scrol bên phải xuống xem có không.

Tôi xài Excel 2003
Chọn D7, gọi hàm, nhập trực tiếp vào hộp thọai : ROW(A1),2 (không có nháy kép), kết quả :

Mã:
Trên thanh fx
fx=ChiaKeo($E$4,$F$4,$A$3:$C$31,3[B],"ROW(A1),2",[/B]2) => Tự điền vào dấu nháy
 
Gía trị cell
D7= #VALUE

Hàm của bạn "ngộ quá", nhưng mà thực tế, rất dễ cho người sử dụng.
Nếu được có thể thay ROW => bằng 1 ký tự khác cho dể đánh không => vd :R
Sẽ thông báo sau.

Chúc bạn 1 ngày cuối tuần vui và mong tin.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom