powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel - Имя Query
12 сообщений из 12, страница 1 из 1
Excel - Имя Query
    #33924844
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поискала на форуме, пока не нашла.
Не могу понять, где же хранится этот "счетчик"...

Когда создается Query на новом листе, ей дается автоматически имя, например,
Код: plaintext
query_from_db

Когда же пытаешься ее удалить (даже кодом на VBA), то следующей Query на этом же листе автоматически присваивается имя (если все параметры те же):
Код: plaintext
query_from_db_1
И так далее. Если этой новой меняешь имя в самом Экселе на query_from_db, то ругается, говорит, что такая таблица уже существует...
Причем, когда в командной строке смотришь сколько на листе таблиц, то можно увидеть, что только одна (меняя индекс в QueryTables(Индекс):
Код: plaintext
1.
2.
? Sheet2.QueryTables( 1 ).Name
query_from_db_1

Паталась насильно дать имя кодом:
Код: plaintext
Sheet2.QueryTables( 1 ).Name = query_from_db
В результате этого насильного наименования теперь существующая таблица имеет имя query_from_db_2. Если еще раз ей попробовать дать то же имя, то она уже будет иметь query_from_db_3, еще раз, уже query_from_db_4 и так далее. Наверняка где-то существует счетчик или запись этих имен...

Мне очень нужно при добавлении Query всегда иметь одно и то же имя, так как у меня много формул, где оно используется, и если оно постоянно динамически меняется, у меня летят все формулы.

Знает ли кто где можно поменять это имя или поставить этот счетчик в нулевое состояние?
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33924992
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда создаешь запрос, создается и именованный диапазон. Удаляя запрос, ты не удаляешь этот именованный диапазон. Если ты создаешь новый запрос с именем, соответствующим именованному диапазону, Excel добавляет цифру в конец.

Возможно причина в этом. Попробуй, после того как удаляешь запрос, удалять и именованный диапазон.

На самом деле, раз уж тебе нужно использоваться одно имя запроса, меняй свойства Connection и CommandText существующего запроса, затем обновляй его.
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33925279
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно строчечку, где фигурирует диапазон, например, как его удалить или как к нему обратиться, а то я совсем недавно с запросами работаю.
Спасибо заранее
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33925590
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Sub X()
    Dim strQuery As String
    
    strQuery = Replace(ActiveSheet.QueryTables( 1 ).Name, " ", "_")
    
    ActiveSheet.Names(strQuery).Delete
    ActiveSheet.QueryTables( 1 ).Delete
End Sub

Но, попробовав такой код, у меня не получилось решить проблему с именами (Excel 2003 SP-2). Поэтому, я все-таки склоняюсь к изменениям свойств существующего запроса.
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33925673
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже так и придется сделать...
Спасибо в любом случае.
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33941495
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один парадокс...не могу справиться...Может, у кого будут идеи???

В коде я изменяю соединение
Код: plaintext
Sheet3.QueryTables( 3 ).Connection = ....

То есть обращаюсь к Query, как надо.
Но у меня на листе три таких и каждому надо разные соединения...

Когда сохраняешь файл перед закрытием и когда его снова открываешь, порядок Query совершенно меняется. Та, что была QueryTables(3), стала QueryTables(2) и так далее. В результате у меня все соединения и таблицы перемешиваются.

Не знаете как зафиксировать Query в QueryTаbles? Или как обратиться к ним по-другому? Так как через название диапазона не получается, типа:
Код: plaintext
Sheet3.ИмяQuery.Connection = ....
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33941591
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для всех коллекций в которых находятся именованые объекты поддерживается два синтаксиса. По номеру объекта в коллекции и по его имени. То есть в твоем случае:
Код: plaintext
ActiveSheet.QueryTables("ИмяQuery").чего-то-там
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33942677
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Код: plaintext
ActiveSheet.QueryTables("ИмяQuery").чего-то-там

Ой, спасибочки огромное. Я правда, уже продумала как это обойти, но так и красивее и на 5 строчек кода меньше.

У меня вот еще проблемка. Все мои четыре Query имеют общий параметр(даты) и если им дать такие даты, что в базе данных для этих условий ничего не будет, то так как они все одновременно начинают обновляться как только меняется этот параметр, у меня вышибает Excel.
Когда я их обновляю по одной, все проходит спокойно. Только сообщение появляется, что ничего нет. А когда меняю параметр, они, мне кажется, все в одно время обновляются.
Как бы так разделить во времени их обновление? Лучше было бы как-нибудь "поймать" этот момент, когда происходит событие одновления, но я не знаю как.

Пробовала уже убрать Background Refresh для каждой, тока пока не помогает. Все равно Excel вышибает. Может, правда, не в этом проблема...
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33943993
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StagiereПробовала уже убрать Background Refresh для каждой, тока пока не помогает. Все равно Excel вышибает. Может, правда, не в этом проблема...
1) убрать Background Refresh - обязательно
2) Excel - очень падучая и ненадежная система. Увы.
...
Рейтинг: 0 / 0
Excel - Имя Query
    #33944017
Stagiere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, обнадежили

Решила не решать проблему, а избавиться от проблемы. Убрала к черту одну таблицу, вроде должны обойтись без нее (когда меньше четырех, работает отлично, ничего не вышибает).

Спасибо большое за ответы!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Excel - Имя Query
    #36759673
Braincracker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче, прикол.
Если дать программно имя оканчивающееся на QueryTable, например XXX_QueryTable, то как бы ты не удалял таблицы и имена диапазонов, все равно имя будет XXX_QueryTable_1.
Судя по всему, при создании QueryTable ей автоматом дается имя QueryTable, и когда мы делаем:
with ActiveSheet.QueryTables.Ad(...
.Name=XXX_QueryTable
...
End With
то счетчик автоматом увеличивается и имя получается с _1

Вывод:
не давайте имена оканчивающиеся на QueryTable!
...
Рейтинг: 0 / 0
Excel - Имя Query
    #36760234
Braincracker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вывод был неправильный :-)
Пока сделал так:
Кнопка bttnQueryTableCreate спрятана, а пользователю дается кнопка bttnQueryTableRefresh.
Т.е. аккуратненько создаем QueryTable, проверяем чтобы имя соответствовало объявленной константе, если появляется "..._1", то меняем константу на другую.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
'Непонятки какие-то с автопоименованием QueryTable.
'Если что-то будет не так, лучше дать другое имя- при смене имени все вроде начинает работать,
'потом если посоздавать еще таблиц, то опять перестает...
Public Const QueryTableName As String = "QueryTableData"

Sub bttnQueryTableRefresh()
    If IsQueryTableExists(QueryTableName) Then
        With ActiveSheet.QueryTables(QueryTableName)
            .CommandText = MakeSQL()
            .Refresh BackgroundQuery:=False
        End With
    End If
End Sub

Sub bttnQueryTableCreate()
    Dim q As QueryTable
    Dim n As Name
    With ActiveWorkbook.Sheets("Data") 'Имя листа на котором QueryTable
        For Each q In .QueryTables
            q.Delete
        Next q
        For Each n In .Names 'Не боимся- удаляются только локальные имена :-)
            n.Delete
        Next n
    End With
    With ActiveWorkbook.Sheets("Data").QueryTables.Add(Connection:=Array( _
            "ODBC; " & _
            "DRIVER={SQLite2009 Pro ODBC Driver}; " & _
            "Filename=" & Range("DB.Path").Text & ";"), _
            Destination:=Range("DB.InsertQueryTableHere")) 'Для удобства называем ячейку
        .Name = QueryTableName
        .FieldNames = True
        .RowNumbers = True
        .RefreshPeriod =  0 
        .AdjustColumnWidth = False
        .FillAdjacentFormulas = True
        .PreserveFormatting = True
        .BackgroundQuery = True
        .RefreshStyle = xlOverwriteCells
        '.PreserveColumnInfo = True
        '.SaveData = True
        '.SavePassword = False
        '.RefreshOnFileOpen = False
        .CommandText = MakeSQL() 'Если не сделать, то не создастся
        .Refresh BackgroundQuery:=False
    End With
End Sub

Function MakeSQL() As Variant
    MakeSQL = _
        Range("SQL.SELECT").Value & Chr( 13 ) & Chr( 10 ) & _
        Range("SQL.FROM").Value & Chr( 13 ) & Chr( 10 ) & _
        Range("SQL.WHERE").Value & Chr( 13 ) & Chr( 10 ) & _
        Range("SQL.ORDER").Value
End Function

Function IsQueryTableExists(s As String) As Boolean
    Dim q As QueryTable
    IsQueryTableExists = False
    For Each q In ActiveSheet.QueryTables 'Предполагаем, что кнопка Refresh находится на том же листе
        If StrComp(s, q.Name,  1 ) =  0  Then
            IsQueryTableExists = True
            Exit Function
        End If
    Next q
End Function
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel - Имя Query
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]