Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
32 / 32 / 3
Регистрация: 22.10.2012
Сообщений: 499

Сортировка Access VBA

22.10.2013, 12:53. Показов 3910. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Столкнулся с проблемой, никак не могу ее решить.
Из формы и таблицы в Access заполняется документ Word, все ок все работает. Но данные из подчиненной формы не сортируются по порядку при внесение в Word.
Т.е. наглядно выглядит примерно так.
Кликните здесь для просмотра всего текста

Пример заполнения:
Id|Name|Model|Art
1|My|1|.img
2|You|2|.img
3| |3|.img

Пример Вывода:
Id|Name|Model|Art
3| |3|.img
1|My|1|.img
2|You|2|.img

Код отвечающий за таблицу.
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
sq = "SELECT 0 As NumStr, Артикул, Наименование, Отделка, 'шт.' As ED, Количество, Format(Round(Цена, 0), '0.00'), Format(Скидка, '0%'), Format(Round((Количество*Цена - Количество*Цена*Скидка), 0), '0.00')  AS Сумма " & _
    "FROM Товар" & _
    " ORDER BY Товар.Код ASC" & _  'тут поидее должен был бы сортировать по Коду из подчиненной формы, сам код в запросе не используеться, но не сортирует
    " UNION " & _
    "SELECT 9998, '', 'Доставка по Москве', '', '', '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00'), '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00')" & _
    " FROM Товар" & _
    " UNION " & _
    "SELECT 9999, '', 'Итого', '', '', '', '', '', format(Round(sum(Цена*Количество - Цена*Количество*Скидка) +" & [Forms]![МКБ]![Доставка] & ", 0), '0.00') " & _
    " FROM Товар"

Код функции вывода в Word
Кликните здесь для просмотра всего текста

Visual Basic
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
'функция выгрузки в Word из запроса в таблицу
Public Function funOutputTableWordQuery(app As Object, sq$, bmName$) As Boolean
On Error GoTo Err_
Dim rstTable As DAO.Recordset
Dim i As Long, j As Long, NumStr As Long
Dim CountRec As Long
  Set rstTable = CurrentDb.OpenRecordset(sq, dbOpenSnapshot) 'открываем запрос на чтение
  rstTable.MoveLast 'переходим в конец набора строк - тем самым они гарантированно загружаются в переменную rstTable
  rstTable.MoveFirst 'возращаемся в начало набора строк
  CountRec = rstTable.RecordCount 'определяем число строк в запросе
  If CountRec > 0 Then 'смотрим, чтоб не пустой запрос
    With app.ActiveWindow.Selection 'ставим фокус на текущее окно
      .GoTo What:=-1, Name:=bmName 'wdGoToBookmark Перейти на закладку - начало втыкания данных в таблицу
      'запоминаем номер строки таблицы где стоит начальная закладка
      j = .Information(14) 'wdEndOfRangeRowNumber
      If CountRec > 1 Then
        'Вставим необходимое количество строк
        .InsertRowsBelow CountRec - 1
      End If
      'Заполняем таблицу данными из запроса
      'просто вставляем слева направо в ячейки значения столбцов запроса по порядку
      NumStr = 1
      Do While Not rstTable.EOF 'Запускаем цикл перебора столбцов запроса
        For i = 0 To rstTable.Fields.Count - 1
          If rstTable.Fields(i).Name = "NumStr" Then 'если в запросе будет столбец с именем NumStr - то вместо него в ячейку таблицы встанет порядковый номер записи
            .Tables(1).Cell(j, i + 1).Range = NumStr
          Else
            'Заполняем таблицу по координатам: номер столбца, номер строки
            .Tables(1).Cell(j, i + 1).Range = Nz(rstTable.Fields(i), "")
          End If
        Next i
        rstTable.MoveNext 'переходим на следующую запись
        NumStr = NumStr + 1 'увеличиваем номер по порядку
        j = j + 1 'увеличиваем номер координаты ячейки (номер столбца)
      Loop
    End With
  End If
  rstTable.Close 'закрываем рекордсет
  Set rstTable = Nothing
  funOutputTableWordQuery = True 'ставим флаг успешного выполнения функции
Exit_:
  Exit Function
Err_:
  funOutputTableWordQuery = False
  Err.Clear
  Resume Exit_
End Function
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2013, 12:53
Ответы с готовыми решениями:

Разница в скорости vba word и vba access
Вопрос: из акса идет выгрузка данных в файл ворд, далее эти данные опять же из акса форматно обрабатываются (данные заранее были тегированы...

Код VBA в Access 2010 работает, в Access 2007 выдает ошибку
Написала код VBA в Access 2010 - работает, в Access-2007 выдает ошибку. В чем причина - подскажите

Знаки подстановки разные в SQL Access и SQL VBA Access
Приветствую, уважаемые форумчане. Просмотрел множество сообщений о VBA и SQL, но вот так, как у меня вопрос нигде не стоял. Делаю...

10
Модератор
Эксперт MS Access
 Аватар для shanemac51
12231 / 5078 / 814
Регистрация: 07.08.2010
Сообщений: 14,937
Записей в блоге: 4
22.10.2013, 14:55
Visual Basic
1
2
3
4
5
6
7
8
9
sq = "SELECT 0 As NumStr, Артикул, Наименование, Отделка, 'шт.' As ED, Количество, Format(Round(Цена, 0), '0.00'), Format(Скидка, '0%'), Format(Round((Количество*Цена - Количество*Цена*Скидка), 0), '0.00')  AS Сумма " & _
    " FROM Товар" & _
     " UNION " & _
    " SELECT 9998, '', 'Доставка по Москве', '', '', '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00'), '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00')" & _
    " FROM Товар" & _
    " UNION " & _
    " SELECT 9999, '', 'Итого', '', '', '', '', '', format(Round(sum(Цена*Количество - Цена*Количество*Скидка) +" & [Forms]![МКБ]![Доставка] & ", 0), '0.00') " & _
    " FROM Товар" _
  " ORDER BY 1 ASC" & _  'тут поидее должен был бы сортировать по Коду из подчиненной формы, сам код в запросе не используеться, но не сортирует
0
32 / 32 / 3
Регистрация: 22.10.2012
Сообщений: 499
22.10.2013, 15:21  [ТС]
shanemac51, Увы но не работает так
Если условие сортировки ставить "1", то он работает так же как если бы этой сортировки не было бы. Т.е. как в примере что я написал выше.
Если 0 или по полю Код из таблицы Товары, то тогда таблица в Word`e не заполняется.
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.10.2013, 15:50
Компилятор запросов будет в полном недоумении от задачи сортировать запрос по полю Код, при том, что в во втором и третьем блоках Union это поле вообще отсутствует. Он искренне пытается выполнить принципиально невыполняемое. Не ругайте его, он делает, что может.

Вам надо вставить поле код в все селекты юнион (во втором и третьем блоках значения кодов надо вписывать вручную, как и с полем NumStr), обернуть запрос с юнионами в селект и дать сортировку по коду
SQL
1
2
3
SELECT NumStr, Артикул, Наименование, Отделка, ED, Количество, Сумма
FROM (SQL-текст ЗапросаСЮнионами) q
ORDER BY Код
0
32 / 32 / 3
Регистрация: 22.10.2012
Сообщений: 499
22.10.2013, 16:08  [ТС]
mobile, Если честно я немного не понял
Поле КОД, как таковое в запросе вообще не фигурирует.
Оно есть только в таблице.
Про второй и третий блок, я так понял туда нужно вписать значения поля КОД, что бы компилятор мог его отсортировать вместе с остальными данными? Но в первом же блоке поле КОД тоже не используется.
В общем я пока что вне доумение сижу пытаюсь понять.
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.10.2013, 17:04
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    sq = "select  NumStr, Артикул, Наименование, Отделка, ED, Количество, Сумма " & _
    " from " & _
    " (SELECT Код, 0 As NumStr, Артикул, Наименование, Отделка, 'шт.' As ED, Количество, Format(Round(Цена, 0), '0.00'), Format(Скидка, '0%'), Format(Round((Количество*Цена - Количество*Цена*Скидка), 0), '0.00')  AS Сумма " & _
    "FROM Товар" & _
    " UNION " & _
    "SELECT 9998, 9998, '', 'Доставка по Москве', '', '', '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00'), '', Format(" & [Forms]![МКБ]![Доставка] & ", '0.00')" & _
    " FROM Товар" & _
    " UNION " & _
    "SELECT 9999, 9999, '', 'Итого', '', '', '', '', '', format(Round(sum(Цена*Количество - Цена*Количество*Скидка) +" & [Forms]![МКБ]![Доставка] & ", 0), '0.00') " & _
    " FROM Товар) " & _
    " ORDER BY Код "
0
2 / 2 / 0
Регистрация: 14.08.2015
Сообщений: 118
20.10.2017, 14:02
Добрый день!
У меня возникла проблема в сортировке определенного поля в запросе. Есть у меня созданный запрос, из которого потом в word загружаются данные (в форме таблицы), в одном поле есть адрес места нахождения объекта, вот мне нужно, чтоб в таблицу word загружались данные в порядке сортировки (А-Я) по этому полю.
Что мне нужно изменить (добавить) в коде?

Visual Basic
1
2
3
4
5
6
7
8
              Dim baza As DAO.Database
                    Dim zap As DAO.QueryDef
                    Dim zapros As DAO.Recordset
                   
                    Set baza = CurrentDb
                    
                    Set zap = baza.QueryDefs("Данные для таблицы")
                    Set zapros = zap.OpenRecordset()
Где zapros4 - это поле, которое нужно отсортировать.
Буду очень признателен за помощь.
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.10.2017, 14:35
Mожно проще. Да и быстрее чем сортировка рекордсета
Visual Basic
1
2
3
4
5
6
Dim baza As DAO.Database
Dim s
Set baza = CurrentDb
s=baza.QueryDefs("Данные для таблицы").sql 
s="select * from (" & s & ") order by zapros4"
Set zapros = baza.OpenRecordset(s)
0
2 / 2 / 0
Регистрация: 14.08.2015
Сообщений: 118
20.10.2017, 15:12
Цитата Сообщение от mobile Посмотреть сообщение
Mожно проще. Да и быстрее чем сортировка рекордсета
"Ошибка синтаксиса в предложении FROM"
Указывает на строку
Visual Basic
1
Set zapros = baza.OpenRecordset(s)
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.10.2017, 16:08
Ага. Надо же реплейснуть точку с запятой
Visual Basic
1
2
3
4
5
6
Dim baza As DAO.Database
Dim s
Set baza = CurrentDb
s=replace (baza.QueryDefs("Данные для таблицы").sql, ";", "") 
s="select * from (" & s & ") order by zapros4"
Set zapros = baza.OpenRecordset(s)
1
2 / 2 / 0
Регистрация: 14.08.2015
Сообщений: 118
20.10.2017, 16:18
Цитата Сообщение от mobile Посмотреть сообщение
Ага. Надо же реплейснуть точку с запятой
Спасибо Вам огромное, всё заработало!))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2017, 16:18
Помогаю со студенческими работами здесь

VBA в Access
1)добавляет новую запись и заполняет её данными; 2)отыскивает нужную запись и изменяет данные в ней; 3)устанавливает фильтр и...

Access vba
подскажите, пожалуйста, какой нужен код, написанный в vba, чтобы не выводились записи у которых в столбце Свободно значение "0"?

VBA в MS Access
Я таким образом хочу при нажатии кнопки выполнять запрос, который будет выводиться в подчиненной форме, но выдает ошибку, говорит, что...

Vba в access
Вот такое представление у меня в форме, хотелось бы чтоб из одной такой формы открывалась другая по двойному нажатию на поле ( надпись) ....

VBA access
Нужно в базу 2013 access-а сделать что-нить на VBA. Но кроме того, что VBA запускается по нажатию Alt+F11 я ничего не знаю. Немножко...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru