Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Excel + Delphi / 25 сообщений из 26, страница 1 из 2
15.07.2015, 15:45
    #39008002
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Отцы! Проблему с сортировкой в гриде кое-как поборол, спасибо, но у меня новая проблема:

Код: pascal
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.
begin
	Excel.Modules.Add(EmptyParam, EmptyParam, 1);
	temp := 'Sub mymacros()' + #13;
	temp := temp + 'Dim a As Workbook' + #13;
	temp := temp + 'Dim lLastRow As Long' + #13;
	temp := temp + 'Dim i As Long' + #13;
	temp := temp + 'Set a = ThisWorkbook' + #13;
	temp := temp + 'lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count' + #13;
	temp := temp + 'Application.ScreenUpdating = False' + #13;
	temp := temp + 'For i = lLastRow To 1 Step -1' + #13;
	Query1.Open;
		while not Query1.Eof do
			begin
			fio:=Query1.FieldByName('fio').AsString;
			ordinal:=Query1.FieldByName('ordinal').AsString;
			temp:=temp + 'if a.Sheets("sheet1").Cells(i, 6).Text like "' + fio + '*" then a.Sheets("sheet1").Cells(i, 6) = "' + ordinal + '"' + #13;
			Query1.Next;
			end;
	temp:=temp + 'Next i' + #13;
	temp:=temp + 'End Sub' + #13;
	WorkBook.VBProject.VBComponents.Item(1).Codemodule.AddFromString(temp);
	Excel.Run('mymacros');
	CMod:=Excel.ActiveWorkbook.VBProject.VBComponents.Item(1).CodeModule;
	StartLine:=CMod.ProcStartLine['mymacros', 0];
		if StartLine > 0 then
			begin
			LineCount:=CMod.ProcCountLines['mymacros', 0];
			CMod.DeleteLines(StartLine, LineCount);
			end;
	Query1.Close;
end;



Из БД (поле 'fio') вытягиваются пользователи, и я с ними шаманю уже в пределах xls-файла. Когда пользователей было ~300 - всё было хорошо, макрос отрабатывал без единой ошибки, быстро и чётко. Но после расширения пользователей стало ~3000, и макрос выпадает с печально известной vba-ошибкой "procedure too large" :(

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



p.s.
Да, у меня нет ответа на классический вопрос "а причём тут Delphi?", но может кто-нибудь подскажет, как можно этот макрос разбить на два или просто обойти такую ошибку? Макрос мой, каюсь, безобразный и без того уже урезан до предельного минимума, но я, признаться, не силён ни в Delphi, ни в Excel, поэтому и беспокою вас сейчас.
...
Рейтинг: 0 / 0
15.07.2015, 16:06
    #39008030
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2Да, у меня нет ответа на классический вопрос "а причём тут Delphi?"
Зачем это делается средствами экселя, а не дельфи?
...
Рейтинг: 0 / 0
15.07.2015, 17:17
    #39008119
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Почему? Буду честен: у меня уйдут годы (если не десятилетия) на реализацию аналога этого макроса на Delphi.
...
Рейтинг: 0 / 0
15.07.2015, 17:19
    #39008121
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2 Буду честен : у меня уйдут годы (если не десятилетия) на реализацию аналога этого макроса на Delphi.
Честность не твой конек... А тот код, что выше - честно содран?
...
Рейтинг: 0 / 0
15.07.2015, 18:08
    #39008163
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Отчасти код мой, отчасти - ваш.
...
Рейтинг: 0 / 0
15.07.2015, 19:46
    #39008232
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Не бросайте меня, пожалуйста... Реально нуждаюсь в помощи.
...
Рейтинг: 0 / 0
15.07.2015, 19:52
    #39008233
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2Из БД (поле 'fio') вытягиваются пользователБД (СУБД) какая?
подован2но может кто-нибудь подскажет, как можно этот макрос разбить на два или просто обойти...Выкинь весь Дельфийский синтаксис. Отавь только чистый VB-source/
И с этим текстом обратись на "Планету Excel" - нагуглишь сам.
...
Рейтинг: 0 / 0
15.07.2015, 20:11
    #39008243
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
1) MySQL + DevArt

2) Макрос в чистом виде выдаёт точно такую же ошибку после, видимо, достижения сакральных 64-х килобайт. Вопрос, безусловно, исключительно в Excel, но сюда я обратился в надежде, что мне подскажут, как с помощью Delphi можно его побороть. Проблема только в том, что в Delphi я верю, а вот в себя - нет.
...
Рейтинг: 0 / 0
15.07.2015, 20:18
    #39008246
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
"Планету Excel" - нагуглил уже?
Вот и спроси там.

Ни Дельфи, ни ДевАРТ тут абсолютно ни причём.
_____________________
Пресловутая бритва Оккама.
Нафига лишние сущности?
...
Рейтинг: 0 / 0
15.07.2015, 20:34
    #39008255
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Меня и с той планеты отправят ещё дальше, как только увидят
Код: pascal
1.
2.
fio:=Query1.FieldByName('fio').AsString;
ordinal:=Query1.FieldByName('ordinal').AsString;



Вкратце: в некоем экселевском файле УЖЕ есть куча ФИО. Задача макроса сравнить эти ФИО с записями в БД, и в случае 100% совпадения вместо каждой ФИО прописать её уникальный id (то бишь соответствующий ей ordinal). Макрос, который я показываю - лишь один из нескольких (остальные занимаются предварительной косметикой, без которой никак нельзя: тримят, убирают пустые страницы, и прочее), но Excel падает только когда из MySQL вместо пары-тройки сотен приходит пара-тройка тысяч записей.
...
Рейтинг: 0 / 0
15.07.2015, 20:41
    #39008260
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2, Повторяю!
Всё делается средствами Экселя.

Вот и лезь на http://www.planetaexcel.ru/
...
Рейтинг: 0 / 0
15.07.2015, 20:42
    #39008262
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2> вместо пары-тройки сотен приходит пара-тройка тысяч записей.
Учите SQL, юноша.
...
Рейтинг: 0 / 0
15.07.2015, 21:01
    #39008270
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
У меня есть два друга: один из них мастерски, прямо-таки виртуозно владеет гитарой, хотя и личного музыкального инструмента у него нет и не было никогда, и образование у него медицинское, но он просто душой/мозгами/сердцем чувствует, что и как нужно руками делать, чтобы извлекать правильные звуки, от которых окружающие в прямом смысле балдеют. А второй друг, несмотря на все потуги, никак не может элементарные гаммы и даже нотную грамоту освоить, хотя он перепробовал уже и десяток инструкторов, и полсотни разных и видео, и аудио, и текстовых курсов в надежде хоть немного приблизиться к той магии, которую вытворяет его друг... Не дано ему и всё тут, хотя и усилия им прикладывались титанические, и желание необъятное есть, и времени уделяется больше, чем всему другому.

К чему это я: учение, конечно, свет - это неоспоримая истина. Но одним и без учебников что-то даётся легко, а другим и лопатой знания не накидаешь - просто голова не та... Свои пробелы в знаниях я и так публично демонстрирую, мне о них напоминать и уж тем более тыкать меня в них носом бессмысленно. И готовый код я по-хамски тоже не прошу. Я прошу лишь посильно помочь тех, кто наверняка сталкивался с похожей ситуацией и уже нашёл из неё выход. Либо тех, у кого есть желание, а главное силы и время помочь. Ситуацию я, по-моему, описал исчерпывающе, но если есть уточняющие вопросы - рад ответить, чтобы прояснить неясное.
...
Рейтинг: 0 / 0
15.07.2015, 21:02
    #39008271
подован2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Код в VBA-редакторе выглядит так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub mymacros()
Dim a As Workbook
Dim lLastRow As Long
Dim i As Long
Set a = ThisWorkbook
lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For i = lLastRow To 1 Step -1
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апасов К*" Then a.Sheets("sheet1").Cells(i, 6) = "157"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апатров У*" Then a.Sheets("sheet1").Cells(i, 6) = "166"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апацкий В*" Then a.Sheets("sheet1").Cells(i, 6) = "1958"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апдоров М*" Then a.Sheets("sheet1").Cells(i, 6) = "1509"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апеллесов Ю*" Then a.Sheets("sheet1").Cells(i, 6) = "340"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апель А*" Then a.Sheets("sheet1").Cells(i, 6) = "1261"
{тут ещё тысячи ФИО и их id}
Next i
End Sub
...
Рейтинг: 0 / 0
15.07.2015, 21:19
    #39008291
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2Код в VBA-редакторе выглядит так:
Банальный экспорт. 17749041
...
Рейтинг: 0 / 0
15.07.2015, 21:34
    #39008307
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
подован2Код в VBA-редакторе выглядит так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub mymacros()
Dim a As Workbook
Dim lLastRow As Long
Dim i As Long
Set a = ThisWorkbook
lLastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For i = lLastRow To 1 Step -1
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апасов К*" Then a.Sheets("sheet1").Cells(i, 6) = "157"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апатров У*" Then a.Sheets("sheet1").Cells(i, 6) = "166"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апацкий В*" Then a.Sheets("sheet1").Cells(i, 6) = "1958"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апдоров М*" Then a.Sheets("sheet1").Cells(i, 6) = "1509"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апеллесов Ю*" Then a.Sheets("sheet1").Cells(i, 6) = "340"
If a.Sheets("sheet1").Cells(i, 6).Text Like "Апель А*" Then a.Sheets("sheet1").Cells(i, 6) = "1261"
{тут ещё тысячи ФИО и их id}
Next i
End Sub



Возможно, скажу глупость, но почему бы не прочитать текущее значение ФИО и не поискать для него идентификатор в базе ? Excel это умеет.

Приведенный код мало того, что большой, так еще и медленный.
...
Рейтинг: 0 / 0
15.07.2015, 23:35
    #39008368
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Я скажу правильную мысль. Ты только не обижайся. Просто повторю. Прочитай книжку про реляционные базы данных и учи SQL.

Миллионы констант (литералов) в коде - кирдык всему.

Ты бы лучше запрос показал, каким образом ты получаешь эти "тысячи ФИО и их id" их базы.
___________________
Кстати! Что ты будешь делать с полными тёзками?
...
Рейтинг: 0 / 0
15.07.2015, 23:38
    #39008369
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Gatorкаким образом ты получаешь эти "тысячи ФИО и их id" из базы.И какой идиот согласится править (дополнять) твой Макрос? Ешщё миллионом строк...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.08.2017, 18:10
    #39508540
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Здравствуйте. Я превращаю английские формулы Excel в локальные так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TExcelReport.ReplaceFormuls;
 procedure ReplaceFormuls(CellText:string);
 var
   WorkRgn:Variant;
   s:string;
   I:integer;
 begin

    I:=0;
    repeat
    inc(I);
    WorkRgn := xls.Cells.Find(CellText, xls.Cells[1,1], xlValues, xlByRows, xlNext,0,0,0);
    if not VarIsClear(WorkRgn) then
    begin
     s := xls.Cells[WorkRgn.Row,WorkRgn.Column].FormulaR1C1 ;
     xls.Cells[WorkRgn.Row,WorkRgn.Column].FormulaR1C1 := s;
    end;
    until VarIsClear(WorkRgn) or (I>50);
 end;

begin
  ReplaceFormuls('#ИМЯ?');
  ReplaceFormuls('#NAME?');
end;


И во всех шаблонах это срабатывает, кроме одного шаблона а на нем не хочет. Он достаточно сложный и переделывать его заново очень неохота. Это наверное больше вопрос к знатокам Excel, что не так в этом шаблоне? Я его прикрепил к сообщению. Или может есть способ менять формулы на русские лучше чем делаю я
...
Рейтинг: 0 / 0
01.02.2018, 16:01
    #39595025
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Добрый вечер, коллеги.
Есть процедура по выгрузке отчетов из грида в эксель
Сам объект экселя создается через
Код: pascal
1.
CreateOleObject('Excel.Application')

Процедура выгрузки
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
//копирование данных из датасета в массив
VArray := VarArrayCreate([0, FDataSetRows + FFooterRowCount - 1, 0,
        FVisibleColumn - 1], varVariant);
aRow := 0;
while (not FDataSet.Eof) do
  begin
    aCol := 0;
    for i := 0 to (FDBGrid as TDBGrid).Columns.Count - 1 do
      if (FDBGrid as TDBGrid).Columns[i].Visible then
      begin
        try
          VArray[aRow, aCol] :=
            ArrayValue(FDataSet.FieldByName((FDBGrid as TDBGrid)
            .Columns[i].FieldName));
        except
        end;
        inc(aCol);
      end;
    FDataSet.Next;
    inc(aRow);
    Application.ProcessMessages;
  end;
//вывод данных из массива в эксель
FActiveSheet.Range[T1, T2].Value := VArray;

Собственно, непонятки возникли при следующей ситуации:
Перед выгрузкой пользователю открывается диалоговое окно, где он указывает путь, куда будет сохраняться Excel файл, а так же формат файла. При выборе .xls все проходит замечательно, а вот для .xlsx вываливается ошибка Could not convert variant of type (OleStr) into type (Double)
Все бы ничего и пусть бы выбирали старый добрый формат .xls, но в некоторые отчеты нужно выгружать огромное кол-во колонок, которые умещаются только в .xlsx
Причем на моем компе и на компах коллег программистов все замечательно формируется, а у пользователей нет. Отловить ошибку в дебаге просто не удается. Excel 2016 у всех. Есть идеи, в чем может быть проблема?
...
Рейтинг: 0 / 0
01.02.2018, 17:02
    #39595080
у всех
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
номер билда, патчи одинаковые? - были недавно пляски с Word'ом...
...
Рейтинг: 0 / 0
02.02.2018, 08:21
    #39595339
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
у всех, да, одинаковые. Плясок не было, т.к с вордом программно не работаем. Ничего не слышал о проблемах с ним
...
Рейтинг: 0 / 0
04.02.2018, 13:19
    #39596302
qwertEHOK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
у всех пользователей так?
не зависит от офиса установленного на ПК?

отказаться от CreateOleObject('Excel.Application') не хотите?
...
Рейтинг: 0 / 0
06.06.2018, 12:36
    #39656356
bilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
Здравствуйте. У меня тоже обращение к Excel CreateOleObject('Excel.Application'). Вроде бы по-научному позднее связывание это называется. А можно как-нибудь узнать есть ли в области ячеек [Y1,X1,Y2,X2] объединенные ячейки (хотябы одна участвующая в объединении). Способ через пробегание по каждой мне уже известен (xls.Cells[Y,X].MergeArea.Columns.Count). А можно без обращения к каждой ячейки? Так ведь наверное будет намного быстрее
...
Рейтинг: 0 / 0
06.06.2018, 13:12
    #39656423
MergeCells
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel + Delphi
bilov,

Код: vbnet
1.
2.
  Лист1.Range("D5:G11").Merge
  If Лист1.Range("D5:G11").MergeCells Or Лист1.Range("E8").MergeCells Then MsgBox "Есть"
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Excel + Delphi / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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