kobebryant
Thành viên thường trực




- Tham gia
- 7/8/09
- Bài viết
- 248
- Được thích
- 28
Mình có 1 list danh sách Tên khách hàng và muốn tạo drop list có điều kiện là chỉ tạo ra list những khách hàng có đặc điểm ký hiệu là KM
Mình chân thành cám ơn
=OFFSET(Sheet1!$K$2,0,0,COUNTA(Sheet1!$K:$K)-1)
=OFFSET(Sheet1!$B$2,MATCH(Sheet1!$C$13,OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1),0)-1,0,COUNTIF(Sheet1!$A:$A,Sheet1!$C$13))
Ẹc ẹc, ngày nghỉ lễ nên ít có người hướng dẫn cho bạn. Vì chưa thấy ai hướng dẫn nên mình làm cho bạn 1 công thức tổng quát cho yêu cầu của bạn luôn.
Có nghĩa là, thay vì chỉ chọn đặc điểm là KM, tôi làm thêm 1 cái list nữa để ghi đặc điểm, nếu chọn đặc điểm nào thì cái list tên khách hàng sẽ được hiện ra tương ứng với đặc điểm đó.
Tôi làm 2 name động như sau:
1) DacDiem
2) KhachHangPHP:=OFFSET(Sheet1!$K$2,0,0,COUNTA(Sheet1!$K:$K)-1)
PHP:=OFFSET(Sheet1!$B$2,MATCH(Sheet1!$C$13,OFFSET(Sheet1!$A$2,0,0,COUNTA(Sheet1!$A:$A)-1),0)-1,0,COUNTIF(Sheet1!$A:$A,Sheet1!$C$13))
Nếu có thay đổi bảng, thay đổi dữ liệu thì bạn thay đổi theo công thức nhé!
================================================================
LƯU Ý:
ĐỂ CÁI LIST NÓ ĐÚNG THÌ CỘT ĐẶC ĐIỂM (TRONG BẢNG A1:G9) PHẢI ĐƯỢC SORT THEO THỨ TỰ.
Kết quả của anh lòi ra một chú "Lâm chí 4" không có mã KM anh ơi
ĐỂ CÁI LIST NÓ ĐÚNG THÌ CỘT ĐẶC ĐIỂM (TRONG BẢNG A1:G9) PHẢI ĐƯỢC SORT THEO THỨ TỰ.
Hình như bạn chưa đọc dòng này chăng?.
bác nhapmon cho mình hỏi là khi mình ráp công thức vào file chuẩn của mình vị trí cell thay đổi, mình dựa theo công thức của bác và chỉnh lại cell, cố định cột dòng đầy đủ nhưng no ko ra kết quả gì hết. Mình cũng ctrl shift enter rồi nên công thức phức tạp mình ko nói làm gì mà ko hiểu sao thay đổi vị trí cell tương ứng nó ko ra
Mình up lại cái file bạn đã làm nhưng đa ta nằm ở vị trí giống với file của mình luôn cho chắc
Cám ơn bác
Lúc đầu cũng loay hoay toát mồ hôi cái công thức mảng vì vào xem công thức xong hên là nhấn enter thấy nó nhảy kết quả ban đầu mà lại mất cái dấu {} rồi nghĩ mình có sửa công thức đâu chỉ xem thôi mà, thế là tìm trong diễn đàn mới biết chứ ko đâu biết đâurồi đã làm lại và giải thích trong file.
p/s: bạn tìm hiểu công thức mảng vậy là nhanh đó, hồi tui mới vào diễn đàn thấy người ta giải công thức mảng cứ tưởng người ta gõ hai dấu {} vào không à...hì....hì....
Chào các thầy,
Em đang làm một cái tương tự như ở đề tài này tức là tạo Tạo cell dropdown data validation có điều kiện nhưng dùng VBA. Em làm cũng lâu lắm rùi, nhưng suy nghĩ mãi chưa ra được.
Vậy mong các thầy có thể giúp Em code cho vấn đề này.
Chân thành cám ơn nhiều.
P/S: Mong các Mod nếu đã có 1 đề tài nào tương tự như thế này vui lòng cho mình địa chỉ. vì mình đã tìm nhiều nhưng chưa thấy. Cám ơn nhiều
Nếu tôi làm bài này thì sẽ làm hơi khác 1 chút:Xin chào GPE,
Mình tạo ra vấn đề này cũng lâu lắm rùi, nhưng chưa có bạn nào trả lời...
Nhân tiện mình đã làm được nên mình muốn đưa kết quả lên lại đây để cùng nhau tham khảo và có thể có ý kiến nào hay hơn để để quyết vấn đề này hay không. Trong này mình có dung code UniqueList cua Thầy ndu96081631
Mong các bạn xem qua và cho ý kiến.
Function JoinIf(ByVal Delimiter As String, ByVal CriteriaArray, ByVal Criteria, Optional ByVal TargetArray) As String
Dim aTmpCrit, aTmpDes, tmp1, tmp2, arr(), dic As Object
Dim bComp As Boolean, Chk As Boolean
Dim i As Long, j As Long, k As Long, dTmpVal As Double
Set dic = CreateObject("Scripting.Dictionary")
If IsMissing(TargetArray) Then TargetArray = CriteriaArray
aTmpCrit = ConvertTo1DArray(CriteriaArray)
aTmpDes = ConvertTo1DArray(TargetArray)
If (Not IsArray(aTmpCrit)) Or (Not IsArray(aTmpDes)) Then Exit Function
On Error Resume Next
bComp = (InStr("<>=", Left(Criteria, 1)) > 0)
For i = LBound(aTmpDes) To UBound(aTmpDes)
tmp1 = aTmpCrit(i): tmp2 = aTmpDes(i)
If bComp And Len(Criteria) Then
dTmpVal = CDbl(aTmpCrit(i))
If Evaluate(dTmpVal & Criteria) Then dic.Add tmp2, ""
Else
If (Left(Criteria, 1) = "!") Then
If Not (UCase(tmp1) Like UCase(Mid(Criteria, 2, Len(Criteria)))) Then dic.Add tmp2, ""
Else
If (UCase(tmp1) Like UCase(Criteria)) Then dic.Add tmp2, ""
End If
End If
Next
If dic.Count Then
arr = dic.Keys
JoinIf = Join(arr, Delimiter)
End If
End Function
Private Function ConvertTo1DArray(ByVal SourceArray)
Dim aTmp, Item, arr()
Dim n As Long
On Error Resume Next
aTmp = SourceArray
If Not IsArray(aTmp) Then aTmp = Array(aTmp)
For Each Item In aTmp
n = n + 1
ReDim Preserve arr(1 To n)
arr(n) = Item
Next
ConvertTo1DArray = arr
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sValidation As String
On Error Resume Next
If Target.Address = "$F$3" Then
sValidation = JoinIf(",", Range("A2:A100"), Target.Value, Range("B2:B100"))
With Range("H3").Validation
.Delete
.Add 3, , , sValidation
End With
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sValidation As String
On Error Resume Next
With Target
If .Address = "$F$3" Then
sValidation = JoinIf(",", Range("A2:A100"), "*")
.Validation.Delete
.Validation.Add 3, , , sValidation
End If
End With
End Sub
Loay hoay thấy cái này hay hơn, để vào đây để anh em nào mới muốn dùng có thể tham khảo. Đảm bảo hay hơn các cách trong mục này
http://blogs.office.com/2009/11/24/create-conditional-drop-down-lists/
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sValidation As String
On Error Resume Next
If Target.Address = Range("F3:F5") Then
sValidation = JoinIf(",", Range("A2:A100"), Target.Value, Range("B2:B100"))
With Range("H3").Validation
.Delete
.Add 3, , , sValidation
End With
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sValidation As String
On Error Resume Next
With Target
If .Address = "$F$3" Then
sValidation = JoinIf(",", Range("A2:A100"), "*")
.Validation.Delete
.Validation.Add 3, , , sValidation
End If
End With
End Sub
Nếu tôi làm bài này thì sẽ làm hơi khác 1 chút:
1> Code trong Module:
2> Áp dụng cho sự kiện Change và SelectionChangeMã:Function JoinIf(ByVal Delimiter As String, ByVal CriteriaArray, ByVal Criteria, Optional ByVal TargetArray) As String Dim aTmpCrit, aTmpDes, tmp1, tmp2, arr(), dic As Object Dim bComp As Boolean, Chk As Boolean Dim i As Long, j As Long, k As Long, dTmpVal As Double Set dic = CreateObject("Scripting.Dictionary") If IsMissing(TargetArray) Then TargetArray = CriteriaArray aTmpCrit = ConvertTo1DArray(CriteriaArray) aTmpDes = ConvertTo1DArray(TargetArray) If (Not IsArray(aTmpCrit)) Or (Not IsArray(aTmpDes)) Then Exit Function On Error Resume Next bComp = (InStr("<>=", Left(Criteria, 1)) > 0) For i = LBound(aTmpDes) To UBound(aTmpDes) tmp1 = aTmpCrit(i): tmp2 = aTmpDes(i) If bComp And Len(Criteria) Then dTmpVal = CDbl(aTmpCrit(i)) If Evaluate(dTmpVal & Criteria) Then dic.Add tmp2, "" Else If (Left(Criteria, 1) = "!") Then If Not (UCase(tmp1) Like UCase(Mid(Criteria, 2, Len(Criteria)))) Then dic.Add tmp2, "" Else If (UCase(tmp1) Like UCase(Criteria)) Then dic.Add tmp2, "" End If End If Next If dic.Count Then arr = dic.Keys JoinIf = Join(arr, Delimiter) End If End Function Private Function ConvertTo1DArray(ByVal SourceArray) Dim aTmp, Item, arr() Dim n As Long On Error Resume Next aTmp = SourceArray If Not IsArray(aTmp) Then aTmp = Array(aTmp) For Each Item In aTmp n = n + 1 ReDim Preserve arr(1 To n) arr(n) = Item Next ConvertTo1DArray = arr End Function
Code ở Module tuy dài nhưng ta cũng chẳng cần quan tâm, chỉ cần biết áp dụng là được (phần áp dụng sẽ rất ngắn gọn)Mã:Private Sub Worksheet_Change(ByVal Target As Range) Dim sValidation As String On Error Resume Next If Target.Address = "$F$3" Then sValidation = JoinIf(",", Range("A2:A100"), Target.Value, Range("B2:B100")) With Range("H3").Validation .Delete .Add 3, , , sValidation End With End If End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sValidation As String On Error Resume Next With Target If .Address = "$F$3" Then sValidation = JoinIf(",", Range("A2:A100"), "*") .Validation.Delete .Validation.Add 3, , , sValidation End If End With End Sub
Hàm JoinIf dùng để nối chuổi duy nhất theo điều kiện (giống SUMIF, có thể dùng ký tự đại diện như *, ? hoặc phép so sánh >, < , =...)
File chứa nhiều styles rác.Chào các bạn,
Mình có thắc mắc xin các bạn giải đáp dùm mình chỗ sai. Cám ơn trước
Xin các bạn xem file đính kèm.
Câu 3 đề bài yêu cầu tính tổng số lượng & tổng thành tiền của từng hãng HTC, Samsung, Nokia.
View attachment 185683
Mình dùng data validation cho Hãng SX & tên hàng. Thế nhưng khi chọn một hãng SX cụ thể& tên hàng cụ thể ví dụ HTC wildfire thì excel không tự động cập nhật Tổng số lượng & Tổng thành tiền cho HTC wildfire. Mình không biết là mình thao tác sai ở chỗ nào, các bạn xem file rồi kiểm tra dùm mình.
Xin đừng "ném đá" mình nếu mình hỏi hơi bị ngu.
Chân thành cảm ơn.![]()