Kính nhờ giải thích công thức phần liên kết ô Dropdown giữa 2 sheet

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

acrox84

Thành viên hoạt động
Tham gia
22/3/08
Bài viết
101
Được thích
28
File gốc này mình nhờ 1 bạn GBE làm lâu rồi, giờ dữ liệu thay đổi, mình có nhờ điều chỉnh chỗ này chỗ kia chút.
Giờ final gom lại thì phát sinh cái list tên Khách theo SĐT không hoạt động (nó liên kết với 1 bảng trong sheet Tach KH)
A1.jpg

Mình có đính kèm file lên, nhờ anh em GBE xem giúp phải sửa như thế nào với (File cần chỉnh Nho GPE listdropdown)
, còn file gốc về cách nó hoạt động, mình cũng gửi lại file Thong Ke KhachVip1 để mọi người xem lại cách nó hoạt động.
Chân thành cảm ơn rất rất nhiều!
 

File đính kèm

  • Nho GPE listdropdown.xlsm
    52.8 KB · Đọc: 14
  • Thong Ke KhachVip1.xlsm
    66.1 KB · Đọc: 11
File gốc này mình nhờ 1 bạn GBE làm lâu rồi, giờ dữ liệu thay đổi, mình có nhờ điều chỉnh chỗ này chỗ kia chút.
Giờ final gom lại thì phát sinh cái list tên Khách theo SĐT không hoạt động (nó liên kết với 1 bảng trong sheet Tach KH)
View attachment 285927

Mình có đính kèm file lên, nhờ anh em GBE xem giúp phải sửa như thế nào với (File cần chỉnh Nho GPE listdropdown)
, còn file gốc về cách nó hoạt động, mình cũng gửi lại file Thong Ke KhachVip1 để mọi người xem lại cách nó hoạt động.
Chân thành cảm ơn rất rất nhiều!
File này của bạn chủ yếu dùng vba, công thức rất ít, bạn nên nhờ ai đó biết về vba viết lại chứ sửa thì có khi còn lâu hơn viết mới nhiều
 
File này của bạn chủ yếu dùng vba, công thức rất ít, bạn nên nhờ ai đó biết về vba viết lại chứ sửa thì có khi còn lâu hơn viết mới nhiều
mình thấy vẫn còn liên kết mà chỉ được cái đầu tiên, nên nghĩ sửa lại vẫn được vì chỗ đó mình đâu có edit gì :(
 
nên nghĩ sửa lại vẫn được
Khả năng bạn nào trước đây viết code cho bạn mò mẫm thì cũng được nhưng rất lâu vì file này có từ tháng 11/2020, hơn hai năm rồi thì chắc cũng không nhớ được, nên tốt nhất là diễn giải từ đầu rồi nhờ viết mới sẽ nhanh hơn.
 
File gốc này mình nhờ 1 bạn GBE làm lâu rồi, giờ dữ liệu thay đổi, mình có nhờ điều chỉnh chỗ này chỗ kia chút.
Giờ final gom lại thì phát sinh cái list tên Khách theo SĐT không hoạt động (nó liên kết với 1 bảng trong sheet Tach KH)
View attachment 285927

Mình có đính kèm file lên, nhờ anh em GBE xem giúp phải sửa như thế nào với (File cần chỉnh Nho GPE listdropdown)
, còn file gốc về cách nó hoạt động, mình cũng gửi lại file Thong Ke KhachVip1 để mọi người xem lại cách nó hoạt động.
Chân thành cảm ơn rất rất nhiều!
bạn cần lấy dữ liệu cho ô J2? Nếu đúng thì bạn cần lấy dữ liệu ở sheet nào?
 
bạn cần lấy dữ liệu cho ô J2? Nếu đúng thì bạn cần lấy dữ liệu ở sheet nào?
Mình cần lấy dữ liệu cái bảng ở sheet Tach KH này, bảng này có thể mở rộng tới STT 100 giúp mình.
-Ô J2 có List dropdown bên Sheet Gui Le, chọn SĐT ra tên Khách hàng tương ứng (Khách hàng xếp theo thứ tự ưu tiên theo SL Gửi)
Cảm ơn mọi người hỗ trợ rất nhiều!
B2.jpg
Bài đã được tự động gộp:

Khả năng bạn nào trước đây viết code cho bạn mò mẫm thì cũng được nhưng rất lâu vì file này có từ tháng 11/2020, hơn hai năm rồi thì chắc cũng không nhớ được, nên tốt nhất là diễn giải từ đầu rồi nhờ viết mới sẽ nhanh hơn.
2 năm trước, bạn cũng giúp mình viết code cho vấn đề này của mình nè, giờ mình đổi cty khác làm nên thay đổi cấu trúc hết, k biết sửa ntn, topic cũ lúc đó nè:
 
Lần chỉnh sửa cuối:
Mình cần lấy dữ liệu cái bảng ở sheet Tach KH này, bảng này có thể mở rộng tới STT 100 giúp mình.
-Ô J2 có List dropdown bên Sheet Gui Le, chọn SĐT ra tên Khách hàng tương ứng (Khách hàng xếp theo thứ tự ưu tiên theo SL Gửi)
Cảm ơn mọi người hỗ trợ rất nhiều!
View attachment 285928
Bài đã được tự động gộp:


2 năm trước, bạn cũng giúp mình viết code cho vấn đề này của mình nè, giờ mình đổi cty khác làm nên thay đổi cấu trúc hết, k biết sửa ntn, topic cũ lúc đó nè:
Mình chỉ biết một ít công thức thôi, viết code thì mình rất dốt nên mới bảo bạn như mấy bài trên.
 
Không biết có phải mình hiểu đơn giản quá không
Bạn sửa công thức trong Name SDT như sau:

SDT=OFFSET('Tach KH'!$C$4,0,0,COUNTA('Tach KH'!$C:$C)-1)
 
Không biết có phải mình hiểu đơn giản quá không
Bạn sửa công thức trong Name SDT như sau:

SDT=OFFSET('Tach KH'!$C$4,0,0,COUNTA('Tach KH'!$C:$C)-1)
mình thấy có 1 chỗ SDT để sửa (
mà thay thế báo lỗi rồi, bên Modules nút VIP cũng không đc, hay thêm Define name cũng lỗi
C1.jpg

bạn xem phải thêm nó ở đâu giúp nha
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Data(), KQ()
Dim i&, k&, SDT$, CKN&

If Target.Address = "$J$2" Then
If Sheets("Gui Le").Range("J2").Value <> "" Then
With Sheets("DaTa")
Data = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 57).Value
ReDim KQ(1 To 1000, 1 To 11)
SDT = Target.Value
For i = 1 To UBound(Data)
If SDT = Data(i, 7) Then
k = k + 1
KQ(k, 1) = k
KQ(k, 2) = Data(i, 4)
KQ(k, 3) = Data(i, 2)
KQ(k, 4) = Data(i, 11)
KQ(k, 5) = Data(i, 13)
KQ(k, 6) = Data(i, 16)
KQ(k, 7) = Data(i, 27)
KQ(k, 8) = Data(i, 33)
KQ(k, 9) = Data(i, 41)
KQ(k, 10) = Data(i, 22)
KQ(k, 11) = Data(i, 19)
If KQ(k, 11) = "" Then CKN = CKN + 1
End If
Next
End With
With Sheets("Gui Le")
.Range("C6:M1000").ClearContents
.Range("O6:O1000").ClearContents
.Range("C6").Resize(k, 11) = KQ
.Range("C6").Resize(k, 11).Borders.LineStyle = 1
.Range("H2").Value = k
End With
Else
With Sheets("Gui Le")
.Range("C6:M1000").ClearContents
.Range("H2").Value = 0
End With
End If
End If
End Sub
 
Up, nhờ anh em hỗ trợ giúp mình chút.. Thanks
 
File gốc này mình nhờ 1 bạn GBE làm lâu rồi, giờ dữ liệu thay đổi, mình có nhờ điều chỉnh chỗ này chỗ kia chút.
Giờ final gom lại thì phát sinh cái list tên Khách theo SĐT không hoạt động (nó liên kết với 1 bảng trong sheet Tach KH)
View attachment 285927

Mình có đính kèm file lên, nhờ anh em GBE xem giúp phải sửa như thế nào với (File cần chỉnh Nho GPE listdropdown)
, còn file gốc về cách nó hoạt động, mình cũng gửi lại file Thong Ke KhachVip1 để mọi người xem lại cách nó hoạt động.
Chân thành cảm ơn rất rất nhiều!
Thêm sub tạo danh sách
Mã:
Option Explicit
Sub XYZ()
  Dim arr(), resDT$(), res(), wb As Workbook, sh As Worksheet, dic As Object
  Dim sRow&, sCol&, j&, i&, r&, k&, ik&, DT$, fDay&, eDay&, tDay

  Set sh = ThisWorkbook.Worksheets("Tach KH")
  Set dic = CreateObject("Scripting.Dictionary")
  On Error Resume Next
  fDay = sh.Range("G2").Value
  eDay = sh.Range("H2").Value
  If fDay = Empty Or eDay = Empty Or fDay > eDay Then
    MsgBox ("Dieu kien ngay khong chuan !")
    Exit Sub
  End If
'Gan du lieu vao mang arr
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "DuLieu." & sh.Range("F1").Value)
  arr = Range("A10:AS" & Range("E" & Rows.Count).End(xlUp).Row).Value
  wb.Close False
  If Err.Number > 0 Then
    MsgBox ("File du lieu khong ton tai !")
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Exit Sub
  End If
  On Error GoTo 0
  sRow = UBound(arr): sCol = UBound(arr, 2)
'Loc du lieu
  ReDim res(1 To sRow, 1 To 3)
  ReDim resDT(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If TypeName(arr(i, 41)) = "String" Then
      tDay = CLng(Split(arr(i, 41), "/")(0))
    Else
      tDay = Day(arr(i, 41))
    End If
    If tDay >= fDay And tDay <= eDay Then
      r = r + 1
      If i <> r Then
        For j = 1 To sCol
          arr(r, j) = arr(i, j)
        Next j
      End If
      DT = Trim(arr(i, 7))
      If Not dic.exists(DT) Then
        k = k + 1
        dic.Add DT, k
        res(k, 1) = arr(i, 5):        res(k, 3) = 1
        resDT(k, 1) = DT
      Else
        ik = dic.Item(DT)
        res(ik, 3) = res(ik, 3) + 1
      End If
    End If
  Next i
'Gan du lieu vao sheet Data
  With Sheets("Data")
    If .Range("B2").Value <> Empty Then .Range("B2").CurrentRegion.Offset(1).ClearContents
    .Range("D2").Resize(r).NumberFormat = "@"
    .Range("AO2").Resize(r).NumberFormat = "@"
    .Range("A2").Resize(r, sCol) = arr
  End With
'Xoa vung ket qua
  i = sh.Range("B" & Rows.Count).End(xlUp).Row
  If i > 3 Then sh.Range("A4:D" & i).ClearContents
'Gan ket qua
  sh.Range("B4").Resize(k, 3) = res
  sh.Range("C4").Resize(k) = resDT
  sh.Range("B4").Resize(k, 3).Sort Key1:=sh.Range("D4"), Order1:=xlDescending
  sh.Range("A4") = 1
  sh.Range("A4").Resize(k).DataSeries
  Call Add_Datavalidation(dic, resDT, k, i) 'Tao Data validation sheet "Gui Le"
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Sub Add_Datavalidation(dic, resDT, ByVal sRow&, ByVal i&)
  dic.RemoveAll
  For i = 1 To sRow
    If Not dic.exists(resDT(i, 1)) Then dic.Add resDT(i, 1), ""
  Next i
  Sheets("Gui Le").Range("J2").Validation.Modify Formula1:=Join(dic.keys, ",")
End Sub
 
Thêm sub tạo danh sách
Mã:
Option Explicit
Sub XYZ()
  Dim arr(), resDT$(), res(), wb As Workbook, sh As Worksheet, dic As Object
  Dim sRow&, sCol&, j&, i&, r&, k&, ik&, DT$, fDay&, eDay&, tDay

  Set sh = ThisWorkbook.Worksheets("Tach KH")
  Set dic = CreateObject("Scripting.Dictionary")
  On Error Resume Next
  fDay = sh.Range("G2").Value
  eDay = sh.Range("H2").Value
  If fDay = Empty Or eDay = Empty Or fDay > eDay Then
    MsgBox ("Dieu kien ngay khong chuan !")
    Exit Sub
  End If
'Gan du lieu vao mang arr
  Application.ScreenUpdating = False
  Application.EnableEvents = False
  Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "DuLieu." & sh.Range("F1").Value)
  arr = Range("A10:AS" & Range("E" & Rows.Count).End(xlUp).Row).Value
  wb.Close False
  If Err.Number > 0 Then
    MsgBox ("File du lieu khong ton tai !")
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Exit Sub
  End If
  On Error GoTo 0
  sRow = UBound(arr): sCol = UBound(arr, 2)
'Loc du lieu
  ReDim res(1 To sRow, 1 To 3)
  ReDim resDT(1 To sRow, 1 To 1)
  For i = 1 To sRow
    If TypeName(arr(i, 41)) = "String" Then
      tDay = CLng(Split(arr(i, 41), "/")(0))
    Else
      tDay = Day(arr(i, 41))
    End If
    If tDay >= fDay And tDay <= eDay Then
      r = r + 1
      If i <> r Then
        For j = 1 To sCol
          arr(r, j) = arr(i, j)
        Next j
      End If
      DT = Trim(arr(i, 7))
      If Not dic.exists(DT) Then
        k = k + 1
        dic.Add DT, k
        res(k, 1) = arr(i, 5):        res(k, 3) = 1
        resDT(k, 1) = DT
      Else
        ik = dic.Item(DT)
        res(ik, 3) = res(ik, 3) + 1
      End If
    End If
  Next i
'Gan du lieu vao sheet Data
  With Sheets("Data")
    If .Range("B2").Value <> Empty Then .Range("B2").CurrentRegion.Offset(1).ClearContents
    .Range("D2").Resize(r).NumberFormat = "@"
    .Range("AO2").Resize(r).NumberFormat = "@"
    .Range("A2").Resize(r, sCol) = arr
  End With
'Xoa vung ket qua
  i = sh.Range("B" & Rows.Count).End(xlUp).Row
  If i > 3 Then sh.Range("A4:D" & i).ClearContents
'Gan ket qua
  sh.Range("B4").Resize(k, 3) = res
  sh.Range("C4").Resize(k) = resDT
  sh.Range("B4").Resize(k, 3).Sort Key1:=sh.Range("D4"), Order1:=xlDescending
  sh.Range("A4") = 1
  sh.Range("A4").Resize(k).DataSeries
  Call Add_Datavalidation(dic, resDT, k, i) 'Tao Data validation sheet "Gui Le"
  Application.EnableEvents = True
  Application.ScreenUpdating = True
End Sub

Sub Add_Datavalidation(dic, resDT, ByVal sRow&, ByVal i&)
  dic.RemoveAll
  For i = 1 To sRow
    If Not dic.exists(resDT(i, 1)) Then dic.Add resDT(i, 1), ""
  Next i
  Sheets("Gui Le").Range("J2").Validation.Modify Formula1:=Join(dic.keys, ",")
End Sub
Thầy HieuCD cho mình hỏi, trường hợp còn những sheet tương tự như "Gui Le" do thống kê nhiều mục đích khác nhau (sheet Gui VIP, FULL) thì mỗi lần thêm Sheet mới, bổ sung 2 chỗ Call Add_Datavalidation và thêm sub danh sách như thế nào để mấy sheet mới hoạt động được. Cảm ơn thầy nhiều.

DD.jpg
 
Mình muốn bổ sung thêm điều kiện ở cột AG (cột thứ 33), chỗ Trạng Thái là: "Đã trả" và "Giao thành công" thì chỉnh ở đâu vậy thầy (Hiện muốn xài bấm Lọc Filter thì không xuất qua danh sách chia theo SĐT được, nên mong thầy hỗ trợ cho vô code giúp mình) Thân!

E3.jpg
 
Mình muốn bổ sung thêm điều kiện ở cột AG (cột thứ 33), chỗ Trạng Thái là: "Đã trả" và "Giao thành công" thì chỉnh ở đâu vậy thầy (Hiện muốn xài bấm Lọc Filter thì không xuất qua danh sách chia theo SĐT được, nên mong thầy hỗ trợ cho vô code giúp mình) Thân!

View attachment 286078

Nói rỏ hơn "Hiện muốn xài bấm Lọc Filter thì không xuất qua danh sách chia theo SĐT được" là như thế nào
Còn vấn đề gì gởi hết lên
 
Nói rỏ hơn "Hiện muốn xài bấm Lọc Filter thì không xuất qua danh sách chia theo SĐT được" là như thế nào
Còn vấn đề gì gởi hết lên
1. Ngoài điều kiện Ngày đầu và ngày cuối, còn muốn điều kiện "đã trả" và "giao thành công"

2. Và trường hợp còn những sheet tương tự như "Gui Le" do thống kê nhiều mục đích khác nhau (sheet Gui VIP, FULL) thì mỗi lần thêm Sheet mới, bổ sung 2 chỗ Call Add_Datavalidation và thêm sub danh sách như thế nào để mấy sheet mới hoạt động được.

3. Còn vấn đề là ví dụ sau này muốn bổ sung điều kiện cột xx là "zz" thì thầy chỉ cách tự ghi thêm vào code để khỏi nhờ lắt nhắc, thanks
 
1. Ngoài điều kiện Ngày đầu và ngày cuối, còn muốn điều kiện "đã trả" và "giao thành công"

2. Và trường hợp còn những sheet tương tự như "Gui Le" do thống kê nhiều mục đích khác nhau (sheet Gui VIP, FULL) thì mỗi lần thêm Sheet mới, bổ sung 2 chỗ Call Add_Datavalidation và thêm sub danh sách như thế nào để mấy sheet mới hoạt động được.

3. Còn vấn đề là ví dụ sau này muốn bổ sung điều kiện cột xx là "zz" thì thầy chỉ cách tự ghi thêm vào code để khỏi nhờ lắt nhắc, thanks
Bạn phải tạo bảng điều kiện giống advance filter mới lọc theo các cột khác được
 
Còn trường hợp số 2, thì bổ sung code sao bạn
Tự chỉnh
With Sheets("Full").Range("J2").Validation
sheet không tồn tại sẽ báo lổi
Mã:
Sub Add_Datavalidation(dic, resDT, ByVal sRow&, ByVal i&)
  Dim sList$
  dic.RemoveAll
  For i = 1 To sRow
    If Not dic.exists(resDT(i, 1)) Then dic.Add resDT(i, 1), ""
  Next i
  sList = Join(dic.keys, ",")
  With Sheets("Gui Le").Range("J2").Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=sList
  End With
  With Sheets("Full").Range("J2").Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=sList
  End With
End Sub
 
Tự chỉnh
With Sheets("Full").Range("J2").Validation
sheet không tồn tại sẽ báo lổi
Mã:
Sub Add_Datavalidation(dic, resDT, ByVal sRow&, ByVal i&)
  Dim sList$
  dic.RemoveAll
  For i = 1 To sRow
    If Not dic.exists(resDT(i, 1)) Then dic.Add resDT(i, 1), ""
  Next i
  sList = Join(dic.keys, ",")
  With Sheets("Gui Le").Range("J2").Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=sList
  End With
  With Sheets("Full").Range("J2").Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=sList
  End With
End Sub
*Mình làm được rồi, mà thứ tự danh sách theo SĐT tùm lum hết

Trường hợp mình muốn Sắp xếp thứ tự danh sách ở Sheet Gui Le giống như thứ tự Sheet Tach KH (dựa trên Số lần gửi) thì chèn thêm code sao bạn. Thanks!

E1.jpg
 
Web KT
Back
Top Bottom