2016-04-11 19 views
2

Excel'de iki açılır liste oluşturmam gerekiyor. İkincisi birinciye bağlıdır. Dinamik veri var Yani (Ben sürekli araç ve motor değişen olacaktır):Excel VBA'da dinamik bağımlı liste nasıl oluşturulur?

enter image description here

istediğim ilk açılan araçlar göstermektir. İkincisi, o araç için mevcut olan motorları gösterecektir.

İnternete baktım ve öneri her araç için bir İsim Aralığı oluşturmak, ancak bir liste döndürecek bir VlookUp gibi daha iyi bir çözüm olmasını umuyordum.

Bir İsim Range içine araç ve motor almak için aşağıdaki kullanıyorum:

Private Sub Worksheet_Change(ByVal Target As Range) 
If Intersect(Target, Columns("B:B")) Is Nothing Then Exit Sub 
Dim lRow As Integer 

lRow = Range("B" & Rows.Count).End(xlUp).Row 

Range("B3:B" & lRow).Name = "VehList" 

Range("C3:C" & lRow).Name = "CalList" 
+0

yüzden bir şey bunu beğendi yüzden 'VItem' doğru atanıp benzersiz olması gerekir olmalıdır? http://stackoverflow.com/questions/36415648/getting-the-value-of-a-listbox-to-dynamically-change-with-worksheets/36435585#36435585 –

cevap

2

basit durumlar için size VBA veya Tanımlı adları gerekmez.

düşünün:

enter image description here

Biz meyve veya köpek veya kedi birini seçmek için A1 bir açılır sahiptir. Uygun alt listeyi görüntülemek için A2'da bir açılır pencere açmak istiyoruz.

=IF(A1="fruit",C1:C4,IF(A1="dog",D1:D4,E1:E4)) 

enter image description here

Bu içinde sadece üç seçenek içindir:

Biz List seçenek ve Kaynak aşağıdaki formülle A2 ve Setup üzerine DV tıklayın birincil çekiş. Durumunuzda birincil çekmede çok fazla seçenek varsa, IF()'un bir kısıtlaması olabilir.

+0

Teşekkürler, ancak listelerim daima değerlerini değiştiriyor. Önerinizi nasıl uygulayacağınızı anlamıyorum. Ve her zaman gösterdiğim formattalar. – peetman

2

Bir referans hücre adı, bir dinamik referans hücre adı ve bazı veri doğrulama listeleri kullanarak, bunu başarabiliriz ...

Bir tablo örneği:

Vehicle      Engines      
V01  V01E01 V01E02 V01E03 V01E04 V01E05 V01E06 V01E07 
V02  V02E01 V02E02 V02E03 V02E04 V02E05 V02E06 
V03  V03E01 V03E02 V03E03 V03E04   
V04  V04E01 V04E02 V04E03 V04E04 V04E05  
V05  V05E01 V05E02 V05E03 V05E04 V05E05 V05E06 
V06  V06E01 V06E02 V06E03 V06E04 V06E05 V06E06 V06E07 
V07  V07E01 V07E02 V07E03 V07E04   
V08  V08E01 V08E02     

Araç tipleri dikey belirtti ve bunların bağımlı motorlar yatay

ben 'VE' olarak yazılmış 'Araç' vardır hücreyi adında, daha sonra ilk açılan yarattı aşağıdaki formül kullanılarak Hücre $ c $ 12 veri doğrulamayı listesi:

OFFSET =

(1,0, VE, COUNTA (1)) 1,0,10,1 (VE OFFSET) (OFFSET,) 1,0,10,1 (VE MATCH ($ C $ 12 OFFSET

= INDEX:

Sonra aşağıdaki formülü vardı 'VItem' adı verilen dinamik adlandırılmış aralık yarattı (1,0,10,1, VE), 0))

VItem bu nedenle daha sonra veri kullanılan ikinci açılır kutusu için ilk açılan kutu

belirtilen araç içeren hücre olarak atanır Şu formülle tekrar doğrulama:

= OFFSET (VItem, 0,1,1, COUNTA ((VItem, OFFSET 0,1,1,10)))

bazı notlar: listeler bağlı olarak boyutlandırılmıştır kaç olmayan Yan hücreler ofsetler içinde belirli bir aralıkta bulunurlar (bu kodda bir 10x1 hücre kümesi kullanılır). o otomatik boyutları gibi, araç listesi dikey bitişik olmalı ve yatay olarak sıralanan motorlar tekrar bitişik

Araç adları

+0

Cevabınız için teşekkür ederiz. İlk açılır listeyi çalıştırmayı başardım, ancak ikincisini değil. Bence, Motorları yatay olarak görüntülüyorsunuz ve bu soruda gördüğüm gibi dikey olarak ihtiyacım var. Formülü değiştirmeme yardım eder misiniz? Teşekkürler – peetman

İlgili konular