2013-12-09 7 views
0

У меня есть именованный диапазон lstVendors, который ссылается на: = OFFSET (Data! $ W $ 2,0,0, COUNTA (Data! $ W $ 2: $ W $ 400), 1). Я хочу, чтобы этот диапазон был заполнен при открытии рабочей книги. У меня есть следующий код для этого:Невозможно использовать именованный диапазон, когда он пуст

Private Sub Workbook_Open() 
    Application.WindowState = xlMaximized 
Dim rslt() 
Dim i As Integer 
Dim n As Integer 
Dim startRng As Range 
Dim DropDown1 As DropDown 

ThisWorkbook.Sheets("Dashboard").Shapes("TextBox 6").Visible = False 
' Range("lstVendors").Offset(0, 0).Value = "Please Select..." 
' Set DropDown1 = ThisWorkbook.Sheets("Dashboard").DropDowns("Drop Down 1") 
' DropDown1.Value = 1 
On Error Resume Next 
If Not IsError(Range("lstVendors")) Then 
    Range("lstVendors").ClearContents 
End If 
On Error GoTo 0 
rslt = Application.Run("SQLite_Query", "path/to/my/sqlite", "SELECT PROGRAM_ID FROM VENDOR;") 
Set startRng = Range("lstVendors") 
i = 0 
For n = 2 To UBound(rslt) 
    Range("lstVendors").Offset(i, 0).Value = rslt(n)(0) 
    i = i + 1 
Next n 
End Sub 

Она ошибки на Set startRng = Range ("lstVendors"). Я знаю, что это потому, что в этом диапазоне ничего не происходит, когда я пытаюсь установить его, потому что, если я помещаю одну запись в именованный диапазон, набор работает, однако, мне нужно, чтобы он заполнялся sqlite-запросом на каждом открытии, поскольку данные изменения.

Любые предложения, которые были высоко оценены.

+0

Какое сообщение об ошибке вы получаете? Кроме того, я не уверен, что ваш 'On Error Resume Next' используется соответствующим образом. –

+0

Извините, это ошибка времени выполнения '1004': метод 'Range' объекта '_Global' не удался. В основном это означает, что именованный диапазон не существует, потому что он пуст. Application.Goto Worksheets («Данные»). Диапазон («lstVendors») возвращает ту же ошибку. – Methonis

+0

Является ли ошибка, потому что ваш sql не возвращает никаких результатов, так что это аннулирует часть COUNTA вашей формулы? Если да, попробуйте обернуть это в статусе Max, например: = OFFSET (данные! $ W $ 2,0,0, MAX (COUNTA (данные! $ W $ 2: $ W $ 400), 2), 1) – sous2817

ответ

0

Спасибо за предложения. Вот что я сделал, чтобы обойти мою проблему. Это связано с добавлением чего-то, что я не указывал, было бы нормально в моем первоначальном вопросе, поэтому ответ Дэвида велик, если то, что я сделал, не вариант. Сначала я заполнил первые две ячейки в моем названном диапазоне с помощью «Пожалуйста, выберите ...» и «Все». В Sub Workbook_Open() мы делаем это:

Private Sub Workbook_Open() 
Application.WindowState = xlMaximized 
Dim rslt() 
Dim i As Integer 
Dim n As Integer 
Dim startRng As Range 
Dim DropDown1 As DropDown 

' Disable our not found message 
ThisWorkbook.Sheets("Dashboard").Shapes("TextBox 6").Visible = False 
' Set our start range to our named range 
Set startRng = Range("lstVendors") 
' Grab all vendor names 
rslt = Application.Run("SQLite_Query", "path/to/my/sqlite", "SELECT PROGRAM_ID FROM VENDOR;") 
' Print result. Skip first two rows as constants "Please Select..." and "All" are populated there 
i = 2 
For n = 2 To UBound(rslt) 
    startRng.Offset(i, 0).Value = rslt(n)(0) 
    i = i + 1 
Next n 
End Sub 

Тогда мы создадим Sub Workbook_BeforeClose:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
' Disable the save changes dialog. This workbook will be locked up for display only. No need to confuse the user. 
Application.DisplayAlerts = False 
' Clear everything below the "Please Select..." and "All" cells in the named range 
On Error Resume Next 
Range("lstVendors").Offset(2, 0).ClearContents 
On Error GoTo 0 
' Save the changes to the named range 
ThisWorkbook.Save 
Application.DisplayAlerts = True 
End Sub 

Эта информация собирается для заполнения падение вниз, так что наличие Выберите и все зашиты в именованный диапазон подходит для меня. Если это условие не работает для кого-то другого, смотрящего на это в будущем, пожалуйста, используйте предложение Дэвида! Еще раз спасибо!

1

Попробуйте это. У вас есть динамический диапазон, который не оценивается после очистки содержимого. Чтобы этого избежать, существует, вероятно, несколько способов, но легко просто перекодировать переменную startRange так, чтобы она всегда указывала на адрес Data!$W$2, который (или, скорее, станет) первой ячейкой вашего диапазона lstVendors.

Private Sub Workbook_Open() 

Dim rslt() 
Dim i As Integer 
Dim n As Integer 
Dim startRng As Range 
Dim DropDown1 As DropDown 
Dim rngList As Range 

'// Define your startRange -- always will be the first cell in your named range "lstVendors" 
' hardcode the address because the dynamic range may not evalaute. 
Set startRange = Sheets("Data").Range("W2") 

'// Empty th lstVendors range if it exists/filled 
On Error Resume Next 
    Range("lstVendors").Clear 
On Error GoTo 0 

'// Run your SQL query 
rslt = Application.Run("SQLite_Query", "path/to/my/sqlite", "SELECT PROGRAM_ID FROM VENDOR;") 
i = 0 

'// Print results to the Worksheet, beginning in the startRange cell 
For n = 2 To UBound(rslt) 
    'Increment from the startRange cell 
    startRange.Offset(i, 0).Value = rslt(n)(0) 
    i = i + 1 
    'Verify that "lstVendors" is being populated 
    Debug.Print Range("lstVendors").Address 
Next n 


End Sub 
+0

Спасибо, Дэвид. Это работает, хотя я надеялся, что Excel предоставит вам возможность использовать имя в диапазоне. Выполняя это таким образом, он несколько исключает точку именованного диапазона, поскольку вам нужно сначала ссылаться на конкретное местоположение ячейки (это означает, что если я когда-либо изменю начало моего именованного диапазона, мне придется также изменить VBA). Тем не менее, я не вижу никакого способа обойти это из всего, что я пробовал. – Methonis

+0

@Methonis вы видели мое предложение выше, обертывая counta в ссылке Max: = OFFSET (Data! $ W $ 2,0,0, MAX (COUNTA (Data! $ W $ 2: $ W $ 400), 2), 1) – sous2817

+0

@ sous2817 Оператор sql возвращает ожидаемый результат. Я думаю, что я столкнулся с альтернативным решением. Будет опубликован в нескольких. Спасибо за ваши идеи. – Methonis

Смежные вопросы