Пожалуйста, введите следующий код в ThisWorkbook
.SetupGrantNumber может быть дополнительно запущен вручную или по кнопке или как угодно, поскольку он собирает все номера грантов для проверки данных в столбце A:
Private Sub Workbook_Open()
Call SetupGrantNumber
End Sub
2 непосредственно связанные подпрограммы могут быть размещены в модуле:
Sub SetupGrantNumber()
FRM = GetUniqueGrantNumbers()
If FRM <> "" Then
With Worksheets("IOHealthcareLinkageTemplate").Range("A2:A10000").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=FRM
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
End Sub
Function GetUniqueGrantNumbers() As String
Dim sOut As String
Dim c As Range
sOut = ""
With Worksheets("IOs")
For Each c In .Range("A2:A10000")
If InStr(1, sOut, c.Value & ",") = 0 Then
sOut = c.Value & "," & sOut
End If
Next c
End With
If sOut <> "" Then
sOut = Left(sOut, Len(sOut) - 1)
End If
GetUniqueGrantNumbers = sOut
End Function
Следующий код также должен быть помещен в «ThisWorkbook», так как он автоматически проверяет, была ли изменена какая-либо ячейка в диапазоне A: A.Затем Excel автоматически запускает SetupIOName со значением измененной ячейки:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim MonitoredCells As Range
Dim c As Range
If Sh.Name = "IOHealthcareLinkageTemplate" Then
Set MonitoredCells = Intersect(Target, Target.Parent.Range("A:A"))
If Not MonitoredCells Is Nothing Then
For Each c In MonitoredCells
If c.Value <> "" Then SetupIOName (c.Value)
Next c
End If
End If
End Sub
Следующие подпрограммы могут быть размещены вместе с вышеупомянутыми SetupGrantNumber и GetUniqueGrantNumbers в одном и том же модуле:
Sub SetupIOName(ByRef SelectedGrantNumber As String)
FRM = GetIONames(SelectedGrantNumber)
If FRM <> "" Then
With Worksheets("IOHealthcareLinkageTemplate").Range("B2:B10000").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=FRM
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
End Sub
Function GetIONames(ByRef SelectedGrantNumber As String) As String
Dim sOut As String
Dim c As Range
sOut = ""
With Worksheets("IOs")
For Each c In .Range("A2:A10000")
If c.Value = SelectedGrantNumber Then
sOut = sOut & "," & .Cells(c.Row, "C").Value
End If
Next c
End With
If sOut <> "" Then
sOut = Mid(sOut, 2)
End If
GetIONames = sOut
End Function