powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильной ли дорогой я иду?
10 сообщений из 10, страница 1 из 1
Правильной ли дорогой я иду?
    #32280208
JinP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача в общем-то извечная, судя по поискам в архивах форума. Печать здоровенного отчета в Excel, потому как акцессовский репорт в две части на одном листе большие, по количеству полей, отчеты укладывать не умеет. Хочу понять правильно ли я действую.
В Excele на одном листе отчет, на другой выгружаются данные из Accessa. Для подтягивания данных написан запрос в Excele, который, по идее, должен по установкам срабатывать при открытии книги.
В Accesse написана процедура GetExel взятая из хелпов, основанная на использовании GetObject, практически без изменения. Процедура подведена под нажатие кнопки на форме, в числе некоторых других действий при нажатии кнопки - присвоение некоторым полям формы значений из других рекорсетов и т.п.
Все в общем-то работает, но как-то плоховато. Часто происходит срыв Excel'я. В частности при открытии Excel' я, то обновляются данные, то нет, и тогда приходится ручками давить на обновление, то вдруг при ответе на вопрос при открытии "сохранить"-"нет"-"отмена", при нажатии на "сохранить" или "нет" сворачивает и закрывает EXcel, а при ответе на "отмена" вдруг, ни с того, ни с сего, обновляет данные.
Но хуже всего то, что при попытке установить еще одну кнопку на другой форме, которая открывает этот же отчет в Excele, причем тем же способом, начинают выскакивать сообщения, типа, "База заблокирована "Admin"ом" и еще чего-то в том же духе.
Короче, есть ощущение, что чего-то я делаю не то или не совсем то. Если надо могу коды сбросить. Может посмотреть еще где можно?. Форум и все ссылки с него на другие сайты честно перелопатил, но ответа на свои вопросы не нашел. Может бестолков, конечно. Но было бы не плохо услышать какой-нибудь совет. Спасибо.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280215
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если это просто отчет то пихай туда готовые данные без формул и вычислений - просто форматированый текст
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280356
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая проблема может быть вызвана тем, что Excel в момент экспорта может быть запущен, перед экспортом надо проверять открыт ли Excel. Причём, если ты работаешь по Win2000/XP, при просмотре в Task Manager->Applications Excela в списке запущенных приложений может и не быть, он может быть в списле процессов, его надо оттуда удалить.

В ручную это конечно утомительно каждый раз проверять, вот тебе пример кода:

Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
Private Const SW_NORMAL = 1
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_MAXIMIZE = 3
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOW = 5
Private Const SW_MINIMIZE = 6
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNA = 8
Private Const SW_RESTORE = 9
Private Const SW_SHOWDEFAULT = 10
Private Const SW_MAX = 10
Private Const WM_CLOSE = &H10
Private Const INFINITE = &HFFFFFFFF

Private Declare Function apiFindWindow Lib "user32" Alias _
"FindWindowA" (ByVal strClass As String, _
ByVal lpWindow As String) As Long

Private Declare Function apiSendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal _
wParam As Long, lParam As Long) As Long

Private Declare Function apiSetForegroundWindow Lib "user32" Alias _
"SetForegroundWindow" (ByVal hwnd As Long) As Long

Private Declare Function apiShowWindow Lib "user32" Alias _
"ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Declare Function apiIsIconic Lib "user32" Alias _
"IsIconic" (ByVal hwnd As Long) As Long

Private Declare Function apiPostMessage _
Lib "user32" Alias "PostMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) _
As Long

Private Declare Function apiWaitForSingleObject _
Lib "kernel32" Alias "WaitForSingleObject" _
(ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) _
As Long

Private Declare Function apiIsWindow _
Lib "user32" Alias "IsWindow" _
(ByVal hwnd As Long) _
As Long

Private Declare Function apiGetWindowThreadProcessId _
Lib "user32" Alias "GetWindowThreadProcessId" _
(ByVal hwnd As Long, _
lpdwProcessID As Long) _
As Long

Function fCloseApp(lpClassName As String) As Boolean
'Usage Examples:
' To close Calculator:
' ?fCloseApp("SciCalc")
'
Dim lngRet As Long, hwnd As Long, pID As Long

hwnd = apiFindWindow(lpClassName, vbNullString)
If (hwnd) Then
lngRet = apiPostMessage(hwnd, WM_CLOSE, 0, ByVal 0&)
Call apiGetWindowThreadProcessId(hwnd, pID)
Call apiWaitForSingleObject(pID, INFINITE)
fCloseApp = Not (apiIsWindow(hwnd) = 0)
End If
End Function


Function fIsAppRunning(ByVal strAppName As String, _
Optional fActivate As Boolean) As Boolean

Dim lngH As Long, strClassName As String
Dim lngX As Long, lngTmp As Long
Const WM_USER = 1024
On Local Error GoTo fIsAppRunning_Err
fIsAppRunning = False
Select Case LCase$(strAppName)
Case "excel": strClassName = "XLMain"
Case "word": strClassName = "OpusApp"
Case "access": strClassName = "OMain"
Case "powerpoint95": strClassName = "PP7FrameClass"
Case "powerpoint97": strClassName = "PP97FrameClass"
Case "notepad": strClassName = "NOTEPAD"
Case "paintbrush": strClassName = "pbParent"
Case "wordpad": strClassName = "WordPadClass"
Case Else: strClassName = ""
End Select

If strClassName = "" Then
lngH = apiFindWindow(vbNullString, strAppName)
Else
lngH = apiFindWindow(strClassName, vbNullString)
End If
If lngH <> 0 Then
apiSendMessage lngH, WM_USER + 18, 0, 0
lngX = apiIsIconic(lngH)
If lngX <> 0 Then
lngTmp = apiShowWindow(lngH, SW_SHOWNORMAL)
End If
If fActivate Then
lngTmp = apiSetForegroundWindow(lngH)
End If
fIsAppRunning = True
End If
fIsAppRunning_Exit:
Exit Function
fIsAppRunning_Err:
fIsAppRunning = False
Resume fIsAppRunning_Exit
End Function

Public Sub ExportToExcel()
If fIsAppRunning("Excel", False) Then
If MsgBox("V dannij moment zapuschen Excel! Dlja prodolzhenija raboti neobxodimo ego zakritj! Zakroite Excel i nazhmite OK, inache Excel bydet zakrit bez soxranenija tekyschix dokumentov!", vbExclamation + vbOKCancel) = vbCancel Then Exit Sub
Do While fIsAppRunning("Excel")
fCloseApp ("XLMain")
Loop
End If

End Sub
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280363
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл сказать, что это проверено при работе с Acc97, Excel97, AccXP, ExcelXP и под Win98,2000 и XP.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280458
JinP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Kelme Спасибо. Буду разбираться в коде. Пока от его размера глаза на лоб полезли.

2 АлексейК Дык, если б я знал как пихать туда, то пихал бы. Отчет простой, в том смысле, что почти ничего в нем не считается. Только проверки, если в какой-то ячейке пусто, то и в другой пусто должно быть. Ну, и чуть-чуть хитрая система нумерации строк, потому как в некоторых местах, в зависимости от наличия или отсутствия значения в ячейке, надо нескольким строчкам присваивать одинаковый номер. Но как "просто" запихнуть данные в Excel не понимаю.:-(
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280476
JinP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Kelme. Но вообще-то Excel был закрыт. Я практически в этом уверен.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280493
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
методика такая.

1 в коде VB создаешь объект Эксел и дочерние selection итд.

2 используешь методы Эксела для внесения данных и форматирования.

если не знаешь как сделать то или иное форматирование то запускаешь в экселе макрорекордер делаешь желаемое, останавливаешь, смотришь получившийся код

если хочешь кину краткий пример управления экселом как объектом.

хотя лично мне больше нравится выводить отчеты в ворд.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280596
JinP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 АлексейК. Если возможно, то, плз, конечно. Буду премного благодарен.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32280696
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Private Sub out_excel()
Dim xl As Excel.Workbook
Dim row, col
Dim summa As Double
Set xl = GetObject( "C:\base\kartochki\output.xls" ,  "Excel.sheet" )
xl.Application.Visible = True
xl.Parent.Windows( 1 ).Visible = True
If MsgBox( "Вся информация на активном листе эксел будет уничтожена. Подтвердите. " , vbYesNo) = vbNo Then Exit Sub
xl.ActiveSheet.UsedRange.Delete

xl.Application.Cells( 1 ,  1 ).Value =  "ведомость за "  & MonthName(Month(WorkDate)) &  ", "  & Year(WorkDate)
xl.Application.Columns( "a:a" ).ColumnWidth =  10 
xl.Application.Columns( "b:b" ).ColumnWidth =  40 
xl.Application.Columns( "c:c" ).ColumnWidth =  18 
xl.Application.Columns( "d:d" ).ColumnWidth =  30 

Dim temprst As New ADODB.Recordset

temprst.Open  "SELECT  ....  " , currentproject.connection , adOpenStatic, adLockReadOnly
row =  15 


Do Until temprst.EOF

row = row +  1 
xl.Application.Cells(row,  1 ).Value = row -  15 
xl.Application.Cells(row,  2 ).Value = temprst!fiofull
xl.Application.Cells(row,  4 ).Value = temprst!saved_Card_number
xl.Application.Cells(row,  3 ).NumberFormat =  "#,##0 . 00 "
xl.Application.Cells(row,  3 ).Value = temprst!rur
summa = summa + temprst!rur

temprst.MoveNext
Loop

row = row +  2 
xl.Application.Cells(row,  1 ).Value =  "Итого" 
xl.Application.Cells(row,  2 ).Value = summa


row = row +  2 
xl.Application.Cells(row,  1 ).Value =  "Руководитель:____________________" 
row = row +  2 
xl.Application.Cells(row,  2 ).Value =  "М.П." 
row = row +  2 
xl.Application.Cells(row,  1 ).Value =  "Главный бухгалтер:____________________" 

    xl.ActiveSheet.Range( "A12:D12" ).Merge
    xl.ActiveSheet.Range( "A12:D12" ).HorizontalAlignment = xlCenter
    xl.ActiveSheet.Range( "A12:D12" ).FormulaR1C1 =  "Всего: "  & funSupr(CCur(summa))


End Sub


это обкромсаный пример одного из отчетов.
не забудь включить ссылку на библиотеку эксела.
...
Рейтинг: 0 / 0
Правильной ли дорогой я иду?
    #32281065
JinP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Правильной ли дорогой я иду?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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