Dùng hàm phân tích thông tin sản phẩm

  • Thread starter ultimatum
  • Ngày gửi
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Xin chào các Anh Chị và các bạn,

Mình có 1 file sau và cần phân tích dữ liệu như trong Sheet 2, Nhưng vấn đề đặt ra là nếu 1 sản phẩm có nhiều giá thì không hiển thị được, các Anh Chị xem giúp có cách nào để: sản phẩm nào chỉ có 1 giá thì chỉ hiển thị 1 dòng, còn sản phẩm nào 2 giá thì hiển thị 2 dòng khác nhau. Hoặc là dùng được VBA thì càng tốt ạ.

Cảm ơn Anh Chị rất nhiều.
 

Đính kèm

  • Like
Reactions: eTax
kuldokk

kuldokk

Sơ cấp
26/4/14
39
11
8
31
Frankfurt am Main
www.youtube.com
Xin chào các Anh Chị và các bạn,

Mình có 1 file sau và cần phân tích dữ liệu như trong Sheet 2, Nhưng vấn đề đặt ra là nếu 1 sản phẩm có nhiều giá thì không hiển thị được, các Anh Chị xem giúp có cách nào để: sản phẩm nào chỉ có 1 giá thì chỉ hiển thị 1 dòng, còn sản phẩm nào 2 giá thì hiển thị 2 dòng khác nhau. Hoặc là dùng được VBA thì càng tốt ạ.

Cảm ơn Anh Chị rất nhiều.
mình đã xem qua file excel của bạn, không hiểu ý của bạn ở câu
"sản phẩm nào chỉ có 1 giá thì chỉ hiển thị 1 dòng, còn sản phẩm nào 2 giá thì hiển thị 2 dòng khác nhau."
là thế nào bởi vì trong file excel của bạn sản phẩm đó có giá như nhau và chỉ khác nhau về số lượng thôi, hay ý bạn là khác nhau về số lượng?
 
  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
mình đã xem qua file excel của bạn, không hiểu ý của bạn ở câu
"sản phẩm nào chỉ có 1 giá thì chỉ hiển thị 1 dòng, còn sản phẩm nào 2 giá thì hiển thị 2 dòng khác nhau."
là thế nào bởi vì trong file excel của bạn sản phẩm đó có giá như nhau và chỉ khác nhau về số lượng thôi, hay ý bạn là khác nhau về số lượng?
Dạ không anh ơi, anh xem phần em highlight đó, sản phẩm giống nhau nhưng giá khác nhau, nên em muốn nó hiển thị 2 dòng với 2 giá khác nhau, còn sản phẩm nào giá giống nhau hết thì chỉ hiển thị 1 dòng thôi, trong file excel em có đưa ra 1 ví dụ kế bên đó ạ.
 
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Đề bài của em như thế có thực hiện được không ạ, mong anh chị xem giúp.
 
HongViet

HongViet

Thành viên thân thiết
10/11/05
286
10
18
Đà nẵng
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [B3]) Is Nothing Then
  Dim sh As Worksheet, Rng As Range, sRng As Range
  Dim fAdd As String
  Set sh = ThisWorkbook.Worksheets("HHoa")
  Set Rng = sh.Range(sh.[e4], sh.[e65500].End(xlUp))
  [c3].Resize(Rng.Rows.Count, 5).ClearContents
  Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
  If Not sRng Is Nothing Then
  fAdd = sRng.Address
  Do
  With Cells(9999, "C").End(xlUp).Offset(1)
  .Resize(, 2).Value = sRng.Offset(, -3).Resize(, 2).Value
  .Offset(, 3).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
  End With
  Set sRng = Rng.FindNext(sRng)
  Loop While Not sRng Is Nothing And sRng.Address <> fAdd
  End If
 End If
End Sub
 

Đính kèm

  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [B3]) Is Nothing Then
  Dim sh As Worksheet, Rng As Range, sRng As Range
  Dim fAdd As String
  Set sh = ThisWorkbook.Worksheets("HHoa")
  Set Rng = sh.Range(sh.[e4], sh.[e65500].End(xlUp))
  [c3].Resize(Rng.Rows.Count, 5).ClearContents
  Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
  If Not sRng Is Nothing Then
  fAdd = sRng.Address
  Do
  With Cells(9999, "C").End(xlUp).Offset(1)
  .Resize(, 2).Value = sRng.Offset(, -3).Resize(, 2).Value
  .Offset(, 3).Resize(, 2).Value = sRng.Offset(, 1).Resize(, 2).Value
  End With
  Set sRng = Rng.FindNext(sRng)
  Loop While Not sRng Is Nothing And sRng.Address <> fAdd
  End If
End If
End Sub
Em cảm ơn rất nhiều,
Code của anh chạy rất tốt nhưng anh chỉnh lại giúp em chút xíu ạ, code của a liệt kê ra hết các sản phẩm luôn.

Em muốn những cái nào có tên và giá trùng nhau thì chỉ hiển thị 1 dòng chung thôi ạ, còn nếu Tên giống nhau mà giá khác nhau thì mới hiển thị 2 dòng khác nhau. (mục đích cho gọn form). Và hiện tại các mặt hàng list ra chưa được sắp xếp, Anh add thêm code sắp xếp giúp em luôn nha.

Cảm ơn anh rất nhiều.
 
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Thích thì chìu liền hà!
Quá tuyệt vời Anh ạ, cảm ơn anh rất nhiều.
Nhưng code này nó không tự động update được anh ơi, khi thay đổi thông tin bên Sheet HH thì mình phải chọn lại mới cập nhật giá trị mới. Mong anh xem giúp em cho nó chạy tự động luôn nha, khi thay đổi bên Sheet HH thì nó cập nhật qua list này luôn.

Một lần nữa cảm ơn các anh chị rất nhiều.
 
QDuc

QDuc

Thành viên thân thiết
3/6/06
254
18
18
Biển khơi
(hắc nên tặng bạn danh hiệu:
"/(/gười lười nhất trong ngày" của cộng đồng này!
 
  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
(hắc nên tặng bạn danh hiệu:
"/(/gười lười nhất trong ngày" của cộng đồng này!
Dạ, anh thông cảm.

Em chỉ có ý tưởng nhưng không biết lập trình ạ, mới bắt đầu tìm hiểu về VBA thôi anh ạ.
Em thấy file của anh SA_DQ là chạy rất tốt ạ, Mong các anh chỉ thêm giúp em phần tự động cập nhật thông tin từ sheet HHoa là xong rồi ạ, vì e mới học VBA mà tìm hiểu tới đây chắc còn lâu lắm mới xong Form của em.
 
Sửa lần cuối:
QDuc

QDuc

Thành viên thân thiết
3/6/06
254
18
18
Biển khơi
Vì macro trong trang tính Sheet2 đang là macro sự kiện; Để macro chạy được ta cần chọn 1 mã hiệu hàng hóa nào đó;
Nhưng khi bạn cập nhật hàng hóa bên trang 'HHoa', chắc gì trùng khớp vớ mã hiệu hàng đang có ở ô [B3], nơi mà macro gắn liền với nó.
Như vậy ta chỉ có thể thêm sự kiện kích hoạt trang tính Sheet2, lúc đó macro sự kiện này sẽ gọi macro sự kiện tại ô [C3] thực hiện với tham số được truyền.
Nhưng như vậy macro thêm vô cũng không mấy í nghĩa với bạn.
Nó cũng chả hơn gì macro sự kiện đã có.

Vài lời trao đổi cùng bạn!
 
  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Vì macro trong trang tính Sheet2 đang là macro sự kiện; Để macro chạy được ta cần chọn 1 mã hiệu hàng hóa nào đó;
Nhưng khi bạn cập nhật hàng hóa bên trang 'HHoa', chắc gì trùng khớp vớ mã hiệu hàng đang có ở ô [B3], nơi mà macro gắn liền với nó.
Như vậy ta chỉ có thể thêm sự kiện kích hoạt trang tính Sheet2, lúc đó macro sự kiện này sẽ gọi macro sự kiện tại ô [C3] thực hiện với tham số được truyền.
Nhưng như vậy macro thêm vô cũng không mấy í nghĩa với bạn.
Nó cũng chả hơn gì macro sự kiện đã có.

Vài lời trao đổi cùng bạn!
Em cảm ơn anh QDuc đã làm rõ vấn đề.
Như vậy nếu mình thêm 1 button "Cap nhat" bên sheet2, khi mình thay đổi thông tin bên Sheet 'HHoa', bên Sheet2 ko ảnh hưởng gì, tới khi mình bấm button "Cap nhat" thì nó mới chạy Macro để lấy lại thông tin bên sheet 'HHoa' (dạng như refesh). Như thế có khả thi hơn không anh?
 
HongViet

HongViet

Thành viên thân thiết
10/11/05
286
10
18
Đà nẵng
Như vậy nếu mình thêm 1 button "Cap nhat" bên sheet2, khi mình thay đổi thông tin bên Sheet 'HHoa', bên Sheet2 ko ảnh hưởng gì, tới khi mình bấm button "Cap nhat" thì nó mới chạy Macro để lấy lại thông tin bên sheet 'HHoa' (dạng như refesh). Như thế có khả thi hơn không anh?
Mình nghĩ macro sự kiện là tối ưu rồi, vì tại ô gắn với macro sự kiện đó, ta có thể chọn mặt hàng mà ta cần macro báo cáo;
Còn gắn macro vô nút lệnh, lúc đó ta fải có thêm động tác là nhập mã mặt hàng vô cho macro nút lệnh; Thêm nữa, chắc gì bạn nhớ hết các mã mặt hàng của bạn? Còn macro sự kiện bên trên, ta nhờ có danh sách Validation để chọn mặt hàng mà!
Danh sách cung cấp cho ô Validation do ta hoàn toàn chủ động & không fụ thuộc vô bộ nhớ hữu hạn của ta mà!
Chúc vui!
 
  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Mình nghĩ macro sự kiện là tối ưu rồi, vì tại ô gắn với macro sự kiện đó, ta có thể chọn mặt hàng mà ta cần macro báo cáo;
Còn gắn macro vô nút lệnh, lúc đó ta fải có thêm động tác là nhập mã mặt hàng vô cho macro nút lệnh; Thêm nữa, chắc gì bạn nhớ hết các mã mặt hàng của bạn? Còn macro sự kiện bên trên, ta nhờ có danh sách Validation để chọn mặt hàng mà!
Danh sách cung cấp cho ô Validation do ta hoàn toàn chủ động & không fụ thuộc vô bộ nhớ hữu hạn của ta mà!
Chúc vui!
Dạ, không biết anh hiểu nhầm ý em hay là em chưa hiểu hết ý của anh. hhjhjhj.

Button chỉ để refesh macro thôi anh.

Em xin giải thích lại như sau: Code của anh SA_DQ lấy thông tin hàng hóa từ Sheet 'HHoa' để cập nhật vào Sheet2,

- B1: Nhập thông tin (tạm gọi mà mã hàng) mặt hàng vào ô B3 (Sheet2) >> OK rồi
- B2: Macro sẽ list ra các mặt hàng liên quan, lấy thông tin từ Sheet 'HHoa' >> OK rồi
- B3: Em qua sheet 'HHoa' thay đổi thông tin về tên hàng, thêm tên hàng mới, số lượng ..... thì macro không tự cập nhật lại thông tin cho sheet2, mà em phải qua sheet2 nhập lại mã hàng vào ô B3 (chỉ cần F2 sau đó enter, vì tại ô B3 em đã nhập mã hàng lúc nãy rồi) lúc đó macro mới cập nhật lại thông tin.

>> Do đó em muốn nó chạy tự động luôn, khi sheet 'HHoa' có thông tin mới thì bên Sheet2 sẽ được cập nhật mới, nhưng anh QDuc nói như thế k hay nên em mới nghĩ ra button để khi cần cập nhật thông tin tại sheet2 thì mình sẽ ấn.

-> Sau khi bên sheet 'HHoa' thay đổi thông tin, nếu mình muốn sheet2 cập nhật thông tin thì sẽ ấn button "Cap Nhat". lúc đó macro sẽ chạy lại để lấy thông tin mới (không phải ấn F2 vào mã hàng như bây giờ, vì em có nhiều mã hàng không thể phải F2 từng cái)

Em trình bày vậy có gì sai sót, mong các anh bỏ qua.

Cảm ơn các anh rất nhiều
 
S

SA_DQ

Thành viên thân thiết
29/6/05
453
49
28
63
HCM city
À, ra là thế!
Vậy bạn hãy sang trang 'HHoa', đến cột [AA], Ở đó có danh sách được gán tên & danh sách này làm cơ sở cho ô Validation [B3] của trang 'Sheet2'
Cái bạn cần là khi nhập 'Hiệu' mới vô cột [E] của 'HHoa', thì hiệu mới này cần có trong danh sách được gán tên tại cột [AA]

Vậy thì có vài cách làm sau đây:
(*) Bạn tự nhập bằng tay vô cột [AA], chắc điều này bạn tạm làm dù muốn hay không, để thử macro sự kiện tại [B3]
(*) Tạo 1 macro (có thể là sự kiện tại cột nhập 'Hiệu' của trang 'HHoa', macro khi đóng trang tính 'HHoa' hay macro chạy khi mở/kích hoạt trang 'Sheet2'
Lúc đó 1 trong 3 macro này sẽ bổ sung 'Hiệu' mới vô danh sách Validation
(Theo mình cái đầu tốn công sức không đán; Cái thứ 2 hay 3 là được. Còn bạn sẽ thích cái nào thì cho quyền bạn quyết định, âậy nha!)
Thân ái & chúc vui!
 
  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
À, ra là thế!
Vậy bạn hãy sang trang 'HHoa', đến cột [AA], Ở đó có danh sách được gán tên & danh sách này làm cơ sở cho ô Validation [B3] của trang 'Sheet2'
Cái bạn cần là khi nhập 'Hiệu' mới vô cột [E] của 'HHoa', thì hiệu mới này cần có trong danh sách được gán tên tại cột [AA]

Vậy thì có vài cách làm sau đây:
(*) Bạn tự nhập bằng tay vô cột [AA], chắc điều này bạn tạm làm dù muốn hay không, để thử macro sự kiện tại [B3]
(*) Tạo 1 macro (có thể là sự kiện tại cột nhập 'Hiệu' của trang 'HHoa', macro khi đóng trang tính 'HHoa' hay macro chạy khi mở/kích hoạt trang 'Sheet2'
Lúc đó 1 trong 3 macro này sẽ bổ sung 'Hiệu' mới vô danh sách Validation
(Theo mình cái đầu tốn công sức không đán; Cái thứ 2 hay 3 là được. Còn bạn sẽ thích cái nào thì cho quyền bạn quyết định, âậy nha!)
Thân ái & chúc vui!
Dạ không anh SA_DQ , Cái em cần là làm sao cái list bên Sheet2 sẽ cập nhật các thông tin bên sheet HHoa (có thể tự động hoặc thông qua button). Còn phần cột AA em có thể lo được ạ.

Em ví dụ thế này:
Bên sheet 'HHoa' em nhập:
sản phẩm Hiệu S.lượng
- Xe Airblade Honda 1
- Xe SH125 Honda 2
- Xe SH250 Honda 10

>> khi em qua sheet2 nhập Honda vào B3 thì nó list ra danh sách là ok rồi. (dựa vào form hiện tại của anh)
sau đó em qua sheet 'HHoa' đổi tên SH125 >> SH100. Theo form hiện tại nếu em muốn Sheet2 cập nhật tên mới (SH100) thì em phải ấn F2 vào chữ Honda ô B3 thì macro mới chạy lại.

ý tưởng của em:
mình sẽ dùng 1 button để gọi macro chạy lại để nó cập nhật thông tin mới từ sheet 'HHoa' ( ko cần phải ấn F2 ô B3). còn nếu chạy được tự động thì quá tuyệt.
 
HongViet

HongViet

Thành viên thân thiết
10/11/05
286
10
18
Đà nẵng
Bạn xem file đính kèm;
Khi nhập hay đổi dữ liệu ở 'HHoa', & chuyển sang trang 'Sheet2' thì macro gắn liền với sự kiện kích hoạt trang tính sẽ chạy tự động;
Chỉ có điều nó chạy với dữ liệu đã có sẵn trong [B3] của trang này
 

Đính kèm

  • Like
Reactions: ultimatum
U

ultimatum

Sơ cấp
4/12/08
39
7
8
binhthuan
Bạn xem file đính kèm;
Khi nhập hay đổi dữ liệu ở 'HHoa', & chuyển sang trang 'Sheet2' thì macro gắn liền với sự kiện kích hoạt trang tính sẽ chạy tự động;
Chỉ có điều nó chạy với dữ liệu đã có sẵn trong [B3] của trang này
Cảm ơn anh HongViet rất nhiều, rất đúng với ý em. chạy thế này khi mình thao tác bên 'HHoa' nó cũng không ảnh hưởng gì tới Sheet2 nên em nghĩ nó không ảnh hưởng tới tốc độ, rất tuyệt vời.
Em sẽ nghiên cứu code của anh, vì em muốn list thêm các mặt hàng khác nữa vào các ô bên dưới (ví dụ hàng Mikro vào Ô B24). Để em tập viết thêm xem sao, mình chỉ cần thêm tham chiếu tới các ô là được đúng hok anh?.
Một lần nữa xin cảm ơn các anh rất nhiều.
 
S

SA_DQ

Thành viên thân thiết
29/6/05
453
49
28
63
HCM city
Em sẽ nghiên cứu code của anh, vì em muốn list thêm các mặt hàng khác nữa vào các ô bên dưới (ví dụ hàng Mikro vào Ô B24). Để em tập viết thêm xem sao, mình chỉ cần thêm tham chiếu tới các ô là được đúng hok anh?.
Muốn vậy bạn cần hiểu rõ thêm các dòng lệnh có đánh số sau đây:
PHP:
Sub GPE(Targ As Range)
Dim Sh As Worksheet, Rng As Range, sRg As Range, Rg0 As Range, Cls As Range
Dim fAdd As String
Dim Trùng As Boolean, Rws As Long
Set Sh = ThisWorkbook.Worksheets("HHoa")
Set Rng = Sh.Range(Sh.[e4], Sh.[e65500].End(xlUp))
Rws = Rng.Rows.Count
5 [c3].Resize(Rws, 5).ClearContents     'Chọn Vùng Xóa Thích Hợp để khỏi mất dữ liệu đang cần'
Set sRg = Rng.Find(Targ.Value, , xlFormulas, xlWhole)  '*'
If Not sRg Is Nothing Then
  fAdd = sRg.Address
  Do
  On Error Resume Next
  Set Rg0 = [c3].Resize(Rws).SpecialCells(xlCellTypeConstants, 2)
  If Err > 0 Then Err = 0
  If Not Rg0 Is Nothing Then
  For Each Cls In Rg0
  With Cls
  If .Value = sRg.Offset(, -3).Value And sRg.Offset(, 2).Value = .Offset(, 4).Value Then
  .Offset(, 3).Value = .Offset(, 3).Value + sRg.Offset(, 1).Value
  Trùng = True:  Exit For
  End If
  End With
  Next Cls
  End If
  If Trùng Then
  Trùng = False
  Else
26  With Cells(9999, "C").End(xlUp).Offset(1) 'Để khỏi chép nhằm nơi cần chép đến'
  .Resize(, 2).Value = sRg.Offset(, -3).Resize(, 2).Value
  .Offset(, 3).Resize(, 2).Value = sRg.Offset(, 1).Resize(, 2).Value
  End With
  End If
  Set sRg = Rng.FindNext(sRg)
  Loop While Not sRg Is Nothing And sRg.Address <> fAdd
End If
34 [c2].Resize(Rws, 5).Sort Key1:=Range("c3"), Order1:=xlAscending, Header:=xlGuess, _
  OrderCustom:=1, MatchCase:=False      'Chú í địa chỉ vùng cần sắp xếp'
End Sub
 
  • Like
Reactions: ultimatum

Thành viên trực tuyến

Không có thành viên trực tuyến.

Xem nhiều

TEXT LINK