Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel. Потеря ActiveSheet / 25 сообщений из 42, страница 1 из 2
07.10.2010, 14:04
    #36887135
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
доброго времени суток, уважаемые

Подскажите пожалуйста существуют ли приемы условно говоря всех объектов Excel и заполнения только конкретного экземпляра?

Ситуация следущая: Имеется приложение, которое по кнопке выводит пользователю отчет с форматированием не только шапки, но и всего объема данных (условно говоря секционирование строк + форматирование по центру в первом столбце каждой секции)
в зависимости от объема данных отчет может заполняться до 50 секунд

В это время пользователь хочет работать в другом (своем) экземпляре Excel, и как только он позиционирует курсор на своем экселевом файле, то теряется ссылка на ActiveSheet, ну и возникает ошибка "Application-defined or object-defined error"

выгружать данные через буфер - не вариант, потому как не понимаю как можно будет задать указанное форматирование.

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


_________________________________
Не нужно бежать от снайпера, только умрешь уставшим(с)
...
Рейтинг: 0 / 0
07.10.2010, 14:06
    #36887138
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
видимо так ваше ПО написано, надо было делать не через ActiveSheet, а через именнованный
...
Рейтинг: 0 / 0
07.10.2010, 14:08
    #36887147
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Просто не надо работать с ActiveSheet - работать со ссылкой на конкретный лист
...
Рейтинг: 0 / 0
07.10.2010, 14:09
    #36887148
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_Oneвидимо так ваше ПО написано, надо было делать не через ActiveSheet, а через именнованный
Ну можно просто в начале макроса Set MySheet=ActiveSheet и дальше работать с MySheet
...
Рейтинг: 0 / 0
07.10.2010, 14:10
    #36887153
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Shocker.ProKonst_Oneвидимо так ваше ПО написано, надо было делать не через ActiveSheet, а через именнованный
Ну можно просто в начале макроса Set MySheet=ActiveSheet и дальше работать с MySheet

ну так и я об этом же или просто сделать уникальное имя и к нему обращаться при открытие объекта
...
Рейтинг: 0 / 0
07.10.2010, 14:14
    #36887167
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_Oneвидимо так ваше ПО написано, надо было делать не через ActiveSheet, а через именнованный

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
hwnd = FindWindow2("XLMAIN",  0 )
If hwnd =  0  Then
    Set ExcelApp = CreateObject("excel.application")
    ourexcel = True
Else
    Set ExcelApp = GetObject(, "Excel.Application")
    ourexcel = False
End If

ExcelApp.Workbooks.Add
ExcelApp.Visible = True
Set exws = ExcelApp.ActiveWorkbook.ActiveSheet
...
...
Рейтинг: 0 / 0
07.10.2010, 14:15
    #36887171
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
это я к тому, что вроде как ссылка именнованная ;)
...
Рейтинг: 0 / 0
07.10.2010, 14:15
    #36887173
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
плохо это очень, через findwindow - это вообще жесть какая-то. может сразу createobject() попробуете?
...
Рейтинг: 0 / 0
07.10.2010, 14:16
    #36887178
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_Oneплохо это очень, через findwindow - это вообще жесть какая-то. может сразу createobject() попробуете?а ты дальше второй строки смотришь?
...
Рейтинг: 0 / 0
07.10.2010, 14:17
    #36887181
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
KallandorKonst_Oneплохо это очень, через findwindow - это вообще жесть какая-то. может сразу createobject() попробуете?а ты дальше второй строки смотришь?

смотрю, но это извращение, а не код. открывайте сразу нужный вам sheet
...
Рейтинг: 0 / 0
07.10.2010, 14:18
    #36887185
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Kallandorэто я к тому, что вроде как ссылка именнованная ;)
Если дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должно
...
Рейтинг: 0 / 0
07.10.2010, 14:18
    #36887186
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_OneKallandorKonst_Oneплохо это очень, через findwindow - это вообще жесть какая-то. может сразу createobject() попробуете?а ты дальше второй строки смотришь?

смотрю, но это извращение, а не код. открывайте сразу нужный вам sheetсейчас о чем идет речь?
о макросе?
о приложении?
...
Рейтинг: 0 / 0
07.10.2010, 14:19
    #36887191
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Shocker.ProKallandorэто я к тому, что вроде как ссылка именнованная ;)
Если дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должнода, дальше работа идет только по exws и проблема возникает =)
парадокс
...
Рейтинг: 0 / 0
07.10.2010, 14:21
    #36887195
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
KallandorShocker.ProЕсли дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должнода, дальше работа идет только по exws и проблема возникает =)
парадокс
Тогда приведенных вами данных недостаточно для локализации проблемы.
...
Рейтинг: 0 / 0
07.10.2010, 14:22
    #36887198
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
KallandorShocker.ProKallandorэто я к тому, что вроде как ссылка именнованная ;)
Если дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должнода, дальше работа идет только по exws и проблема возникает =)
парадокс

я вообще не понимаю зачем вы окно excel-a пытаетесь искать, из-за этого у вас и проблемы. и объект workbook тоже можно получить при добавлении, а не юзать по ссылке ActiveWorkbook
...
Рейтинг: 0 / 0
07.10.2010, 14:28
    #36887218
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_OneKallandorShocker.ProKallandorэто я к тому, что вроде как ссылка именнованная ;)
Если дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должнода, дальше работа идет только по exws и проблема возникает =)
парадокс

я вообще не понимаю зачем вы окно excel-a пытаетесь искать, из-за этого у вас и проблемы. и объект workbook тоже можно получить при добавлении, а не юзать по ссылке ActiveWorkbook

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
'файд нужен только для определения принадлежности Excel, если Excel "наш",
' то ExcelApp.Quit и уничтожение ссылок, иначе просто уничтожение ссылок
hwnd = FindWindow2("XLMAIN",  0 )
If hwnd =  0  Then
    Set ExcelApp = CreateObject("excel.application")
    ourexcel = True
Else
    Set ExcelApp = GetObject(, "Excel.Application")
    ourexcel = False
End If

'внимательно смотрим сюда =)
ExcelApp.Workbooks.Add

ExcelApp.Visible = True
Set exws = ExcelApp.ActiveWorkbook.ActiveSheet
...

...
Рейтинг: 0 / 0
07.10.2010, 14:30
    #36887227
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Shocker.ProKallandorShocker.ProЕсли дальнейшая работа идет ТОЛЬКО с exws, то проблем с уводом фокуса пользователем быть не должнода, дальше работа идет только по exws и проблема возникает =)
парадокс
Тогда приведенных вами данных недостаточно для локализации проблемы. то есть вы сомневаетесь в моей способности локализовать проблему?

=)

Ошибка происходит при попытке установки значения в ячейку

Код: plaintext
exws.Range(Chr(i +  65 ) & CStr(excounter)) = FormatNumber(rssubtot.Fields(i).Value,  2 , vbTrue, vbFalse, vbUseDefault)

строка на которой происходит ошибка =)
...
Рейтинг: 0 / 0
07.10.2010, 14:32
    #36887232
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
ещё раз:
создавайте объект экселя сами на основе нужного вам sheet и не будет у вас проблем
...
Рейтинг: 0 / 0
07.10.2010, 14:35
    #36887239
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
> Автор: Kallandor

Привет, меч, который не меч и не меч вовсе :)

Перепиши код таким образом, чтобы исключить любое обращение с общим свойствам типа ActiveSheet, ActiveCell. Для этого
пообявляй переменные нужных типов и инициализируй их при начале работы макроса/программы.
Например так:
Код: 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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
Sub RollingData()
'
' Макрос1 Макрос
' Макрос записан 14.01.2009 (user)
'

'
Dim sCurrentFiltRange As String
Dim r As Range
Dim s As Worksheet, sh As Worksheet, shOut As Worksheet, w As Workbook, w1 As Workbook
Dim vPriznak As Variant
Dim vMonth As Variant
Dim vGroup As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set w = Application.ActiveWorkbook
Set sh = Worksheets("филиал")
sCurrentFiltRange = sh.AutoFilter.Range.Address

Set w1 = Application.Workbooks.Add
Application.DisplayAlerts = False
w1.PrecisionAsDisplayed = True
w1.Worksheets("Лист1").Delete
w.Worksheets("Результат").Delete
Application.DisplayAlerts = True

Set s = w1.Worksheets.Add
s.Name = "Лист1"
Set s = Nothing

Set s = w.Worksheets.Add
s.Name = "Результат"

' Получаем список уникальных комбинаций из
' признак филиал-Укрнафта или ещё какой-то,
' месяца оплаты, номера платёжного поручения,
' группы, вида и суммы оплаты
Set r = Worksheets("Лист1").Range("a1")
sh.Range("P:U").AdvancedFilter xlFilterCopy, , r, True
Application.DisplayAlerts = False
w1.PrecisionAsDisplayed = False
DoEvents
w1.PrecisionAsDisplayed = True
vGroup = r.Range("a2:F" + CStr(r.SpecialCells(xlCellTypeLastCell).Row -  1 )).Value2
Application.DisplayAlerts = True

w.Activate
s.Select
Dim iPriz As Long, iMonth As Long, iGr As Long, i As Long, nCurrRow As Long, bFirst As Boolean
nCurrRow =  2 
Dim ar As Areas
For iGr = LBound(vGroup) To UBound(vGroup)
    With sh.Range(sCurrentFiltRange)

        .AutoFilter Field:= 16 , Criteria1:=CStr(vGroup(iGr,  1 )) '"январь"
        .AutoFilter Field:= 17 , Criteria1:=CStr(vGroup(iGr,  2 )) '"филиал"
        .AutoFilter Field:= 18 , Criteria1:=CStr(vGroup(iGr,  3 )) '№ платежки
        .AutoFilter Field:= 19 , Criteria1:=CStr(vGroup(iGr,  4 )) '"группа"
        .AutoFilter Field:= 20 , Criteria1:=CStr(vGroup(iGr,  5 )) '"статья"
        .AutoFilter Field:= 21 , Criteria1:=Replace(Trim(Format(vGroup(iGr,  6 ), "#,##0.00")), ",", ".") 
'w1.Worksheets("Лист1").Cells(iGr + 1, 5) 'Trim(Format(vGroup(iGr, 5), "#,##0.00"))   '"62,76"
        'DoEvents
        For Each r In sh.Range(sCurrentFiltRange).SpecialCells(xlCellTypeVisible).Areas
            i = i + r.Rows.Count ' .SpecialCells(xlCellTypeVisible).Rows.Count
        Next r
        If i >  1  Then
            bFirst = True
            For Each r In sh.Range(sCurrentFiltRange).SpecialCells(xlCellTypeVisible).Areas
                If r.Rows.Count >  1  Or Not bFirst Then
                    r.Rows( 1  + - 1  * CLng(bFirst)).Copy
                    s.Select
                    s.Rows(nCurrRow).Select
                    s.Paste
                    s.Cells(nCurrRow,  21 ).Value = "=" + Replace(CStr(s.Cells(nCurrRow,  21 ).Value), ",", ".") + "*" + 
CStr(i -  1 )
                    s.Cells(nCurrRow,  31 ).Value = CStr(i -  1 )
                    nCurrRow = nCurrRow +  1 
                    Exit For
                Else
                    bFirst = False
                End If
            Next r
        Else
            i = i
        End If
        Debug.Print i -  1 , Round(CDbl(vGroup(iGr,  6 )),  2 ), CStr(vGroup(iGr,  1 )), CStr(vGroup(iGr,  2 )), CStr(vGroup(iGr, 
 3 )), CStr(iGr)
        i =  0 
    End With
Next iGr
' Отключаем автофильтры
sh.ShowAllData
' Закрываем книгу с уникальным списком
sCurrentFiltRange = w1.Name
Set w1 = Nothing
Application.DisplayAlerts = False
Application.Workbooks(sCurrentFiltRange).Close (False)
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Закончили!"
End Sub

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

Дальше, тебе сказали что глупо искать окно ексела, если можно обойтись несколькими строчками кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Try
 XLApp = Getobject(,'excel.application') && Пытаемся получить инстанс открытого ексела
Catch To oErr
 Try
  XLApp = Createobject('excel.application') && Если попали сюда, значит открытого ексела не оказалось
 Catch To oErr1
  Messagebox("Не возможно обработать данные! Нет установленного Excel!",  0 + 48 + 4096 , "Внимание!",  30000 )
  m_w = .F.
  Exit
 Endtry
Endtry
Это не VB, а FoxPro, но смысл, я думаю понятен

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.10.2010, 14:35
    #36887240
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Konst_Oneещё раз:
создавайте объект экселя сами на основе нужного вам sheet и не будет у вас проблем звучит также как: ешьте чеснок три раза в день и будет вам счастье
...
Рейтинг: 0 / 0
07.10.2010, 14:36
    #36887244
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
KallandorKonst_Oneещё раз:
создавайте объект экселя сами на основе нужного вам sheet и не будет у вас проблем звучит также как: ешьте чеснок три раза в день и будет вам счастье

что вам пытаются объяснить:
метод ExcelApp.Workbooks.Add
возвращает Workbook
использовать ActiveWorkbook НЕ НАДО
...
Рейтинг: 0 / 0
07.10.2010, 14:46
    #36887267
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Игорь Горбонос
> Автор: Kallandor

Привет, меч, который не меч и не меч вовсе :)

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

Дальше, тебе сказали что глупо искать окно ексела, если можно обойтись несколькими строчками кода.

привет =)

обращение к ActiveSheet у меня идет всего лишь один раз. Обращения к ActiveCells нет.
данные берутся из RecordSet, и обрабатываются не макросом, а приложением (приложение написано на VB6)
выделенное не поняла к чему относится =)

Shocker.Pro что вам пытаются объяснить:
метод ExcelApp.Workbooks.Add
возвращает Workbook
использовать ActiveWorkbook НЕ НАДО а как мне тогда достучаться до листа?
...
Рейтинг: 0 / 0
07.10.2010, 14:48
    #36887271
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Kallandorа как мне тогда достучаться до листа?
Чистого? WorkSheets(1)
...
Рейтинг: 0 / 0
07.10.2010, 14:49
    #36887276
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
1.
Kallandor то есть вы сомневаетесь в моей способности локализовать проблему?
2.
Kallandorто теряется ссылка на ActiveSheet, ну и возникает ошибка
3.
Kallandorда, дальше работа идет только по exws и проблема возникает
Если 3., то причем здесь 2.?

Либо проблема в другом, либо ActiveЧтоТо все же используется.
...
Рейтинг: 0 / 0
07.10.2010, 15:08
    #36887344
Kallandor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel. Потеря ActiveSheet
Shocker.Pro1.
Kallandor то есть вы сомневаетесь в моей способности локализовать проблему?
2.
Kallandorто теряется ссылка на ActiveSheet, ну и возникает ошибка
3.
Kallandorда, дальше работа идет только по exws и проблема возникает
Если 3., то причем здесь 2.?

Либо проблема в другом, либо ActiveЧтоТо все же используется. Коллега, при всем уважении к вашему искреннему желанию помочь мне в решении проблемы и ради исключения флуда и офтопа давайте сравним словари.
1. Есть ли у вас приложения написанные на VB6, которые долго и упорно что-либо пишут в Excel, с форматированием из приложения (не по макросу)?
2. Если подобные приложения имеются не могли бы вы провести эксперимент: а) открыть новый файл экселя.. что-нибудь туда записать (не закрывать) б) запустить приложение которое бы наполняло Excel в) переключиться на созданный вами файл Excel и что-либо в нем отредактировать?

3. Сообщить о результатах эксперимента. В случае возникновения ошибки (отлов ошибки в приложении должен быть предусмотрен) написать ее текс, или отловить ошибку в RunTime
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel. Потеря ActiveSheet / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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