|
|
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
Задача в общем-то извечная, судя по поискам в архивах форума. Печать здоровенного отчета в Excel, потому как акцессовский репорт в две части на одном листе большие, по количеству полей, отчеты укладывать не умеет. Хочу понять правильно ли я действую. В Excele на одном листе отчет, на другой выгружаются данные из Accessa. Для подтягивания данных написан запрос в Excele, который, по идее, должен по установкам срабатывать при открытии книги. В Accesse написана процедура GetExel взятая из хелпов, основанная на использовании GetObject, практически без изменения. Процедура подведена под нажатие кнопки на форме, в числе некоторых других действий при нажатии кнопки - присвоение некоторым полям формы значений из других рекорсетов и т.п. Все в общем-то работает, но как-то плоховато. Часто происходит срыв Excel'я. В частности при открытии Excel' я, то обновляются данные, то нет, и тогда приходится ручками давить на обновление, то вдруг при ответе на вопрос при открытии "сохранить"-"нет"-"отмена", при нажатии на "сохранить" или "нет" сворачивает и закрывает EXcel, а при ответе на "отмена" вдруг, ни с того, ни с сего, обновляет данные. Но хуже всего то, что при попытке установить еще одну кнопку на другой форме, которая открывает этот же отчет в Excele, причем тем же способом, начинают выскакивать сообщения, типа, "База заблокирована "Admin"ом" и еще чего-то в том же духе. Короче, есть ощущение, что чего-то я делаю не то или не совсем то. Если надо могу коды сбросить. Может посмотреть еще где можно?. Форум и все ссылки с него на другие сайты честно перелопатил, но ответа на свои вопросы не нашел. Может бестолков, конечно. Но было бы не плохо услышать какой-нибудь совет. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 09:11 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
если это просто отчет то пихай туда готовые данные без формул и вычислений - просто форматированый текст ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 09:17 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
Такая проблема может быть вызвана тем, что 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 11:03 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
Забыл сказать, что это проверено при работе с Acc97, Excel97, AccXP, ExcelXP и под Win98,2000 и XP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 11:05 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
2 Kelme Спасибо. Буду разбираться в коде. Пока от его размера глаза на лоб полезли. 2 АлексейК Дык, если б я знал как пихать туда, то пихал бы. Отчет простой, в том смысле, что почти ничего в нем не считается. Только проверки, если в какой-то ячейке пусто, то и в другой пусто должно быть. Ну, и чуть-чуть хитрая система нумерации строк, потому как в некоторых местах, в зависимости от наличия или отсутствия значения в ячейке, надо нескольким строчкам присваивать одинаковый номер. Но как "просто" запихнуть данные в Excel не понимаю.:-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 11:42 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
2 Kelme. Но вообще-то Excel был закрыт. Я практически в этом уверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 11:48 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
методика такая. 1 в коде VB создаешь объект Эксел и дочерние selection итд. 2 используешь методы Эксела для внесения данных и форматирования. если не знаешь как сделать то или иное форматирование то запускаешь в экселе макрорекордер делаешь желаемое, останавливаешь, смотришь получившийся код если хочешь кину краткий пример управления экселом как объектом. хотя лично мне больше нравится выводить отчеты в ворд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 11:56 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
2 АлексейК. Если возможно, то, плз, конечно. Буду премного благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 12:58 |
|
||
|
Правильной ли дорогой я иду?
|
|||
|---|---|---|---|
|
#18+
Код: 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. это обкромсаный пример одного из отчетов. не забудь включить ссылку на библиотеку эксела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2003, 13:42 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32280596&tid=1679121]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 480ms |

| 0 / 0 |
