2017-04-14 62 views
0

我在獲取數據驗證列表時遇到問題,該列表要根據行5中的最後一列進行調整。excel vba用於更新驗證列表的最後一列

這是我目前的。

Sub DataRange_F() 'Foundation Drop Down List 
Application.ScreenUpdating = False 

Dim LastCol As Long 
Dim Rng As Range 
Dim WholeRng As Range 
Dim ws As Worksheet 
Dim wsR As Worksheet 

Set ws = ThisWorkbook.Worksheets("Add New") 
Set wsR = ThisWorkbook.Worksheets("Foundation Plates") 

wsR.Activate 
Set Rng = Cells 

    LastCol = Rng.Find(What:="*", After:=Rng.Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False).Column 

    Set WholeRng = Range(Cells(5, "C"), Cells(5, LastCol)) 

    ws.Activate 
    With ws.Range("E8").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
    Operator:=xlBetween, Formula1:=WholeRng 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
    End With 

Set ws = Nothing 
Application.ScreenUpdating = True 
End Sub 

它一直停在Formula1:=部分。這是我卡住的地方。我怎樣才能在該公式中添加我的範圍?還是有另一種方式?

感謝

+0

也許'Formula1:=「=」&WholeRng.Address'? – Jeeped

+0

'Operator:= xlBetween'不需要'Formula1'和'Formula2'嗎? – Jeeped

回答

0

這是我開始工作。

Function GetColumnLetter(colNum As Long) As String 
    Dim vArr 
    vArr = Split(Cells(1, colNum).Address(True, False), "$") 
    GetColumnLetter = vArr(0) 
End Function 

Sub DataRange() 
Application.ScreenUpdating = False 

Dim startCol As String 
Dim startRow As Long 
Dim lastCol As Long 
Dim myCol As String 
Dim rng As Range 
Dim cell As Range 

Dim sht2 As Worksheet 
Set sht2 = ThisWorkbook.Worksheets("Foundation Plates") 
Dim sht7 As Worksheet 
Set sht7 = ThisWorkbook.Worksheets("Legend") 

Call Unprotect 
sht2.Activate 

startCol = "C" 
startRow = 5 
lastCol = sht2.Cells(5, sht2.Columns.Count).End(xlToLeft).Column 
myCol = GetColumnLetter(lastCol) 

Set rng = sht2.Range(startCol & startRow & ":" & myCol & "5") 

'For error checking the range 
'MsgBox rng.Address 

    sht7.Activate 
    With sht7.Range("F8").Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
    Operator:=xlBetween, Formula1:="=" & "'" & sht2.Name & "'!" & rng.Address 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .InputTitle = "" 
    .ErrorTitle = "" 
    .InputMessage = "" 
    .ErrorMessage = "" 
    .ShowInput = True 
    .ShowError = True 
    End With 

Call Protect 
sht2.Activate 

Set sht2 = Nothing 
Set sht7 = Nothing 
Set rng = Nothing 

Application.ScreenUpdating = True 
End Sub 
1

嘗試像這樣...

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ 
    Operator:=xlBetween, Formula1:="=" & "'" & wsR.Name & "'!" & WholeRng.Address 
+0

Thx,這樣做。它向數據列表添加了幾列,但不是全部。所以現在即時調試我的'WholeRng'。它沒有選擇範圍,直到結束。你有機會看到我搞砸了的東西嗎? –

+1

嘗試使用LastCol = wsR.UsedRange.Columns.Count同時檢查數據驗證,哪些範圍用作源? – sktneer

1

嘗試,因爲,

..., Formula1:=Chr(61) & WholeRng.Cells(1).Address(external:=true), Formula2:=Chr(61) & WholeRng.Cells(WholeRng.Cells.Count).Address(external:=true)