10065 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
1

Делимся наработками

03.11.2009, 11:04. Показов 412892. Ответов 251
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в этой теме предлагаю выкладывать интересные наработки по акцессу...

зы. в дальнейшем на основе их можно будет создать темы "важное"

Добавлено через 45 секунд
ззы. флуд и спам в этой теме будет награжден красными карточками
17
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2009, 11:04
Ответы с готовыми решениями:

Для рубрики "Делимся наработками", добить БД поставка-сделка авто
День добрый, форумчане. Хочу довести до ума БД, чтобы добавить в раздел форума "Делимся...

Обсуждение поста #137 в теме "Делимся наработками". Программный модуль контроля ресурсов принтеров сети.
Сейчас тестовая страница на каждом принтере выдаёт эту информацию.

Строковый тип данных. С наработками. Работает, но не верно
Написать программу определения в заданной строке номера первого по порядку слова, которое короче...

Кто занимался работой с timer поделитесь пожалуйста наработками интеренсыми
Например есть форма и на форме кнопка закрыть нажимая кнопку закрыть идет отсчет 10 9 8... и когда...

251
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
05.07.2021, 13:49 181
Author24 — интернет-сервис помощи студентам
Итак, проблема.
Для написания инструкций, описания базы, для разработки необходимо иметь описание таблиц базы данных.
Штатный архивариус мне совсем не нравится. Он выдаёт или мало информации, или много, но ненужной.
Да ещё и в неудобном виде.
Когда-то давно я набрёл на одну статью, которая помогла мне решить эту проблему.

Функция получения свойств таблиц БД
Автор В.Ким
12.08.2003 г.

 Комментарий модератора 

Функция размещена в теме "Инструменты разработчика Access. Библиотека программ, надстроек и справочного материала".
Ссылка Функция получения свойств таблиц БД
0
2 / 2 / 0
Регистрация: 23.04.2022
Сообщений: 1
23.04.2022, 13:00 182
БД "Гостиница".
Может кому понадобится.
Вложения
Тип файла: rar Гостиница.rar (132.5 Кб, 567 просмотров)
2
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
27.06.2022, 21:08 183
Не знаю, пригодится кому-либо или нет. Когда-то пришлось этим заняться.

Проверка наличия таблицы в базе данных

Проверка наличия таблицы в указанной базе данных. Метод ADO.

Не забудьте для использования метода ADO добавить в References Microsoft ADO Ext. for DDL and Security и Microsoft ActiveX Data Objects Library. Их версии зависят от версий Microsoft Access и обновлений, установленных на компьютере.
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
48
49
50
51
52
53
54
55
56
57
58
59
60
'---------------------------------------------------------------------------------------
' Procedure : IsTableADO, Release 2.0
' DateTime  : 11.01.2007 16:59
' Author    : DSonnyh
' Purpose   : Проверка наличия таблицы в указанной базе данных
'---------------------------------------------------------------------------------------
'
Public Function IsTableADO(Name As String, strBase As String) As Boolean
' Name - наименование таблицы
' strBase - полный путь к файлу базы
 
    Dim cnn As ADODB.Connection
    Dim cat As ADOX.Catalog
    Dim tdf As ADOX.Table
   On Error GoTo IsTable_Error_ADO
 
    Set cnn = New ADODB.Connection
    Set cat = New ADOX.Catalog
    
    Dim strProvider As String
' строка подклюбчения
    strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=;" _
            & "Data Source=" & strBase & ";Mode=Share Deny None;" _
            & "Extended Properties=" & "''" & ";Jet OLEDB:System database=;Jet O"
    
    If strBase = CurrentProject.FullName Then
        cat.ActiveConnection = CurrentProject.Connection
       Else
        cnn.ConnectionString = strProvider
        cnn.Open
        cat.ActiveConnection = cnn.ConnectionString
    End If
        
    IsTableADO = False
    
    For Each tdf In cat.Tables
        If tdf.Name = Name Then
            IsTableADO = True
            Exit For 'Function
        End If
    Next tdf
    
    Set tdf = Nothing
    Set cat = Nothing
    
    If strBase <> CurrentProject.FullName Then
        cnn.Close
    End If
    Set cnn = Nothing
 
   On Error GoTo 0
Exit_IsTable_ADO:
   Exit Function
 
IsTable_Error_ADO:
 
    MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре IsTableADO"
    Resume Exit_IsTable_ADO
 
End Function
И вторая функция. Предназначена для тех, кто предпочитает метод DAO.

Проверка наличия таблицы в указанной базе данных. Метод DAO.

Не забудьте добавить в References ссылку на Microsoft DAO Object Library или Microsoft Office XX.X Access database engine Object Library.
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
'---------------------------------------------------------------------------------------
' Procedure : IsTableDAO, Release 2.0
' DateTime  : 15.01.2007 10:39
' Author    : DSonnyh
' Purpose   : Проверка наличия таблицы в указанной базе данных
'---------------------------------------------------------------------------------------
'
Public Function IsTableDAO(Name As String, strBase As String) As Djjlesn
' проверка на наличие определенной таблицы
' Name - наименование таблицы
' strBase - полный путь к файлу базы
   On Error GoTo IsTableDAO_Error
    Dim dbs As Database, tdf As TableDef
    
    If strBase = CurrentDb.Name Then
        Set dbs = CurrentDb
    Else
        Set dbs = DBEngine.Workspaces(0).OpenDatabase(strBase)
    End If
    
    IsTableDAO = False
    For Each tdf In dbs.TableDefs
        If tdf.Name = Name Then
            IsTableDAO = True
            Exit For
        End If
    Next tdf
    Set tdf = Nothing
    dbs.Close
    Set dbs = Nothing
 
   On Error GoTo 0
Exit_IsTableDAO:
   Exit Function
 
IsTableDAO_Error:
 
    MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре IsTableDAO"
    Resume Exit_IsTableDAO
 
End Function
Замеченные недостатки и особенности функций.
Определение наличия таблицы происходит при переборе коллекции TableDefs, поэтому скорость их работы невысока и зависит от числа элементов коллекции. У ADO в коллекцию входят все объекты базы: таблицы, запросы, макросы, формы, отчеты и т.д.
Создание коллекции TableDefs для удаленной базы методом DAO происходит несколько медленнее, чем методом ADO.

Из справки для DAO:
«…Для доступа к другой базе данных в то время, когда текущая база данных открыта в окне Microsoft Access, следует использовать метод OpenDatabase объекта Workspace. Метод OpenDatabase не открывает вторую базу данных в окне Microsoft Access, а возвращает переменную типа Database, представляющую вторую базу данных.
Примечание. В предыдущей версии Microsoft Access для получения указателя на текущую базу данных можно было использовать следующий синтаксис: DBEngine.Workspaces(0).Databases(0) или DBEngine(0)(0). В Microsoft Access 2000 для этой цели следует использовать метод CurrentDb. Метод CurrentDb создает новый экземпляр текущей базы данных, а переменная DBEngine(0)(0) ссылается на открытую копию текущей базы данных. Метод CurrentDb позволяет создавать несколько переменных типа Database, ссылающихся на текущую базу данных. Синтаксис вида DBEngine(0)(0) по-прежнему поддерживается, но во избежание конфликтов в многопользовательских базах данных использовать его не рекомендуется.»

Функции не различают прилинкованные таблицы и таблицы, находящиеся в базе.

Есть и другие способы определения наличия таблиц в базе
Для определения наличия таблицы в текущей базе
можно, также, использовать следующую функцию (NeAs)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Function IsTable(ZP_NameTable As String) As Long
' проверка на наличие определенной таблицы
' ZP_NameTable - наименование таблицы
 
    Application.Echo False 'отключаем обновление экрана
    On Error Resume Next
    DoCmd.OpenTable ZP_NameTable
    If Err.Number = 0 Then
        DoCmd.Close acTable, ZP_NameTable
    Else
        IsTable = Err.Number
    End If
    Application.Echo True
     
End Function 'IsTable
Или вот
Проверяет наличие таб. как внутри базы, так и во внешней,
как в mdb формате, так и в dbf и др.
Дает в меру интеллектуальный ответ причины не нахождения. (АлексейЕ)
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
Public Function ExistsTable(strNameTable As String, Optional ByRef strResult As String = "") As Byte
On Error Resume Next
 
    DoCmd.SetWarnings False
    DoCmd.RunSQL "Insert INTO " & strNameTable & " SELECT * FROM " & strNameTable & " WHERE 0=1"
    Select Case Err.Number
    Case 0
        ExistsTable = 0
        strResult = "Таблица существует"
    Case 3078
        ExistsTable = 1
        strResult = "Таблица отсутствует"
    Case 3024, 3011
        ExistsTable = 2
        strResult = "Не найден файл"
    Case 3044
        ExistsTable = 3
        strResult = "Указан ошибочный путь"
    Case 3343
        ExistsTable = 4
        strResult = "Нераспознаваемый формат базы данных"
    Case 3321
        ExistsTable = 5
        strResult = "Не задана база данных в строке подключения"
    Case Else
        ExistsTable = 6
        strResult = "Неизвестная ошибка"
    End Select
    Err.Clear
    DoCmd.SetWarnings True
End Function
Проверять так
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
Public Sub Test()
Dim qq As String
    Debug.Print ExistsTable("Код_сотрудников IN 'e:\Проект2007.adp'", qq); Tab; qq
    Debug.Print
    Debug.Print ExistsTable("Код_сотрудников IN 'e:\11\db120000031.mdb'", qq); Tab; qq
    Debug.Print ExistsTable("Код_сотрудников IN 'e:\db120000031.mdb'", qq); Tab; qq
    Debug.Print ExistsTable("Код_сотрудников1 IN 'e:\db12000003.mdb'", qq); Tab; qq
    Debug.Print ExistsTable("Код_сотрудников IN 'e:\db12000003.mdb'", qq); Tab; qq
    Debug.Print
    Debug.Print ExistsTable("PERSONS IN """" [dBASE IV;DATABASE=]", qq); Tab; qq
    Debug.Print ExistsTable("PERSONS IN """" [dBASE IV;DATABASE=e:\Temp\1]", qq); Tab; qq
    Debug.Print ExistsTable("PERSONS1 IN """" [dBASE IV;DATABASE=e:\Temp]", qq); Tab; qq
    Debug.Print ExistsTable("PERSONS IN """" [dBase IV;DATABASE=E:\Temp]", qq); Tab; qq
    Debug.Print
    Debug.Print ExistsTable("Таблица2", qq); Tab; qq
    Debug.Print ExistsTable("Таблица21", qq); Tab; qq
End Sub
 
 4            Нераспознаваемый формат базы данных
 
 3            Указан ошибочный путь
 2            Не найден файл
 1            Таблица отсутствует
 0            Таблица существует
 
 5            Не задана база данных в строке подключения
 3            Указан ошибочный путь
 2            Не найден файл
 0            Таблица существует
 
 0            Таблица существует
 1            Таблица отсутствует
Способ от Hauder
Возвращает: true - существует, false - нет.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function TableExist(strTableName As String) As Boolean 
Dim db As DAO.Database 
Dim i As Long 
 
TableExist = False 
Set db = CurrentDb 
With db 
  For i = 0 To .TableDefs.Count - 1 
    If .TableDefs(i).name = strTableName Then 
        TableExist = True 
        Exit For 
    End If 
  Next i 
End With 
Set db = Nothing 
End Function
Следующая функция будет перечислять таблицы в базе данных Access. Опция, использующая входную переменную bShowSys, служит для включения или исключения системных таблиц из возвращаемого списка. (Даниэля Пино)
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
'---------------------------------------------------------------------------------------
' Procedure : listTables
' Author    : CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : вернуть список всех таблиц в базе данных
' Copyright : The following code may be used as you please, but may not be resold, as
'             long as the header (Author, Website & Copyright) remains with the code.
'
' Входные переменные:
' ~~~~~~~~~~~~~~~~
' bShowSys - True/False включать или нет системные таблицы в список
'
' История изменений:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2008-June-01            Initial Release
'---------------------------------------------------------------------------------------
Function listTables(bShowSys As Boolean) As String
On Error GoTo listTables_Error
    Dim db As DAO.Database
    Dim td As DAO.TableDefs
 
    Set db = CurrentDb()
    Set td = db.TableDefs
    For Each t In td    ' цикл перебора всех таблиц 
        If Left(t.Name, 4) = "MSys" And bShowSys = False Then GoTo Continue
        If Left(t.Name, 1) = "~" And bShowSys = False Then GoTo Continue
        Debug.Print t.Name
Continue:
    Next
 
    Set td = Nothing
    Set db = Nothing
If Err.Number = 0 Then Exit Function
 
listTables_Error:
    MsgBox "MS Access обнаружил следующую ошибку" & vbCrLf & vbCrLf & "Номер ошибки: " & _
    Err.Number & vbCrLf & "Источник ошибки: listTables" & vbCrLf & "Описание ошибки: " & _
    Err.Description, vbCritical, "Произошла ошибка!"
    Exit Function
End Function
0
740 / 84 / 7
Регистрация: 06.12.2009
Сообщений: 342
29.06.2022, 14:03 184
Вот код, который отправляет сообщение из MS Access через WhatsApp. Используется протокол whatsapp://
Вложения
Тип файла: zip WhatsApp_DB.zip (25.9 Кб, 171 просмотров)
2
569 / 119 / 16
Регистрация: 04.10.2015
Сообщений: 451
29.06.2022, 20:26 185
Чтобы протестировать этот подарок, не могли бы вы выложить это в Аксе 2003 или просто выложить тексты всех модулей.
А уж перенести текст в более старую версию мы смогём. Спасибо
0
740 / 84 / 7
Регистрация: 06.12.2009
Сообщений: 342
29.06.2022, 20:37 186
Отправка сообщения через WhatsApp PC с помощью MS Access (vba):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Function IsFinal(tel As String, txt As String)
'это рабочий вариант
  Dim doc As Object 'HTMLDocument
  If tel = "" Then Exit Function
  If txt = "" Then Exit Function
  
  Set doc = CreateObject("htmlfile")
  txt = Replace(txt, """", "'")
  doc.Body.innerHTML = "<button name=""send"" type=""submit"" onclick=""document.location='whatsapp://send?phone=" & tel & "&text=" & txt & "'"">Переход по ссылке 5</button>"
  doc.All("send").Click
End Function
0
ᴁ®
Эксперт MS Access
3639 / 1997 / 424
Регистрация: 13.12.2016
Сообщений: 6,863
Записей в блоге: 5
29.06.2022, 20:37 187
andris2, там смотреть особо нечего - гора сырых импровизаций над гиперссылкой вызова.
1
569 / 119 / 16
Регистрация: 04.10.2015
Сообщений: 451
29.06.2022, 20:40 188
Цитата Сообщение от АЕ Посмотреть сообщение
там смотреть особо нечего
AE, спасибо. Вы настоящий друг
1
0 / 0 / 0
Регистрация: 02.09.2022
Сообщений: 2
26.09.2022, 21:39 189
Автоматизация «Учебной части» образовательного учреждения.

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

Сподвигло на создание такой Автоматизированной Базы Данных (далее в тексте - «АБД») использование ПК как печатных машинок в течении 30-ти лет без существенных изменений.

АБД создавалась в тесном взаимодействии с действующими сотрудниками Учебной части ОУ и максимально ориентирована на удобство, ускорение и упрощение работы сотрудников.
Работа с АБД не требует специальных знаний, кроме начального инструктажа по самой программе.

Настоящая версия АБД создавалась на основе Access MSO2003, была адаптирована для работы в среде MSO2010 и в течении 2-х лет успешно использовалась в Учебной части образовательного учреждения (около 4 000 записей).

Настоящее программное обеспечение выкладывается на условиях «Как есть» для ознакомления с возможными решениями.
Коммерческое распространение и использование полностью или частично запрещается.
Автор не несет ответственности за любой ущерб, полученный при использовании полностью или частично настоящего продукта или решений из него.

Возможности.

Основным объектом в АБД является студент (ФИО и ДР). Все изменения вносятся в базу на основании приказа по ОУ, вводимого в базу в первую очередь (номер, дата, тип). При отсутствии данных по приказу ввод других данных не будет разрешен.

Ввод данных в АБД может производится автоматизировано из файла .XLS, получаемого из автоматизированной информационной системы (АИС) «Контингент». В процессе загрузки большая часть данных приводится к формату, принятом в АБД.

Организованы два справочника: по специальностям, изучаемых в ОУ (формируется пользователем под конкретное ОУ) и по военкоматам Москвы, Московской области, а так же других регионов и областей (около 150 записей).
Еще организованы три библиотеки склонений: имен, фамилий и отчеств. В них заложены все шесть падежей, реализована работа только с дательным падежом, применяющимся в написании справок.
Запись в библиотеку производится при первом вводе склонения. (Библиотеки очищены.)

Для печати справок и документов в папке с шаблонами находятся шаблоны документов, созданных на основе соответствующих официальных бланков.

ADBase5_220923.zip

Form screenshots.zip

Работа.

Форма «Начало работы» (exe00Autoexec) служит для открытия одной из 6-ти «рабочих» форм.

Форма «Студенты» служит для зачисления, перевода по курсам, выпуску студентов индивидуально и группами. Через эту форму вносятся данные об изменении ФИО, финансировании, нахождении в академическом отпуске, отчислении и восстановлении студентов. А так же дополнительная информация: семейное положение, отношение к воинской службе, образование, место жительства.

Форма «Военный учет» служит для печати различных документов и справок для Военкоматов.

Форма «Печать справок» позволяет печатать справки общего назначения и справки для ВК. Информация о зачислении, сроке обучения, предполагаемой дате окончания, нахождении в АО и детях вносится автоматически. Журналы выдачи справок ведутся автоматически и могут быть распечатаны.

Форма «Статистика» позволяeт получить количество и список студентов в зависимости от 18-ти условий. Используется для проверки целостности данных АБД и различной документации ОУ, а также для создания отчетов, столь любимых вышестоящими организациями.

Формы «hb_MOffice» и «hb_Special» - соответственно справочники по ВК и специальностям.

Специальная Форма «exe01ImportXLS». Производит загрузку данных из таблицы .XLS, получаемую из АИС «Контингент», в АБД. В процессе загрузки производится предварительная подготовка данных и приведение их к формату, принятому в АБД. Таблица .XLS должна строго соответствовать формату таблицы приведенному в папке SourceExel.
Форма «exe01ImportXLS» должна использоваться только специалистами!

Особенности.

В форме «Студенты» 6-я вкладка пустая, оставлена как резервная.
На всех формах кнопки «StopOutput» не задействованы.
На форме «Печать справок не задействованы поле «Кол-во» и чекбокс «FreeName», так же не задействована группа полей «Дети» (задумывалась как ввод информации о детях «на лету»).
В форме «Статистика» вторая вкладка пустая (задумывалась для создания модуля печати статистических таблиц)
Вся информация о студентах очищена и введены десять технических записей для того «чтобы работало» и «посмотреть».

Конец.
0
Эксперт MS Access
7395 / 4532 / 295
Регистрация: 12.08.2011
Сообщений: 14,015
30.09.2022, 23:26 190
Цитата Сообщение от IvanRapov Посмотреть сообщение
и в течении 2-х лет успешно использовалась
А нормализовать таблицы в течении двух лет не пробовали?
С такой "нормализацией" подобные изделия заслуживают мусорной корзины, а не выставляются в наработках.
Наработки - от слова работа. А работы я у вас не вижу. Схема данных сделана за час на коленке. В ТОПКУ
0
0 / 0 / 0
Регистрация: 02.09.2022
Сообщений: 2
01.10.2022, 14:29 191
Сообщение от alvk,
А нормализовать таблицы в течении двух лет не пробовали?
С такой "нормализацией" подобные изделия заслуживают мусорной корзины, а не выставляются в наработках.
Наработки - от слова работа. А работы я у вас не вижу. Схема данных сделана за час на коленке. В ТОПКУ
Таблицы построены и связаны так, как требовалось для работы программы. Вынесение коротких повторяющихся данных из нескольких столбцов не сэкономит сколь-нибудь существенного объема базы при предполагаемых ее объемах, а вот скорость поиска и выборки увеличит, а так же усложнит их код.
Полная нормализация хороша в сложных БД, а здесь она ухудшит восприятие главной таблицы.

Чего заслуживают "подобные изделия" решать может пользователь. Таблицы БД - это всего-навсего организованное хранилище данных. Основное - это работа с данными и организация работы с БД. Просто хранилище данных пользователю не требуется.

Два замечания по теме: Смотреть не значит - видеть. В топку надо иметь, что бросать, может это 13.278 сообщений?

И еще открою тайну: Схема данных сделана не на коленке, а - на ходу.
0
Эксперт MS Access
7395 / 4532 / 295
Регистрация: 12.08.2011
Сообщений: 14,015
02.10.2022, 01:12 192
Цитата Сообщение от IvanRapov Посмотреть сообщение
Чего заслуживают "подобные изделия" решать может пользователь.
Мы не ваши пользователи. Поэтому видимо решать на нашем форуме ничего не можем?
Кончайте клоунаду.
0
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
12.10.2022, 13:54 193
Список имен листов книги Excel

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
'---------------------------------------------------------------------------------------
' Procedure : ListXlsSheets
' Author    : CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : перечислить имена листов рабочей книги Excel 
' Copyright : следующее может быть изменено и повторно использовано по вашему желанию, при условии что
'             уведомление об авторских правах остается неизменным (включая автора, веб-сайт и
'             «Авторское право»).  
'
' Входные переменные:
' ~~~~~~~~~~~~~~~~~~~
' sFile - файл Excel для списка листов
'
' Дата выпуска (гггг/мм/дд) Описание:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2008-Jul-15                 Первоначальный выпуск
'---------------------------------------------------------------------------------------
Function ListXlsSheets(sFile As String)
On Error GoTo Error_Handler
    Dim NumSheets   As Integer
    Dim i           As Integer
    Dim xlApp       As Object
    Dim xlWrkBk     As Object
    Dim xlWrkSht    As Object
 
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application") ' Привязать к существующему экземпляру Excel 
 
    If Err.Number <> 0 Then
        ' Не удалось получить экземпляр Excel, поэтому создайте новый
        Err.Clear
        On Error GoTo Error_Handler
        Set xlApp = CreateObject("excel.application")
    Else
        On Error GoTo Error_Handler
    End If
 
    xlApp.Visible = False ' сделать Excel видимым или нет для пользователя
    Set xlWrkBk = xlApp.Workbooks.Open(sFile)
 
    NumSheets = xlWrkBk.Sheets.Count
    For i = 1 To NumSheets
        Debug.Print i & " - " & xlWrkBk.Sheets(i).Name
    Next i
 
    xlWrkBk.Close False
    xlApp.Close
 
    Set xlWrkSht = Nothing
    Set xlWrkBk = Nothing
    Set xlApp = Nothing
 
Exit Function
 
Error_Handler:
    If Err.Number <> 438 Then
        MsgBox "MS Access сгенерировал следующую ошибку" & vbCrLf & vbCrLf & "Номер ошибки: " & _
        Err.Number & vbCrLf & "Источник ошибки: ListXlsSheets" & vbCrLf & "Описание ошибки: " & _
        Err.Description, vbCritical, "Произошла ошибка!"
        Exit Function
    Else
        Resume Next
    End If
 
End Function
источник
1
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
17.10.2022, 11:40 194
Нашел в своих архивах

Краткие сведения

Наименование программы: «Размещение материальных средств» (версия 1.2)
Назначение: Простая программа-основа учета наличия материальных средств в подразделениях организации. Наиболее подходит для учета средств вычислительной техники в условиях ее постоянного перемещения между подразделениями.
Средство разработки: MS Access 2000 (программа была разработана в Access 97). Программа представлена в виде mdb-файла для свободного копирования и изменения и данного файла краткого описания.
Автор: Шиндин Юрий
тел. (095) 344-44-66
E-mail: yshindin@yandex.ru
http://yshindin.narod.ru/mse.zip
Условия распространения: бесплатно с возможностью переработки и развития программы применительно к Вашим условиям (по отдельному соглашению).
Вложения
Тип файла: rar MSE2000.rar (194.7 Кб, 252 просмотров)
0
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
06.02.2023, 11:33 195
Access — VBA — Поиск вложений и многозначных полей
перевод статьи Даниэля Пино Access – VBA – Find Attachment and MultiValued Fields

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

Что такое «сложные» поля?
Проще говоря, те, которые используют магию за кулисами для хранения нескольких значений в скрытых системных таблицах. По словам Microsoft: указанное поле является многозначным типом данных

Какие поля составляют сложные/многозначные поля?
В основном, вложения и многозначные поля.

Зачем нам идентифицировать эти поля?
Я уже касался этого в прошлом, MVF — это ЗЛО. Вы никогда не захотите использовать скрытые функции, подобные этим. Вы хотите построить свою собственную структуру связанной таблицы, которой вы управляете. MVF не может быть увеличен. Привязанность приводит к вздутию живота и всегда не рекомендуется, за исключением очень ограниченного использования!).

Следовательно, когда я беру базу данных, я запускаю серию проверок, среди прочего, идентифицируя MVF, чтобы я мог просмотреть их, чтобы убедиться, что они законно занимают свое место или должны быть заменены должным образом.

Код
Код довольно прост и выполняет итерацию по каждой таблице базы данных (за исключением системных таблиц), а затем выполняет цикл по каждому полю, чтобы просмотреть свойства и распечатать те из них, которые являются «сложными».

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
'---------------------------------------------------------------------------------------
' Procedure : MVF_Find
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Identify table fields that use Complex data types (attachments, MVF)
'               so they can be eliminated!
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: None required
'
' Usage:
' ~~~~~~
' Call MVF_Find
'   Returns -> a listing of fields in the VBE Immediate Window
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2022-12-19              Initial Release
'---------------------------------------------------------------------------------------
Sub MVF_Find()
'https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/field2-iscomplex-property-dao
'https://github.com/MicrosoftDocs/office-developer-client-docs/blob/main/docs/access/desktop-database-reference/datatypeenum-enumeration-dao.md
On Error GoTo Error_Handler
    Dim db                    As DAO.Database
    Dim rs                    As DAO.Recordset
    Dim tbl                   As DAO.TableDef
    Dim fld2                  As DAO.Field2
    Dim sSQL                  As String
 
    sSQL = "SELECT MsysObjects.Name AS [ObjectName]" & vbCrLf & _
           " FROM MsysObjects" & vbCrLf & _
           " WHERE (((MsysObjects.Name Not Like '~*') " & _
           "    AND (MsysObjects.Name Not Like 'MSys*') " & _
           "    AND (MsysObjects.Name Not Like 'f_*'))" & vbCrLf & _
           "    AND (MsysObjects.Type In (1, 6)))" & vbCrLf & _
           " ORDER BY MsysObjects.Name;"
 
    Set db = CurrentDb
    Set rs = db.OpenRecordset(sSQL, dbOpenSnapshot)
    With rs
        If .RecordCount <> 0 Then
            Do While Not .EOF
                Debug.Print ![ObjectName]
                Debug.Print String(50, "-")
                Set tbl = db.TableDefs(![ObjectName])
                For Each fld2 In tbl.Fields
                    If fld2.IsComplex = True Then 'indicates whether the specified field is a multi-valued data type MVF, Attachment
                        Debug.Print , fld2.Name, FieldTypeName(fld2)
                    End If
                Next fld2
                Debug.Print
                .MoveNext
            Loop
        End If
    End With
     
Error_Handler_Exit:
    On Error Resume Next
    Set tbl = Nothing
    Set fld2 = Nothing
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    Exit Sub
  
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: MVF_Find" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Sub
Вспомогательная функция
Чтобы вернуть простой английский тип поля, я использую функцию FieldTypeName Аллена Брауна.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Function FieldTypeName(fld As DAO.Field) As String
    'Purpose: Converts the numeric results of DAO Field.Type to text.
    'Source/Copyright: Allen Browne
    'URL: http://allenbrowne.com/func-06.html
    Dim strReturn As String    'Name to return
 
    Select Case CLng(fld.Type) 'fld.Type is Integer, but constants are Long.
        Case dbBoolean: strReturn = "Yes/No"            ' 1
        Case dbByte: strReturn = "Byte"                 ' 2
        Case dbInteger: strReturn = "Integer"           ' 3
        Case dbLong                                     ' 4
            If (fld.Attributes And dbAutoIncrField) = 0& Then
                strReturn = "Long Integer"
            Else
                strReturn = "AutoNumber"
            End If
        Case dbCurrency: strReturn = "Currency"         ' 5
        Case dbSingle: strReturn = "Single"             ' 6
        Case dbDouble: strReturn = "Double"             ' 7
        Case dbDate: strReturn = "Date/Time"            ' 8
        Case dbBinary: strReturn = "Binary"             ' 9 (no interface)
        Case dbText                                     '10
            If (fld.Attributes And dbFixedField) = 0& Then
                strReturn = "Text"
            Else
                strReturn = "Text (fixed width)"        '(no interface)
            End If
        Case dbLongBinary: strReturn = "OLE Object"     '11
        Case dbMemo                                     '12
            If (fld.Attributes And dbHyperlinkField) = 0& Then
                strReturn = "Memo"
            Else
                strReturn = "Hyperlink"
            End If
        Case dbGUID: strReturn = "GUID"                 '15
 
        'Attached tables only: cannot create these in JET.
        Case dbBigInt: strReturn = "Big Integer"        '16
        Case dbVarBinary: strReturn = "VarBinary"       '17
        Case dbChar: strReturn = "Char"                 '18
        Case dbNumeric: strReturn = "Numeric"           '19
        Case dbDecimal: strReturn = "Decimal"           '20
        Case dbFloat: strReturn = "Float"               '21
        Case dbTime: strReturn = "Time"                 '22
        Case dbTimeStamp: strReturn = "Time Stamp"      '23
 
        'Constants for complex types don't work prior to Access 2007 and later.
        Case 101&: strReturn = "Attachment"         'dbAttachment
        Case 102&: strReturn = "Complex Byte"       'dbComplexByte
        Case 103&: strReturn = "Complex Integer"    'dbComplexInteger
        Case 104&: strReturn = "Complex Long"       'dbComplexLong
        Case 105&: strReturn = "Complex Single"     'dbComplexSingle
        Case 106&: strReturn = "Complex Double"     'dbComplexDouble
        Case 107&: strReturn = "Complex GUID"       'dbComplexGUID
        Case 108&: strReturn = "Complex Decimal"    'dbComplexDecimal
        Case 109&: strReturn = "Complex Text"       'dbComplexText
        Case Else: strReturn = "Field type " & fld.Type & " unknown"
    End Select
 
    FieldTypeName = strReturn
End Function
Пример использования
Чтобы использовать функцию, вы можете либо поместить курсор в функцию и нажать F5, либо ввести

Visual Basic
1
Call MVF_Find
в окне Immediate и нажмите Enter, чтобы выполнить его. В любом случае он вернет что-то вроде:

Контакты
-------------------------------------------------- -
Отдел Комплекс Текстовой
КомпанииПриложение Картин

Проекты
---------------------------------------------------------- -------
Сроки выполнения Комплексный текст
Руководители проектов Комплекс Длинные
спецификации Приложение

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

Длинный текст с добавлением только (история столбцов)
После проверки с помощью команды разработчиков свойство IsComplex НЕ возвращает значение true для длинного текста (памятки), если для свойства Append Only задано значение Yes. Причина в том, что такие поля не возвращают свое свойство Value, поэтому информация недоступна через автоматизацию, поэтому они не возвращают, что они сложны. Это еще одно вопиющее упущение команды разработчиков Access! Таким образом, на самом деле свойство IsComplex недопустимо, поскольку такие столбцы действительно являются сложными, но оно возвращает False! Какой БЕСПОРЯДОК! Таким образом, свойство IsComplex работает для некоторых «сложных» полей, но не для всех. Так в чем собственно смысл?!

Это просто еще один яркий пример проблем с такими полями и того, как вы не можете работать с ними, как с правильно построенным реляционным набором данных 1-n, который вы создаете сами!

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

Мораль этой истории всегда остается неизменной: не используйте их в первую очередь, и если вы обнаружите их в базах данных, которые вы берете на себя, настоятельно рассмотрите возможность замены должным образом нормализованной структурой вашего собственного создания, которая, таким образом, может быть полностью автоматизирована. и увеличенный в случае необходимости!
0
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
14.03.2023, 12:54 196
Закрыть все открытые отчёты

Наткнулся тут недавно у Даниэля Пино на несколько простеньких функций: "Закрытие всех таблиц", "Закрытие всех форм", "Закрытие всех отчётов", "Закрытие всех запросов", "Закрытие всех макросов"
Вспомнил, что у меня было нечто подобное. Иногда при отладке откроешь кучу таблиц, запросов, а потом надо срочно закругляться и начинаешь срочно тыкать в свёрнутые таблицы, разворачивать, закрывать.
Потом я подцепил все эти функции на макрос, и в случае нужды запускаю его.
Итак здесь моя функция закрытия отчётов, немного причёсанная и функция Даниэля Пино
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
Function CloseAllOpenReports() As Boolean
 
    On Error GoTo Error_CloseAllOpenReports
    
    Dim objRpts               As Object
    Dim objRpt                As Access.Report
    Dim strRptName()          As String
    Dim lngRptCount           As Long
    Dim i                     As Long
 
    Set objRpts = Application.Reports
    lngRptCount = objRpts.Count
    ReDim strRptName(lngRptCount)
 
    For Each objRpt In objRpts
        i = i + 1
        strRptName(i) = objRpt.Name
    Next objRpt
    
    For i = 1 To lngRptCount
        DoCmd.Close acReport, strRptName(i), acSaveNo
    Next i
    
    CloseAllOpenReports = True
 
Error_CloseAllOpenReports_Exit:
 
    On Error Resume Next
    
    Set objRpt = Nothing
    Set objRpts = Nothing
    
    Exit Function
 
Error_CloseAllOpenReports:
    
    MsgBox "Error Function: CloseAllOpenReports" & vbCrLf & _
           "Error Number: " & err.Number & vbCrLf & _
           "Error Description: " & err.Description
    
    Resume Error_CloseAllOpenReports_Exit
 
End Function
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
'---------------------------------------------------------------------------------------
' Procedure : CloseAllOpenReports
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Close all the currently open Reports in the database
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: None required
'
' Usage:
' ~~~~~~
' ? CloseAllOpenReports
'   Returns -> True     => Closed all Reports successfully
'              False    => A problem occurred
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2015-02-17              Initial Release
' 2         2023-02-09              Update variable naming, Error handler, copyright
' 3         2023-03-13              Changed approach as For each rpt in Reports skips
'                                       objects
'---------------------------------------------------------------------------------------
Function CloseAllOpenReports() As Boolean
    On Error GoTo Error_Handler
    Dim i                     As Long
 
    For i = Application.Reports.Count - 1 To 0 Step -1
        DoCmd.Close acReport, Reports(i).Name, acSaveNo
    Next i
 
    CloseAllOpenReports = True
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: CloseAllOpenReports" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Запускаются функции одинаково
Visual Basic
1
Call CloseAllOpenReports
или
Visual Basic
1
2
3
If CloseAllOpenReports = True Then
    '...
End If
По идее функция Даниэля Пино должна работать быстрее. В моей функции сначала создаётся список отчётов перебором, а потом он закрывается опять перебором. Два цикла вместо одного. Но в то же время при удалении отчёта в функции Даниэля Пино каждый раз обновляется коллекция Application.Reports и что будет работать быстрее, сразу не скажешь надо тестировать.

Ну и адрес источника Access – VBA – Close All Open Reports
0
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
15.03.2023, 12:22 197
Цитата Сообщение от Silur Посмотреть сообщение
...а потом надо срочно закругляться и начинаешь срочно тыкать в свёрнутые таблицы, разворачивать, закрывать...
Возможно я не понял сакральный смысл поочередного закрытия всего и вся, но если по мне, то значительно быстрее и проще ткнуть в крестик самого приложения, всЁ само собой и закроется.
Затем снова открыть приложение.
А то ищи ту форму, в где эти самые чего то там кнопки для закрытия.
0
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
15.03.2023, 13:29 198
Цитата Сообщение от VinniPuh Посмотреть сообщение
Возможно я не понял сакральный смысл поочередного закрытия всего и вся, но если по мне, то значительно быстрее и проще ткнуть в крестик самого приложения, всЁ само собой и закроется.
А я в большинстве своих программ блокирую этот крестик. У меня есть программы, которые требуют закрытие открытых форм в определённом порядке. Да и дисциплинирует это пользователей. А то были у меня деятели, которые любили закрывать программы из любого места таким крестиком. А у меня есть программы, где определённые данные из дочерней формы при закрытии передаются в родительскую. Потом эти данные там обрабатывались.

Впрочем, это моё мнение, что и как делать. Можно ведь закрыть задачу и через меню "Файл". Но не все это помнят.
0
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
15.03.2023, 14:42 199
Цитата Сообщение от Silur Посмотреть сообщение
...А я в большинстве своих программ блокирую этот крестик...
Это конечно дело каждого, но всяческие трудности, в виде блокирования и скрытия функционала, предпочитаю делать не в начале разработки, а по окончании, ибо это только затрудняет работу разработчика, ибо увеличивается время и количество зачастую дополнительных и ненужных действий.
0
734 / 204 / 12
Регистрация: 16.01.2014
Сообщений: 672
17.03.2023, 10:03 200
Ну, продолжу потихоньку

Закрыть все открытые формы

Код от Даниэля Пино
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
'---------------------------------------------------------------------------------------
' Procedure : CloseAllOpenForms
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Close all the currently open Forms in the database
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: None required
'
' Usage:
' ~~~~~~
' ? CloseAllOpenForms
'   Returns -> True     => Closed all Forms successfully
'              False    => A problem occurred
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2015-02-17              Initial Release
' 2         2023-02-09              Update variable naming, Error handler, copyright
' 3         2023-03-13              Changed approach as For each frm in frms skips
'                                       objects
'---------------------------------------------------------------------------------------
Function CloseAllOpenForms() As Boolean
    On Error GoTo Error_Handler
    Dim i As Long
 
    For i = Application.Forms.Count - 1 To 0 Step -1
        DoCmd.Close acForm, Forms(i).Name, acSaveNo
    Next i
    
    CloseAllOpenForms = True
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: CloseAllOpenForms" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
ну и мой код
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
Function CloseAllOpenForms() As Boolean
    On Error GoTo Error_CloseAllOpenForms
    
    Dim objFrms               As Object
    Dim objFrm                As Access.Form
    Dim strFormName()         As String
    Dim lngFormCount          As Long
    Dim i                     As Long
 
    Set objFrms = Application.Forms    'Collection of all the open forms
    lngFormCount = objFrms.Count
    ReDim strFormName(lngFormCount)
    
    For Each objFrm In objFrms    'Loop all the forms
        i = i + 1
        strFormName(i) = objFrm.Name
    Next objFrm
    
    For i = 1 To lngFormCount
        DoCmd.Close acForm, strFormName(i), acSaveNo
    Next i
    
    CloseAllOpenForms = True
 
Error_CloseAllOpenForms_Exit:
    On Error Resume Next
    Set objFrm = Nothing
    Set objFrms = Nothing
    Exit Function
 
Error_CloseAllOpenForms:
    MsgBox "Error Function: CloseAllOpenForms" & vbCrLf & _
           "Error Number: " & err.Number & vbCrLf & _
           "Error Description: " & err.Description
    Resume Error_CloseAllOpenForms_Exit
End Function
Вызов одинаковый
Visual Basic
1
Call CloseAllOpenForms
или
Visual Basic
1
2
3
If CloseAllOpenForms= True Then
    '...
End If
Источник MS Access – VBA – Close All Open Forms

Ну и для VinniPuh, когда разрабатываешь новую программу, то естественно, все красивости включаешь в конце. А если правишь уже готовую? Некоторые программы я сопровождаю уже по 15 лет. В одной - 208 версий и доработок. И как тут быть?
У меня сделана функция fnStart, которую я запускаю из макроса autoexec. Там у меня всё прописано: вывод названия, иконки, подключение таблиц, отключение крестика. Так, что мне проще сделать макрос "Закрыть всё" и вызывать из него соответствующие функции, чем искать по тексту и отключат/включать соответствующие функции.
Ну, мне так удобнее.
0
17.03.2023, 10:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2023, 10:03
Помогаю со студенческими работами здесь

Делимся.
Доброго времени суток всем посетителям этой темы!=) Хочу попросить вас поделиться самой...

Делимся vpn)
Ребят, накидайте vpn серверов работающих на просторах СНГ.

Делимся опытом
Добрый день! Давайте делиться мыслями о разработках, которые прямо не используются в работе, но...

Делимся знаниями по С++
По вашему зачем нужна виртуальная функция в программе? Какой от нее толк если она вызывается как...


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru