Tính đơn giá theo bảng điều kiện

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

taphets

Thành viên mới
Tham gia
9/4/16
Bài viết
34
Được thích
0
Dear anh chị,

Em có 1 bảng điều kiện và đơn giá tương ứng. Em cần code đối chiếu giá trị L với bảng điều kiện để ra đơn giá tương ứng. Em chỉ nghĩ được cách dùng If lồng, nhưng rất dài và bất tiện nếu sau này thay đổi bảng điều kiện. Anh chị giúp đỡ em cách code khác linh hoạt hơn ạ. Em cảm ơn.
 

File đính kèm

  • Book1.xlsx
    10.1 KB · Đọc: 1
Dear anh chị,

Em có 1 bảng điều kiện và đơn giá tương ứng. Em cần code đối chiếu giá trị L với bảng điều kiện để ra đơn giá tương ứng. Em chỉ nghĩ được cách dùng If lồng, nhưng rất dài và bất tiện nếu sau này thay đổi bảng điều kiện. Anh chị giúp đỡ em cách code khác linh hoạt hơn ạ. Em cảm ơn.
Bạn muốn sử dụng hàm hay là code vậy? kết quả mẫu là như nào thế?
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Dear anh chị,

Em có 1 bảng điều kiện và đơn giá tương ứng. Em cần code đối chiếu giá trị L với bảng điều kiện để ra đơn giá tương ứng. Em chỉ nghĩ được cách dùng If lồng, nhưng rất dài và bất tiện nếu sau này thay đổi bảng điều kiện. Anh chị giúp đỡ em cách code khác linh hoạt hơn ạ. Em cảm ơn.

Mình cũng chưa rõ yêu cầu bài, bạn thử công thức xem có đúng ý bạn ko nhé

E3=VLOOKUP(D3,--CHOOSE({1,2},SUBSTITUTE(RIGHT($A$3:$A$51,4),",","."),$B$3:$B$51),2,0)

Thân
 

File đính kèm

  • Book1-10.xlsx
    11.3 KB · Đọc: 5
Upvote 0
Bạn thử tìm cách dùng Vlookup không xem sao.

Dạ, thật sự em cũng suy nghĩ mãi mà vẫn chưa thể làm theo cách mà bác gợi ý được ạ.

Em chỉ nghĩ được thêm mỗi cách này

E3=INDEX($B$3:$B$51,MATCH(D3,--SUBSTITUTE(RIGHT($A$3:$A$51,4),",","."),0))

Trình độ em còn thấp kém, có gì mong bác chỉ bảo giúp em để em mở mang học hỏi thêm kiến thức ạ.

Em chân thành cảm ơn bác rất nhiều.
 
Upvote 0
1. Làm lại bảng dò tù bé đến lớn...
2. Vlookup với tham số thứ 4 là 1
Hình như của bạn không giống thế này
1721293213705.png
Mình cũng chưa rõ yêu cầu bài, bạn thử công thức xem có đúng ý bạn ko nhé
Dạ, thật sự em cũng suy nghĩ mãi mà vẫn chưa thể làm theo cách mà bác gợi ý được ạ.
Mình cũng định bảo, nhưng bạn thông cảm nhé, mình không hỗ trợ những trường hợp viết tắt hoặc dùng tiếng Tây bồi.
 
Upvote 0
Hình như của bạn không giống thế này
View attachment 302454


Mình cũng định bảo, nhưng bạn thông cảm nhé, mình không hỗ trợ những trường hợp viết tắt hoặc dùng tiếng Tây bồi.

Dạ vâng em xin lỗi bác vì thiếu sót này ạ, mong bác thông cảm ạ

Em cũng mới nghĩ thêm 1 công thức nữa ạ,

E3=VLOOKUP(D3,IF({1,0},--SUBSTITUTE(RIGHT($A$3:$A$51,4),",","."),$B$3:$B$51),2,0)

Trình độ của em không thể nghĩ thêm được công thức nào mà dùng Vlookup nữa đâu ạ, có gì mong bác chỉ bảo thêm cho em ạ.

Trân trọng
 
Upvote 0
Bạn thử áp dụng:
E3 =VLOOKUP("*"&D3,$A$3:$B$51,2,0)

Dạ em chân thành cảm ơn bác rất nhiều, bác cho em bài học rất quý ạ.

Chỉ cần 1 thao tác nhỏ là đã giải quyết được 1 vấn đề lớn mà em ko nghĩ ra,

Nhưng bác ơi, dữ liệu cột A không đồng nhất, có lúc dùng dấu . và có lúc dùng dấu , để ngăn cách chữ số

Do vậy theo em nghĩ vẫn phải xử lý dữ liệu cột A bằng hàm SUBSTITUTE thì kết quả mới chính xác ạ

Mà khi đã phải xử lý dữ liệu cột A thì vẫn phải ghép mảng mới được ạ( đây là ý kiến cá nhân của em, có thể có nhiều cách khác không phải ghép mảng mà em chưa biết ạ )

Do vậy mà 1 số chỗ theo công thức của bác đang bị báo lỗi ạ

Dạ em mong bác chỉ bảo cho em thêm ạ

Trân trọng
 

File đính kèm

  • 123.jpg
    123.jpg
    55.5 KB · Đọc: 13
Upvote 0
Nhưng bác ơi, dữ liệu cột A không đồng nhất, có lúc dùng dấu . và có lúc dùng dấu , để ngăn cách chữ số
Do vậy mà 1 số chỗ theo công thức của bác đang bị báo lỗi ạ
Trích bài #3:
Một hàm Vlookup là đủ, nhưng cần điều chỉnh định dạng số đang tùm lum

Chắc bạn chưa để ý đến đoạn trên này rồi.
 
Upvote 0
Bài này không đơn giản VLookup đâu.
Ta chỉ tìm theo khoảng được khi bảng tra dùng cách sắp xếp tăng dần theo "luật bất thành văn": chỉ so khoảng >= chứ không so <=.
Vì vậy lúc tra cần thêm một mẹo nhỏ là cộng vào bảng tra một số rất nhỏ, hoặc trừ đi trị cần tìm một số rất nhỏ.
Đồng thời bảng tra cũng cần có thêm ô trị nhỏ nhất (ở đây là 0).

* Cột tra của bài này hoàn toàn không sử dụng được cho Excel. Bắt buộc phải dùng cột phụ hoặc name.
(phiên bản 365 có thể giải quyết được dễ dàng hơn)
 
Upvote 0
Em cảm ơn các anh đã giúp đỡ ạ. Em cũng xin lỗi vì file đưa lên chưa xem xét kỹ, làm định dạng . , bị loạn. Em xin phép gửi lại file chỉnh sửa ạ. Mong muốn của e là code VBA ạ. Và trong trường hợp số cần tra là dạng 2 chữ số thập phân nữa ạ (VD: 1.35)
Bài đã được tự động gộp:

Nếu không có đoạn tiếng Tây bồi ở đầu bài thì xong lâu rồi. Một hàm Vlookup là đủ, nhưng cần điều chỉnh định dạng số đang tùm lum
Anh thông cảm ạ. Đây chỉ là thói quen công việc chứ em k có ý gì đâu ạ. Mong anh giúp đỡ
 

File đính kèm

  • Book1.xlsx
    10.1 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Lâu không viết bài, hôm nay thử 1 bài trong lúc tâm trạng đang buồn.
Code này đúng được gần 100% với dữ liệu trong file. (những số trong cột D là <1 thì định dạng là #.## hoặc #.# sẽ cho kết quả đúng, nếu là #,## hoặc #,# sẽ cho kết quả ="Không thấy"). Mong các anh, chị, em ghé xem góp ý để hoàn thiện.

Mã:
Function Gia(ByVal Cell As Range)
Dim i&, Lr&, L, U, N
Dim Arr(), S, R As Range
Dim Dic As Object, Key, B As Boolean
B = False
With Sheet1
Lr = .Cells(10000, 1).End(3).Row
Arr = .Range("A3:B" & Lr).Value

Set R = Cell
'If InStr(R, ".") Then
    N = Application.WorksheetFunction.Substitute(Cell, ".", ",")
'Else
'    N = R * 1
'End If
End With
If Dic Is Nothing Then
    Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Arr)

        If i = 1 Then
            L = 0: U = Mid(Arr(i, 1), Len(Arr(i, 1)) - 2, 4): U = Application.WorksheetFunction.Substitute(U, ".", ",")
        Else
            L = U
            U = Mid(Arr(i, 1), Len(Arr(i, 1)) - 2, 4): U = Application.WorksheetFunction.Substitute(U, ".", ",")
        End If
        Key = Arr(i, 2): Dic(Key) = L & "|" & U
    Next i
End If
    For Each Key In Dic.Keys
        S = Split(Dic(Key), "|")
        If N > S(0) And N <= S(1) Then
                Gia = Key:  Exit For
        Else
                Gia = "Không thây"
        End If
    Next Key
    
End Function
Cú pháp trên sheet: E3 = Gia(D3)
Enter và fill
 
Upvote 0
...
Anh thông cảm ạ. Đây chỉ là thói quen công việc chứ em k có ý gì đâu ạ. Mong anh giúp đỡ
Tôi không ngại làm bài này. Nhưng cái chỗ bọi đậm trên làm tôi ngại. Trong công việc mà cũng có chuyện viết tắt nhiều đến mức thói quen sao?
 
Upvote 0
Bài này họ yêu cầu VBA, Công thức này chỉ để tham khảo. Xoá dấu <= trong bảng dò, rồi dùng:

=INDEX($B$3:$B$51,MATCH(TRUE,$A$3:$A$51>=D3,0))

Nếu không đúng, cần kết thúc bằng Ctrl + Shift + Enter.
 
Upvote 0
Em cảm ơn các anh đã giúp đỡ ạ. Em cũng xin lỗi vì file đưa lên chưa xem xét kỹ, làm định dạng . , bị loạn. Em xin phép gửi lại file chỉnh sửa ạ. Mong muốn của e là code VBA ạ. Và trong trường hợp số cần tra là dạng 2 chữ số thập phân nữa ạ (VD: 1.35)
Bài đã được tự động gộp:


Anh thông cảm ạ. Đây chỉ là thói quen công việc chứ em k có ý gì đâu ạ. Mong anh giúp đỡ
Test lại xem sao

---
Một vài giá trị nằm trong khoảng nào đó của bảng tra sẽ tạm lấy kết quả nội suy
Mã:
Option Explicit

Sub xxx()
Dim maxCD
Dim Bangtra() As Double
Dim Dk
Dim Kq
Dim lk, lk1
Dim i, j, k

maxCD = 5 * 100
ReDim Bangtra(maxCD)
With Sheet1
    For i = 3 To .Range("A3").End(xlDown).Row
        k = Right(.Range("A" & i), 3) * 100
        Bangtra(k) = .Range("B" & i)
    Next i
  
    Dk = .Range("D3", .Range("D3").End(xlDown))
    ReDim Kq(1 To UBound(Dk), 1 To 1)
    For i = 1 To UBound(Dk)
        k = Dk(i, 1) * 100
      
        If k > maxCD Then
            Kq(i, 1) = "sao lai dai the"
        Else
            If Bangtra(k) > 0 Then
                Kq(i, 1) = Bangtra(k)
            Else
                lk = 0
                For j = k To LBound(Bangtra) Step -1
                    If Bangtra(j) > 0 Then
                        lk = Bangtra(j)
                        Exit For
                    End If
                Next j
                lk1 = 0
                For j = k To UBound(Bangtra)
                    If Bangtra(j) > 0 Then
                        lk1 = Bangtra(j)
                        Exit For
                    End If
                Next j
              
                If lk > 0 And lk1 > 0 Then
                    j = k Mod 10
                    Kq(i, 1) = lk - (lk - lk1) * j \ 10
                Else
                    Kq(i, 1) = IIf(lk > lk1, lk, lk1)
                End If
            End If
        End If
    Next i
  
    .Range("E3").Resize(UBound(Kq), 1) = Kq
End With

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom