giúp tôi_ tìm dữ liệu ở sheet gần nhất và lấy điền vào sheet hiện tại_cám ơn (1 người xem)

Liên hệ QC

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

ngoc_thich_excel

Thành viên mới
Tham gia
11/8/13
Bài viết
5
Được thích
0
Nghề nghiệp
đang buồn vì không bít mình thích nghề gì, phù hợp
mình tên Ngọc, rất vui và rất mong dc sự giúp đỡ của các bạn.

Khó khăn của mình là đặt công thức cho cột "giá tham khảo" ly d liu "đơn giá" gn nht t các sheet trước làm giá tham kho cho đơn háng hin ti sheet hin ti

File mình đang làm là đánh đơn hàng cho khách hàng sỉ

Bởi vì nhiều khi bán cho khách hàng này giá này, nhưng bán cho khách hàng giá khác, rồi lại không nhớ bán cho kh giá nào,

(cũng vì đặc trưng, tính chất ngành hàng có số lượng hàng hoá nhiều và yêu cầu chủ doanh nghiệp không dùng giá bán cố định, không thể nhân % từ giá gốc, trước đây chủ doanh nghiệp thường tự xem giá gốc và tự điền thủ công vào giá bán)

Nên tôi muốn làm môt cột giá tham khảo, cột giá này sẽ cho giá tham khảo cho từng món hàng ở từng dòng

(giống như bán hàng cho khách hàng đó ngày hôm trước bán 10 cái bánh giá 4.500đ, hôm nay quên mất bán giá 4.800đ, người ta la làng@$@!^%@$@!^%)


tên file: khách hàng Chiến

TOA 6

KHÁCH HÀNG: Anh Chiến (cầu chà và)
-----------------------------------------------------------------------------
TÊN HÀNG SỐ LƯỢNG GIÁ THAM KHO ĐƠN GIÁ THÀNH TIỀN
-----------------------------------------------------------------------------
KEO 502-----7-----------15,500 ----> 15,500 -> 108,500
bìa lá da----10-----------23,800
...

_________________________
toa1/ toa2/ toa3/ toa4/ toa 5/ toa6


Giá tham khảo của "keo 502" là giá tìm từ các toa truớc, tìm toa gần nhất có món hàng mang tên "keo 502" lấy đơn giá đó,

ví dụ "công thức giá tham khảo keo 502" tìm toa 5 không thấy "keo 502", toa 4 không thấy keo 502, đến toa 3 thấy "keo 502", lập tức lấy giá bên cột "đơn giá" chép vào giá tham khảo của món hàng "keo 502" ở sheet hiện tại - toa 6 (không tìm dc thì thôi, cho khoảng trắng)

(ở các toa hàng đầu tiên sẽ không có cột giá tham khảo, vì khi có khá nhiều toa hàng thì mới xuất hiện lại tên hàng đó, mới có giá tham khảo cho món hàng đó)

tôi nghĩ dùng hàm iferror và Vloopkup nhưng tôi thấy quá dài, chưa kể cả cột giá tham khảo đều dùng thì công thức quá nhiều

bạn có cách nào tốt không, xem giúp tôi nhé.

(sau khi có giá tham khảo sẽ đánh tay vào đơn giá, một là bằng đúng giá tham khảo, hai là sẽ ghi giá khác nếu giá hôm nay biến động)

Cám ơn rất nhiều!
 

File đính kèm

Bạn xem trong file

Mình làm bằng macro đó nhe;

Hãy chọn/kích hoạt 1 trang tính cuối cần tìm & cho chạy macro
 

File đính kèm

Upvote 0
mình tên Ngọc, rất vui và rất mong dc sự giúp đỡ của các bạn.

Khó khăn của mình là đặt công thức cho cột "giá tham khảo" ly d liu "đơn giá" gn nht t các sheet trước làm giá tham kho cho đơn háng hin ti sheet hin ti

Cám ơn rất nhiều!

file này chỉ tìm được từ sheet1-->sheet6, sheet nào có thì nó lượm qua, chưa làm ngược lại được......hìihì (bạn yếu cầu là dò ngược từ sheet 5 trở lại sheet1?)
tôi sũng đàng thử, nếu tạo được một mảng ngược từ sheet5--->sheet1 thì chắc làm được
 

File đính kèm

Upvote 0
mình tên Ngọc, rất vui và rất mong dc sự giúp đỡ của các bạn.

Khó khăn của mình là đặt công thức cho cột "giá tham khảo" ly d liu "đơn giá" gn nht t các sheet trước làm giá tham kho cho đơn háng hin ti sheet hin ti

File mình đang làm là đánh đơn hàng cho khách hàng sỉ

Bởi vì nhiều khi bán cho khách hàng này giá này, nhưng bán cho khách hàng giá khác, rồi lại không nhớ bán cho kh giá nào,

(cũng vì đặc trưng, tính chất ngành hàng có số lượng hàng hoá nhiều và yêu cầu chủ doanh nghiệp không dùng giá bán cố định, không thể nhân % từ giá gốc, trước đây chủ doanh nghiệp thường tự xem giá gốc và tự điền thủ công vào giá bán)

Nên tôi muốn làm môt cột giá tham khảo, cột giá này sẽ cho giá tham khảo cho từng món hàng ở từng dòng

(giống như bán hàng cho khách hàng đó ngày hôm trước bán 10 cái bánh giá 4.500đ, hôm nay quên mất bán giá 4.800đ, người ta la làng@$@!^%@$@!^%)


tên file: khách hàng Chiến

TOA 6

KHÁCH HÀNG: Anh Chiến (cầu chà và)
-----------------------------------------------------------------------------
TÊN HÀNG SỐ LƯỢNG GIÁ THAM KHO ĐƠN GIÁ THÀNH TIỀN
-----------------------------------------------------------------------------
KEO 502-----7-----------15,500 ----> 15,500 -> 108,500
bìa lá da----10-----------23,800
...

_________________________
toa1/ toa2/ toa3/ toa4/ toa 5/ toa6


Giá tham khảo của "keo 502" là giá tìm từ các toa truớc, tìm toa gần nhất có món hàng mang tên "keo 502" lấy đơn giá đó,

ví dụ "công thức giá tham khảo keo 502" tìm toa 5 không thấy "keo 502", toa 4 không thấy keo 502, đến toa 3 thấy "keo 502", lập tức lấy giá bên cột "đơn giá" chép vào giá tham khảo của món hàng "keo 502" ở sheet hiện tại - toa 6 (không tìm dc thì thôi, cho khoảng trắng)

(ở các toa hàng đầu tiên sẽ không có cột giá tham khảo, vì khi có khá nhiều toa hàng thì mới xuất hiện lại tên hàng đó, mới có giá tham khảo cho món hàng đó)

tôi nghĩ dùng hàm iferror và Vloopkup nhưng tôi thấy quá dài, chưa kể cả cột giá tham khảo đều dùng thì công thức quá nhiều

bạn có cách nào tốt không, xem giúp tôi nhé.

(sau khi có giá tham khảo sẽ đánh tay vào đơn giá, một là bằng đúng giá tham khảo, hai là sẽ ghi giá khác nếu giá hôm nay biến động)

Cám ơn rất nhiều!

Bạn có thể đặt tên cho các sheet tùy ý, không nhất thiết là TOA xyz. Nhưng phải tuân thủ các nguyên tắc sau:

1. Các sheet sắp xếp theo thứ tự từ cũ nhất tới mới nhất - thứ tự trên thẻ sheet
2. Vì sub không là tổng quát nên các cột phải có thứ tự như nhau trên mỗi sheet và dữ liệu từ ô C7.
3. Bạn chọn sheet bất kỳ rồi Alt + F11 --> chạy sub GiaThamKhao
-----------
Mã:
Sub GiaThamKhao()
Dim Arr, tmp, index As Long, k As Long, ra As Long, rt As Long, bFind As Boolean, ten As String
    For index = 1 To Sheets.count
        If Sheets(index).Name = ActiveSheet.Name Then Exit For
    Next index
    Arr = Sheets(index).Range("C7:C" & Sheets(index).Range("C65000").End(xlUp).Row).Resize(, 4).Value
    For ra = 1 To UBound(Arr)
        ten = UCase(Arr(ra, 1))
        bFind = False
        For k = index - 1 To 1 Step -1
            tmp = Sheets(k).Range("C7:C" & Sheets(k).Range("C65000").End(xlUp).Row).Resize(, 4).Value
            For rt = 1 To UBound(tmp)
                If UCase(tmp(rt, 1)) = ten Then
                    Arr(ra, 3) = tmp(rt, 4)
                    bFind = True
                    Exit For
                End If
            Next rt
            If bFind Then Exit For
        Next k
    Next ra
    
    ActiveSheet.Range("C7").Resize(UBound(Arr), 4).Value = Arr
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
file này chỉ tìm được từ sheet1-->sheet6, sheet nào có thì nó lượm qua, chưa làm ngược lại được......hìihì (bạn yếu cầu là dò ngược từ sheet 5 trở lại sheet1?)
tôi sũng đàng thử, nếu tạo được một mảng ngược từ sheet5--->sheet1 thì chắc làm được

file này chỉ tìm được từ sheet1-->sheet6, sheet nào có thì nó lượm qua, chưa làm ngược lại được......hìihì (bạn yếu cầu là dò ngược từ sheet 5 trở lại sheet1?)
tôi sũng đàng thử, nếu tạo được một mảng ngược từ sheet5--->sheet1 thì chắc làm được

Mình quên nói sở dĩ mình tìm ngược từ sheet 5 trở về sheet 1 là vì tìm theo thứ tự thời gian gần với hiện tại nhất, như vậy mới đảm bảo giá tham khảo là giá đã tính cho kh mới nhất, gần đây nhất.

MỖI SHEET là 1 toa, nên sẽ có thêm sheet 7, sheet 8, sheet 9,.... (toa 7, toa 8, toa 9,...)

như vậy chắc là dùng công thức sẽ khó khăn, vì khi phát sinh sheet mới, công thức phải thay đổi...

mình rất cám ơn ChanhTQ@ và slwtom đã giúp đỡ, file mình đang làm rất quan trọng với mình vì bít đâu nó sẽ thay đổi dc cách làm toa thủ công sang máy tính, cải thiện tốc độ làm việc của hộ kinh doanh chăng?!!!

Nhưng mấy ngày nay mún hỏi 2 bạn mà ko zám, là vì mình ko bít gì về code vba, mình có sách VBA nhưng thấy khô (khan) quá (chắc là chỉ đối với mình thôi,hu|||||) (nói thẳng ra là dốt không zám hỏi,hu) (mình cố gắng đọc lắm nhưng thấy môn này khô quá)

mình mún hỏi bạn slwtom

file mình đang làm đang trong bước đầu thực hiện, nên nếu mai mốt mình có chỉnh sửa, thay đổi cột hoặc tên cột thì sao, bạn có thể tô sáng cái cần thay đổi trên code vba của bạn ko?

nếu mình thêm nhiều sheet cho các toa sau thì ko vấn đề chứ?

mình cũng mún hỏi ChanhTQ@ là bạn có thể tô sáng các chỗ cần thay đổi khi mình đổi cột,... dc ko? và mình thử thêm tới sheet 9, 10 thì bị lỗi
 
Lần chỉnh sửa cuối:
Upvote 0
mình mún hỏi bạn slwtom

file mình đang làm đang trong bước đầu thực hiện, nên nếu mai mốt mình có chỉnh sửa, thay đổi cột hoặc tên cột thì sao bạn có thể tô sáng cái cần thay đổi trên code vba của bạn ko?

nếu mình thêm nhiều sheet cho các toa sau thì ko vấn đề chứ?

Nếu code chỉ dùng cho mấy sheet giả lập thì mất công viết nó làm gì?

1. Số sheet không hạn chế, nhưng cấu trúc của mọi sheet giống nhau. Tức hiện thời là: ô Tên Hàng đầu tiên là như nhau ở mỗi sheet, số cột và thứ tự của chúng trong các sheet là như nhau. Vậy có thể thay đổi nhưng phải giữ đúng cấu trúc đó.

2. Phải sắp xếp các sheet theo thứ tự từ cũ nhất tới mới nhất.

3.
Mã:
Sub GiaThamKhao(ByVal cotTH As String, dongStart As Long, cotDGTK As Long, ByVal cotDG As Long)
'    cotTH: cot Ten Hang, vd. "C"
'    dongStart: chi so dong cua Ten Hang dau tien, vd. 7
'    cotDGTK: chi so cua cot Don Gia Tham Khao tinh tu cot Ten hang, vd. 3 (cot E - tinh tu cot C)
'    cotDG: chi so cua cot Don Gia tinh tu cot Ten hang, vd. 4 (cot E - tinh tu cot C)
Dim Arr, tmp, index As Long, k As Long, ra As Long, rt As Long, bFind As Boolean, ten As String, maxIndex As Long
    maxIndex = WorksheetFunction.Max(cotDGTK, cotDG)
    
    For index = 1 To Sheets.count
        If Sheets(index).Name = ActiveSheet.Name Then Exit For
    Next index
    Arr = Sheets(index).Range(cotTH & dongStart & ":C" & Sheets(index).Range(cotTH & "65000").End(xlUp).Row).Resize(, maxIndex).Value
    For ra = 1 To UBound(Arr)
        ten = UCase(Arr(ra, 1))
        bFind = False
        For k = index - 1 To 1 Step -1
            tmp = Sheets(k).Range(cotTH & dongStart & ":C" & Sheets(k).Range(cotTH & "65000").End(xlUp).Row).Resize(, maxIndex).Value
            For rt = 1 To UBound(tmp)
                If UCase(tmp(rt, 1)) = ten Then
                    Arr(ra, cotDGTK) = tmp(rt, cotDG)
                    bFind = True
                    Exit For
                End If
            Next rt
            If bFind Then Exit For
        Next k
    Next ra
    
    ActiveSheet.Range(cotTH & dongStart).Resize(UBound(Arr), maxIndex).Value = Arr
End Sub

Sub TimGiaThamKhao()
    [COLOR=#ff0000]GiaThamKhao "C", 7, 3, 4[/COLOR]
End Sub

3. Việc của bạn là gọi sub TimGiaThamKhao.

Phần đỏ đỏ có cú pháp: GiaThamKhao cotTH, dongStart, cotDGTK, cotDG

- cotTH: cột Tên Hàng
- dongStart: chỉ số dòng của Tên Hàng đầu tiên
- cotDGTK: chỉ số của cột Đơn Giá Tham Khảo tính từ cột Tên Hàng
- cotDG: chỉ số của cột Đơn Giá tính từ cột Tên Hàng

Trong trường hợp hiện thời thì gọi như dòng đỏ đỏ.

Chú ý là với code thì cột Đơn Giá đứng sau hay đứng trước cột Đơn Giá Tham Khảo không quan trọng.

Thêm nữa. Code không nhất thiết phải gọi từ sheet mới nhất. Bạn có thể gọi từ sheet bất kỳ để tìm DGTK cho sheet đó. Ví dụ ngày mai bạn thêm 4 sheet nữa thành 10 sheet nhưng chỉ có 1 sheet (sheet7) là có dữ liệu còn 3 sheet kia (8, 9, 10) thì trống để dùng trong tương lai. Lúc đó bạn có thể đứng tại sheet7 và chạy code.

Khả năng gọi từ sheet bất kỳ là quan trọng. Bạn hãy tưởng tượng trường hợp bạn có 6 sheet cần tìm DGTK như bây giờ và 2 sheet nữa hoàn toàn khác dùng cho việc khác. Khi đó bạn cho 6 sheet cần DGTK đứng đầu theo thứ tự từ cũ nhất tới mới nhất. Và 2 sheet còn lại luôn đứng cuối. Lúc đó bạn chỉ cần đứng ở sheet mới nhất (không là sheet cuối cùng) và chạy code. Khi thêm sheet mới nhất thì cho nó đứng trước 2 sheet "kia". Vì tìm kiếm luôn "đi" về đầu nên 2 sheet đứng cuối sẽ không được kiểm tra.
 
Lần chỉnh sửa cuối:
Upvote 0
mình rất cám ơn ChanhTQ@ và slwtom đã giúp đỡ, file mình đang làm rất quan trọng với mình vì bít đâu nó sẽ thay đổi dc cách làm toa thủ công sang máy tính, cải thiện tốc độ làm việc của hộ kinh doanh chăng?!!!

Nhưng mấy ngày nay mún hỏi 2 bạn mà ko zám, là vì mình ko bít gì về code vba, mình có sách VBA nhưng thấy khô (khan) quá (chắc là chỉ đối với mình thôi,hu|||||) (nói thẳng ra là dốt không zám hỏi,hu) (mình cố gắng đọc lắm nhưng thấy môn này khô quá)

mình mún hỏi bạn slwtom

file mình đang làm đang trong bước đầu thực hiện, nên nếu mai mốt mình có chỉnh sửa, thay đổi cột hoặc tên cột thì sao bạn có thể tô sáng cái cần thay đổi trên code vba của bạn ko?

nếu mình thêm nhiều sheet cho các toa sau thì ko vấn đề chứ?

mình cũng mún hỏi ChanhTQ@ là bạn có thể tô sáng các chỗ cần thay đổi khi mình đổi cột,... dc ko? và mình thử thêm tới sheet 9, 10 thì bị lỗi


Theo mình, tốt nhất bạn cần biết í nghĩa các dòng lệnh trong những macro người khác đã viết cho bạn.
Việc này có thể bằng cách sau:
Bạn chép các mã codo đó & đem đến BOX thích hợp của "Lập trình" & nhờ diễn dịch & giải thích các câu lệnh;

Dần dần với cách này mình tin bạn sẽ có thực tế bổ sung cho những kiến thức khô khan mà bạn đã & đang dọc trong sách lập trình.

Chúc thành công nhe!
 
Upvote 0

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

Back
Top Bottom