Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: После экспорта в эксель...
 
 автор: АлаяЗаря   (26.01.2011 в 14:50)   личное сообщение
 
 

Всем здрасите =)

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

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

Причем если перед закрытием эксель нажать кнопку сохранить то все ок

  Ответить  
 
 автор: АлаяЗаря   (26.01.2011 в 15:40)   личное сообщение
196 Кб.
 
 

вот код

Private Sub Кнопка0_Click()
Dim xlapp As Excel.Application
Dim xlmacro As Excel.Workbook
Dim xlbook As Excel.Workbook
Dim xlsheet As Excel.Worksheet
Dim export As String

export = CurrentProject.Path & "\экспорт " & Format(Date, "dd.mm.yyyy") & ".xls" 'Имя сохраняемого файла

If export = "" Then Exit Sub

DoCmd.OutputTo acQuery, "query1", acFormatXLS, export, False, "", 0

Set xlapp = CreateObject("Excel.Application")
Set xlbook = xlapp.Workbooks.Open(export)
Set xlsheet = xlbook.Worksheets("query1")
xlsheet.Name = "вот она"

With xlsheet

.Range(.Cells(2, 1), .Cells(12, 1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(2, 2), .Cells(12, 2)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(2, 3), .Cells(12, 3)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(13, 1), .Cells(17, 1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(13, 2), .Cells(17, 2)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(13, 3), .Cells(17, 3)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Cells.Select
.Application.Selection.Interior.ColorIndex = xlNone


With .Application.Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With .Application.Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With

.Range("A1").Select

End With

xlapp.Visible = True
xlbook.Save

Set xlapp = Nothing
Set xlbook = Nothing

End Sub

и сама БД

  Ответить  
 
 автор: shanemac51   (26.01.2011 в 16:17)   личное сообщение
 
 

интересная ситуация

- во-первых --формат екселя


xlapp.Visible = True
xlbook.SaveAs export, FileFormat:=xlExcel8, Password:="", _
WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False



во вторых ---корректура
в третьих

если сначала сохраните изменения, а затем выйдите из екселя ---------ок
иначе последние изменения ---не сохраняются
------------------------------------------------------------------------------------------
------------------------------увы--увы--увы------------------------------------------
------------------------------------------------------------------------------------------

  Ответить  
 
 автор: snipe   (26.01.2011 в 16:39)   личное сообщение
 
 

чета вход длинный
Dim dfg As Object
Dim asd As String
asd = CurrentProject.Path
Set dfg = CreateObject("Excel.Application")
dfg.Workbooks.Open (asd & "\Файл1.xls")
dfg.Visible = True
dfg.Worksheets("Лист1").Select
dfg.cells(1, 1) = "Привет мир"

да и действия там однотипные цикл можно применить

  Ответить  
 
 автор: АлаяЗаря   (27.01.2011 в 07:50)   личное сообщение
 
 


да и действия там однотипные цикл можно применить


у меня и применен сложный цикл, я просто для примера выдрал из кода... проблема то не в этом... хотя при большом объеме (7000) вы полняется около 2 минут... =(

  Ответить  
 
 автор: snipe   (27.01.2011 в 07:59)   личное сообщение
 
 

так например

for i=1 to 3
.Range(.Cells(2, i), .Cells(12, i)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge
.Range(.Cells(13, i), .Cells(17, i)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge
next i

  Ответить  
 
 автор: snipe   (27.01.2011 в 08:10)   личное сообщение
 
 

можно вот так

.Range(.Cells(2, 1), .Cells(12,1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge
.Range(.Cells(13,1), .Cells(17,1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(2, 1), .Cells(17,1)).Copy
.Range(.Cells(2, 2), .Cells(17,3)).Select
.Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
. Application.CutCopyMode = False

  Ответить  
 
 автор: АлаяЗаря   (29.01.2011 в 10:12)   личное сообщение
150 Кб.
 
 


.Range(.Cells(2, 1), .Cells(12,1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge
.Range(.Cells(13,1), .Cells(17,1)).Select
.Application.DisplayAlerts = False
.Application.Selection.Merge

.Range(.Cells(2, 1), .Cells(17,1)).Copy
.Range(.Cells(2, 2), .Cells(17,3)).Select
.Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
. Application.CutCopyMode = False



вот excel с макросом не объдинение ячеек пор определенному алгоритму (откроете поймете по какому). Тут же вопрос: если например записей ну тысяч 7, то выпонение макроса занимает ну минуты 2 у меня на ноуте (4 gb memory). можно ли облегчить макрос? или же выполнять ряд действий аксом, еще до экспорта в ексель? или тут ничего не поделаешь?

П.С. Макрос переписывал 3 раза в итоге с 8 экранов удалось опуститься на 1 =)

!!! макрос который macro1 находиться в модуле 2!!! просто macro это старый и он не работает

  Ответить  
 
 автор: АлаяЗаря   (26.01.2011 в 16:43)   личное сообщение
 
 

во первых


FileFormat:=xlExcel8

я не нашел, применил

FileFormat:=xlExcel9795

и все получилось =)

во вторых

что исправить? ну кроме того что исправил

в третьих

я вроде сначала сохраняю, потом закрываю (сохраняю через VBA), закрываю "мышкой на крестик" =))))))

я имел ввиду что если ручками сохранять то все ок, ну типа файл --> сохранить

ну и в четвертых

Спасибо =)

  Ответить  
 
 автор: АлаяЗаря   (08.02.2011 в 17:23)   личное сообщение
 
 

Обращаюсь за советом....

Пример прикреплен выше...
Собственно проблема:
в экселе происходит редактирование строк, но очень долго, если таких очень много =)
вот думаю думаю и никак не придую, как можно ускорить процесс редоктирования? может где в другом месте делать? может предварительно где то редактировать?

  Ответить  
 
 автор: Lukas   (08.02.2011 в 20:27)   личное сообщение
 
 

Можно редактировать данные в массиве (или рекордсете), затем выплевывать в Excel.
Форматы лучше изменять сразу скопом, чем поштучно. Копировать отформатированные диапазоны.
Будет быстрее.

  Ответить  
 
 автор: АлаяЗаря   (09.02.2011 в 00:23)   личное сообщение
 
 

даже не могу представить как это сделать... есть логика

объединение значения1, внутри значения1 объединение значения2, внутри значения2 объединение значения3 и так далее

и нарушать ее не могу... а скопом, я думал но пока не придумал как реализовать, ведь кроме екселя никто не объеденит...

  Ответить  
 
 автор: snipe   (09.02.2011 в 08:07)   личное сообщение
 
 

вот тут
http://hiprog.com/forum/read.php?id_forum=1&id_theme=6973&page=1
я вам делал пример который объединял ячейки
по принципу ищем диапазон объединения потом объединяем
а у вас опять по старому ячейка плюс ячейка

  Ответить  
 
 автор: АлаяЗаря   (09.02.2011 в 13:26)   личное сообщение
 
 


вот тут
http://hiprog.com/forum/read.php?id_forum=1&id_theme=6973&page=1
я вам делал пример который объединял ячейки
по принципу ищем диапазон объединения потом объединяем
а у вас опять по старому ячейка плюс ячейка



автор: АлаяЗаря (29.01.2011 в 10:12) личное сообщение - это пример макроса в эксели как вы и говорили. Я использую ваш алгоритм объединения, т.е. нахожу диапазон ячеек путем их пересчета, потом этот диапазон объединяю и так далее!

  Ответить  
 
 автор: АлаяЗаря   (09.02.2011 в 13:29)   личное сообщение
 
 


Sub macro1()

f = 2 ' объявляем начальные значение переменной
s = 1 ' объявляем начальные значение переменной
For a = 2 To 60000 'начало цикла по первому столбцу
    If Cells(a, s) = Cells(a + 1, s) Then 'проверка равенства текущей ячейки с следующей
    Else '
    Range(Cells(f, s), Cells(a, s)).Select 'объединение выявленого диапазона ячеек
    Application.DisplayAlerts = False
    Selection.Merge
        h = f '
        For d = f To 60000 '
        g = s + 1 '
            If Cells(d, g) = Cells(d + 1, g) Then '
                If d = a Then '
                Range(Cells(h, g), Cells(d, g)).Select '
                Application.DisplayAlerts = False
                Selection.Merge
                Exit For '
                Else: End If '
            Else '
            Range(Cells(h, g), Cells(d, g)).Select '
            Application.DisplayAlerts = False
            Selection.Merge
                k = h '
                For l = h To 60000 '
                n = g + 1 '
                    If Cells(l, n) = Cells(l + 1, n) Then '
                        If l = d Then '
                        Range(Cells(k, n), Cells(l, n)).Select '
                        Application.DisplayAlerts = False
                        Selection.Merge
                        Exit For '
                        Else: End If '
                    Else '
                    Range(Cells(k, n), Cells(l, n)).Select '
                    Application.DisplayAlerts = False
                    Selection.Merge
                        c = k '
                        For v = k To 60000 '
                        b = n + 1 '
                            If Cells(v, b) = Cells(v + 1, b) Then '
                                If v = l Then '
                                Range(Cells(c, b), Cells(v, b)).Select '
                                Application.DisplayAlerts = False
                                Selection.Merge
                                Exit For '
                                Else: End If '
                            Else '
                            Range(Cells(c, b), Cells(v, b)).Select '
                            Application.DisplayAlerts = False
                            Selection.Merge
                                j = c '
                                For q = c To 60000 '
                                w = b + 1 '
                                If Cells(q, w) = Cells(q + 1, w) Then '
                                If q = v Then '
                                Range(Cells(j, w), Cells(q, w)).Select '
                                Application.DisplayAlerts = False
                                Selection.Merge
                                Exit For '
                                Else: End If '
                                Else '
                                Range(Cells(j, w), Cells(q, w)).Select '
                                Application.DisplayAlerts = False
                                Selection.Merge
                                j = q + 1 '
                                If v + 1 = j Then Exit For '
                                End If '
                                Next q '
                            c = v + 1 '
                            If l + 1 = c Then Exit For '
                            End If '
                        Next v '
                    k = l + 1 '
                    If d + 1 = k Then Exit For '
                    End If '
                Next l '
            h = d + 1 '
            If a + 1 = h Then Exit For '
            End If '
        Next d '
    f = a + 1 '
    If Cells(f, s) = 0 Then Exit For '
    End If '
Next a '

End Sub '


но на 7 тысяч записей выполняется около двух - трех минут на буке, на ПК (а они не ахти) еще дольше...

  Ответить  
 
 автор: АлаяЗаря   (09.02.2011 в 13:32)   личное сообщение
 
 

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

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

  Ответить  
 
 автор: s-control   (09.02.2011 в 15:15)   личное сообщение
 
 

Что за сравнение Access и рекордсет?
Access это БД со всеми таблицами, запросами и рекордсетами.
Так, как используется технология доступа к данным DAO или ADO в данном контексте неважно.
Excel'ным движком это долго будет конечно все обрабатываться.
Лучше из рекордсета залить готовую информацию в Excel и отформатировать в Excel, но максимально подготовить массив для этого.
Правда не совсем понял условия задачи, но точно понял что большой объем.)
Также можно использовать временные таблицы создаваемые на лету, опять же все зависит от задачи. Можешь привести конкретный пример, если нетрудно.
Необходимо объединять данные из разных полей в одно поле, по условию?

  Ответить  
 
 автор: АлаяЗаря   (09.02.2011 в 17:27)   личное сообщение
 
 

пример в прикрепленном файле выше, исходные данные все есть, влом было бд создавать =) но создам и выложу....

а идеи буду пробывать....

П.С. ты открой прикрепленный файл, увидишь исход (пометка "для теста это чтобы скопировать и еще раз попробывать"), запусти макрос, увидишь результат, там вроде все понятно что и как объеденяется и по какому принципу.

  Ответить  
 
 автор: s-control   (09.02.2011 в 18:40)   личное сообщение
 
 

Извини конечно, но пример у меня как то криво работает, вообще непонятно куда все пропадает и что он там объединил.
если я правильно понял твою логику из примера на объединение, то все делается элементарно просто запросом.
Пример: в таблице есть поле Х и в этом поле например у нас следующие значения:
Х
1
2
3
3
4
5
6
6
после выполнения запроса мы получим количество строк соответсвующее разному кол-ву значений, все одинаковые значения повторяться не будут.
Сам запрос: select distinct X from tblX
тип данных может быть числовой, так и текстовый.
если есть необходимость знать сколько одинаковых значений, можно добавить вычисляемое поле Count(X)
Опять же привел пример решения, но неуверен, что правильно понял задачу.

  Ответить  
 
 автор: АлаяЗаря   (11.02.2011 в 13:16)   личное сообщение
 
 


x    y    z    g
1   2   4   10
1   2   4   10
1   2   5   10
1   2   5   10
1   2   6   10
1   2   6   10
1   3   7   10
1   3   7   10
1   3   8   10
1   3   8   10
1   3   9   10
1   3   9   10


данные столбца g должны объединяться согластно столбцу z, т.е. 10 должны объединиться внутри четверок, внутри пятерок и так далее

  Ответить  
 
 автор: s-control   (11.02.2011 в 16:55)   личное сообщение
164 Кб.
 
 

Повторяю свой же пример еще раз.
SELECT DISTINCT tbl_x.x, tbl_x.y, tbl_x.z, tbl_x.g FROM tbl_x
Прикрепил БД с запросом, все делается проще-простого.)
Удачи!

  Ответить  
 
 автор: АлаяЗаря   (11.02.2011 в 21:22)   личное сообщение
 
 

не могу сохранить пример... =((( если честно без примера не пойму как... если не сложно, выложи еще раз

открыл.... смотрю

видимо мы не правильно друг друга поняли...

мой пример выше это и есть запрос из большой таблицы, этот запрос экспортируется в эесель и далее нужно объеденить, все 1, все 2, все 3, все 4, все 5. причем сортировка уже стоит правильная.

как делаю я пример еще выше... т.е. нахожу диапазон всех 1 в столбце, объединяю, в диапазоне 1 нахожу диапазон 2, объединяю, в диапазоне 2 нахожу диапазон 4, объединяю, в диапазоне 4 нахожу диапазон 10, объеденяю.... и пошел в обратном порядке..... возвращаюсь в диапазон 2, ищу диапазон 5.... вот как то так.... мне нельзя нарушать сортировку, ведь до этого она была сделана сложным фильтром...

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

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

  Ответить  
 
 автор: s-control   (11.02.2011 в 23:46)   личное сообщение
 
 

одинаковые данные необходимо объединить сохранив изначальное количество строк?
Чего-то я не понимаю наверное, мой запрос и возвращает нужный вам результат, ну и выплевывайте его в Excel. Или принципиально именно в excel все это форматировать? Если именно форматировать в Excel, а не группировать в запросе, то собственно у вас решение уже есть. Лучше наверное не сделать. Если я правильно понял вашу цель, то могу всего лишь посоветовать вставить перед циклом и после соответсвующие строки, это сократит время выполнения цикла, так как не будут тратится ресурсы на обновление экрана. Время сократится заметно.
Application.ScreenUpdating = False
ЦИКЛ
Application.ScreenUpdating = True

  Ответить  
 
 автор: АлаяЗаря   (18.02.2011 в 07:15)   личное сообщение
 
 

Получилось у меня сделать!! диапазоны нахожу рекорд сетом, объединяю непосредственно в экселе.

  Ответить  
 
 автор: час   (18.02.2011 в 08:43)   личное сообщение
 
 

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList