сохранить в excel - быстро

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

сохранить в excel - быстро

Сообщение amer » 05.07.2015 (Вс) 17:32

Добрый день!

Проблема такова: нужно сохранить данные, чтобы потом их можно было открыть в excel и при этом некоторые значения в ячейках были выделены (заливка желтым цветом).
данных очень много, может быть до ~ 800 000 строк
если делать так:
Код: Выделить всё
        Do Until RS.EOF
            Set rs1 = Con.OpenRecordset("SELECT * FROM tNew WHERE Nummer = '" & RS![Nummer] & "'", True)
            i = i + 1
            For M = 0 To 13
                .Range(Chr(M + 65) & i) = rs1(M)
            Next M
            If RS(2) <> rs1(2) Then
                .Range(Chr(67) & i).Select
                With .Selection.Interior
                    .ColorIndex = 6
                    .Pattern = 1
                End With
            endif
            If RS(3) <> rs1(3) Then
                .Range(Chr(68) & i).Select
                With .Selection.Interior
                    .ColorIndex = 6
                    .Pattern = 1
                End With
           endif
            If  RS(7) <> rs1(7) Then
                .Range(Chr(72) & i).Select
                With .Selection.Interior
                    .ColorIndex = 6
                    .Pattern = 1
                End With
            End If
            Label1.Caption = i & " / " & RS.RecordCount
            DoEvents
            RS.MoveNext
        Loop


получается очень долго.
может есть возможность сохранить в каком-нибудь другом формате, который поймет excel?
в текстовый файл с разделителем ";"сохраняется за секунды, но как указать на то, что нужно заливать?

или может будут какие еще идеи?
спасибо.

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: сохранить в excel - быстро

Сообщение hclubmk » 05.07.2015 (Вс) 19:44

amer писал(а):но как указать на то, что нужно заливать?

Посредством условного форматирования ячеек.
Научились ли Вы радоваться трудностям?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Re: сохранить в excel - быстро

Сообщение amer » 05.07.2015 (Вс) 19:56

это как?
сохраняю я допустим вот это
апавпв;123;ывавпа;ясмаип;1

в текстовый файл, даю ему расширение csv

как сделать чтобы при открытии в екселе поле №2 с содержимым=123 было выделено?

есть еще проблема по быстродействию: в цикле делается отбор из БД...

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: сохранить в excel - быстро

Сообщение hclubmk » 05.07.2015 (Вс) 20:09

Пожалуй, для начала нужно было бы уточнить, какая версия Excel? По моему, это работает начиная с 2007, но могу и ошибаться.
Создай макрос, который будет производить форматирование ячеек заданного диапазона, согласно твоим требованиям.
Для твоего случая, это будет выглядеть примерно так:
Код: Выделить всё
Sub Макрос1()
    Columns("B:B").Select
    Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
        Formula1:="=123"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False
End Sub

Вообще: вкладка Главная->Условное форматирование - там вариантов форматирования масса, выбирай на свой вкус.
Научились ли Вы радоваться трудностям?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Re: сохранить в excel - быстро

Сообщение amer » 05.07.2015 (Вс) 20:23

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

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: сохранить в excel - быстро

Сообщение hclubmk » 05.07.2015 (Вс) 20:47

amer я просто пытаюсь навести тебя на путь, более рациональный, чем закрашивание каждой ячейки, которую тебе надо как-то выделить. Из-за многократного обращения к требуемому диапазону, (Range) ты и получаешь "тормоза". Ты можешь загонять данные в таблицу как угодно - непосредственно через запись в ячейки (это, как ты убедился - долго), через файл-прокладку, или непосредственно, выгружая массив данных на лист. Для форматирования (читай - выделения) ячеек в Excel существуют методы, специально разработанные/предназначенные для данной задачи. Макрос - в данном случае просто пример реализации (каким ты предполагаешь, должно быть объяснение?). Где и когда ты применишь "раскрашивание" - при открытии книги, или при ее формировании - твоя импровизация. Всё что хотел сказать - нужно применять правильные методы для решения в общем-то тривиальных задач.
Научились ли Вы радоваться трудностям?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Re: сохранить в excel - быстро

Сообщение amer » 05.07.2015 (Вс) 21:00

вот, пока мое решение:
во-первых не стал выбирать записи в цикле
во-вторых формирую простенький html, который прекрасно открывается в екселе, только пока не закрашиваю ячейки, а делаю шрифт жирным
в результате 108 тыс. записей, когда пересылал в ексель - больше часа (не стал дожидаться)
когда стал формировать html - 34 минуты
в текущем варианте - 49 секунд!

Код: Выделить всё
    Dim txt() As String, str As String
    str = "tOld.Nummer , tOld.Bezeichnung , tOld.Preis , tOld.RG , " & _
       "tOld.EK , tOld.Gewicht , tOld.MVP , tOld.Ersatzt , tOld.Pfand , " & _
       "tOld.Lange , tOld.Hohe , tOld.Breite , tOld.Zusatz , tOld.Datum , " & _
       "tNew.Preis , tNew.RG , tNew.Ersatzt"
       
    Set RS = Con.OpenRecordset("Select " & str & " FROM tOld, tNew WHERE " & _
        "tOld.Nummer = tNew.Nummer and (tOld.RG <> tNew.RG or tOld.Ersatzt <> tNew.Ersatzt or tOld.Preis <> tNew.Preis)", True)
    ReDim txt(1)
    txt(0) = "<html>"
    txt(1) = "<table border=1>"
    i = 1
    Do Until RS.EOF
        i = i + 1
        ReDim Preserve txt(i)
        txt(i) = "<tr>"
        t = ""
        For M = 0 To 13
           
            Select Case M
            Case 2
                If RS(2) <> RS(14) Then t = t & "<td><b>" & RS(M) & "</b></td>"
            Case 3
                If RS(3) <> RS(15) Then t = t & "<td><b>" & RS(M) & "</b></td>"
            Case 7
                If RS(7) <> RS(16) Then t = t & "<td><b>" & RS(M) & "</b></td>"
            Case Else
                t = t & "<td>" & RS(M) & "</td>"
            End Select
        Next M
        txt(i) = txt(i) & t & "</tr>"
        Label1.Caption = i - 1 & " / " & RS.RecordCount
        DoEvents
        RS.MoveNext
    Loop
    i = i + 2
    ReDim Preserve txt(i)
    txt(i) = "</table>"
    txt(i) = "</html>"
   
   t = f & "\" & Brend & "_Marker.html"
    Open t For Output As #1
    For i = 0 To UBound(txt)
        Print #1, txt(i)
    Next i
    Close #1

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: сохранить в excel - быстро

Сообщение hclubmk » 05.07.2015 (Вс) 21:15

Ну так закрась уже
Код: Выделить всё
<td bgcolor=#ffff00>
Научились ли Вы радоваться трудностям?

amer
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 02.08.2003 (Сб) 19:41
Откуда: Воронеж

Re: сохранить в excel - быстро

Сообщение amer » 05.07.2015 (Вс) 21:37

чета не желает закрашивать
может у меня офис 2003
а может вот это <td bgcolor=#H0000FFFF> не правильно?
взял код цвета на просторах интернета, а не из васика и все заработало :)
#FFFACD

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.07.2015 (Вс) 23:10

amer писал(а):дальше проверяю отличаются ли поля в таблицах
если какие-то отличаются я их должен выделить

Вполне возможно, что требуемое сравнение может сдалать сам эксель.

amer писал(а):формирую простенький html

Брр.. Во-первых, не понял, зачем html. Во-вторых, как-то ты его подозрительно формируешь.

amer писал(а):а может вот это <td bgcolor=#H0000FFFF> не правильно?

Помимо того, что атрибут устарел, это, естественно, неправильно. Что там делает буква H и два лишних нуля?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 60

    TopList