powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Excel + Delphi
26 сообщений из 26, показаны все 2 страниц
Excel + Delphi
    #39008002
подован2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отцы! Проблему с сортировкой в гриде кое-как поборол, спасибо, но у меня новая проблема:

Код: 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
Excel + Delphi
    #39008030
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подован2Да, у меня нет ответа на классический вопрос "а причём тут Delphi?"
Зачем это делается средствами экселя, а не дельфи?
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008119
подован2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему? Буду честен: у меня уйдут годы (если не десятилетия) на реализацию аналога этого макроса на Delphi.
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008121
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подован2 Буду честен : у меня уйдут годы (если не десятилетия) на реализацию аналога этого макроса на Delphi.
Честность не твой конек... А тот код, что выше - честно содран?
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008163
подован2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отчасти код мой, отчасти - ваш.
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008232
подован2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не бросайте меня, пожалуйста... Реально нуждаюсь в помощи.
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008233
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подован2Из БД (поле 'fio') вытягиваются пользователБД (СУБД) какая?
подован2но может кто-нибудь подскажет, как можно этот макрос разбить на два или просто обойти...Выкинь весь Дельфийский синтаксис. Отавь только чистый VB-source/
И с этим текстом обратись на "Планету Excel" - нагуглишь сам.
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008243
подован2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) MySQL + DevArt

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

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



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

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

К чему это я: учение, конечно, свет - это неоспоримая истина. Но одним и без учебников что-то даётся легко, а другим и лопатой знания не накидаешь - просто голова не та... Свои пробелы в знаниях я и так публично демонстрирую, мне о них напоминать и уж тем более тыкать меня в них носом бессмысленно. И готовый код я по-хамски тоже не прошу. Я прошу лишь посильно помочь тех, кто наверняка сталкивался с похожей ситуацией и уже нашёл из неё выход. Либо тех, у кого есть желание, а главное силы и время помочь. Ситуацию я, по-моему, описал исчерпывающе, но если есть уточняющие вопросы - рад ответить, чтобы прояснить неясное.
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008271
подован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
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008291
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подован2Код в VBA-редакторе выглядит так:
Банальный экспорт. 17749041
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008307
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подован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
Excel + Delphi
    #39008368
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я скажу правильную мысль. Ты только не обижайся. Просто повторю. Прочитай книжку про реляционные базы данных и учи SQL.

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

Ты бы лучше запрос показал, каким образом ты получаешь эти "тысячи ФИО и их id" их базы.
___________________
Кстати! Что ты будешь делать с полными тёзками?
...
Рейтинг: 0 / 0
Excel + Delphi
    #39008369
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gatorкаким образом ты получаешь эти "тысячи ФИО и их id" из базы.И какой идиот согласится править (дополнять) твой Макрос? Ешщё миллионом строк...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Excel + Delphi
    #39508540
bilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Я превращаю английские формулы 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
Excel + Delphi
    #39595025
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер, коллеги.
Есть процедура по выгрузке отчетов из грида в эксель
Сам объект экселя создается через
Код: 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
Excel + Delphi
    #39595080
у всех
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
номер билда, патчи одинаковые? - были недавно пляски с Word'ом...
...
Рейтинг: 0 / 0
Excel + Delphi
    #39595339
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у всех, да, одинаковые. Плясок не было, т.к с вордом программно не работаем. Ничего не слышал о проблемах с ним
...
Рейтинг: 0 / 0
Excel + Delphi
    #39596302
qwertEHOK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у всех пользователей так?
не зависит от офиса установленного на ПК?

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

Код: vbnet
1.
2.
  Лист1.Range("D5:G11").Merge
  If Лист1.Range("D5:G11").MergeCells Or Лист1.Range("E8").MergeCells Then MsgBox "Есть"
...
Рейтинг: 0 / 0
Excel + Delphi
    #39656523
bilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MergeCells
Код: vbnet
1.
  Лист1.Range("D5:G11").Merge 


Это же операция - объединить ячейки. А мне их объединять не нужно. Мне узнать о существовании объединенных в моей области только
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Excel + Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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