Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Вниз

последняя строка Excel   Найти похожие ветки 

 
Фуфик   (2009-10-19 10:04) [0]

Здравствуйте
Подскажите как правильней определить последнею строку Excel, мне нужно пробежаться по циклу до последней строки  Excel’я что-то типа while not eof.
Придумал кривоватый вариант, но хотелось бы более оптимальный и правильный.
Для более лучшего понятия моей проблемы привожу весь код

Var
a: String;
XL: variant;
X: Integer;
Begin
XL := CreateOleObject("Excel.Application");
XL.DisplayAlerts := False;
XLS.WorkBooks.Open(‘Ostatki.xls’);  
x:= 2;
a:= XLS.Cells[x,4].value;

While a<>"" do   // то что пришло в голову
BEGIN
If
ADOTable1.Locate("kod_tovara", XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey])=
  True  Then
   Begin
     ADOTable1.Edit;
     ADOTable1ostatok.AsInteger:= XLS.Cells[x,5].value;
     ADOTable1cena.AsCurrency:= XLS.Cells[x,6].value;
     ADOTable1.Post;
     x:= x+1;
   end else  begin
   ADOTable1.Insert;
     ADOTable1kod_tovara.AsInteger:=  XLS.activesheet.Cells[x,1].value;
     ADOTable1naimenov.AsString:= XLS.activesheet.Cells[x,4].value;
     ADOTable1ostatok.AsInteger:= XLS.activesheet.Cells[x,5].value;
     ADOTable1cena.AsCurrency:= XLS.activesheet.Cells[x,6].value;
   ADOTable1.Post;
   X:= x+1;
   end;
a:= XLS.Cells[x,4].value;
END;


 
RWolf ©   (2009-10-19 10:07) [1]

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


 
KilkennyCat ©   (2009-10-19 10:09) [2]

последняя строка в листе Excel имеет номер 65536


 
Рамиль ©   (2009-10-19 10:18) [3]


> KilkennyCat ©   (19.10.09 10:09) [2]

Это смотря какой Excel


 
McSimm ©   (2009-10-19 10:18) [4]


> KilkennyCat ©   (19.10.09 10:09) [2]
>
> последняя строка в листе Excel имеет номер 65536

не обязательно, у меня это 1048576


 
Фуфик   (2009-10-19 10:35) [5]

По гуглив нашел, вошем мой вариант намного оптимальней


> KilkennyCat ©   (19.10.09 10:09) [2]
> последняя строка в листе Excel имеет номер 65536


Мой зашкалил за 800000 проверять дальше нестал :)

Спасибо за внимание. Код лучше оставлю как есть.


 
sniknik ©   (2009-10-19 10:41) [6]

> мой вариант намного оптимальней
не смеши людей ADOTable в принципе не может быть оптимальней... с ADODataSet-ом, это как напишешь.


 
Фуфик   (2009-10-19 10:49) [7]


> не смеши людей ADOTable в принципе не может быть оптимальней.
> .. с ADODataSet-ом, это как напишешь.


Согласен стобой быть может в другом случае такое. В моем случае используются всего две переменные a и XL
И мне они нужны лишь при нажатии одной кнопки обновить, и раде этого закидывать на ыорму ещё один компонент мне кажется лишним


 
sniknik ©   (2009-10-19 11:16) [8]

количество переменных здесь совершенно не причем...

и вообще, само появление ADOTable в коде, это как семафор с с мигающей красной надписью "пишет ламер".
заявления, что у него что-то оптимальней смешны независимо от того правда это или нет (даже ламер может написать хорошо. случайно.).


 
Anatoly Podgoretsky ©   (2009-10-19 11:28) [9]


> Подскажите как правильней определить последнею строку Excel

А что такое последнея строка Экселя, по крайней мере есть три определения и это разные строки.


 
Anatoly Podgoretsky ©   (2009-10-19 11:28) [10]


> Мой зашкалил за 800000 проверять дальше нестал :)

Это ты зря надо было продолжать дальше.


 
Anatoly Podgoretsky ©   (2009-10-19 11:31) [11]


> While a<>"" do   // то что пришло в голову

Кстати это уже четвертое определение и вряд ли оно тебе подходит.
Кстати твои вопросы совсем не относятся к Дельфи, это вопросы по DOM Экселя, а его производит другой производитель, не Борланд, вот у него и надо искать ответ или хотя бы проштудировать файл excelXP.pas конечно если ты мазохист.


 
KilkennyCat ©   (2009-10-19 11:49) [12]

Извини за оффтоп, но каким это макаром у вас больше чем у меня? 64-х битная версия что ли?


 
sniknik ©   (2009-10-19 11:59) [13]

2007 офис.


 
KilkennyCat ©   (2009-10-19 12:03) [14]

а, понятно. спасибо.


 
Anatoly Podgoretsky ©   (2009-10-19 12:17) [15]

> KilkennyCat  (19.10.2009 12:03:14)  [14]

Ты спроси его еще о количестве колонок, то вообще в обморок упадешь.


 
Фуфик   (2009-10-19 13:09) [16]


> sniknik ©   (19.10.09 11:16) [8]
> количество переменных здесь совершенно не причем...и вообще,
>  само появление ADOTable в коде, это как семафор с с мигающей
> красной надписью "пишет ламер".заявления, что у него что-
> то оптимальней смешны независимо от того правда это или
> нет (даже ламер может написать хорошо. случайно.).

Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров? Не приведеш полный список этих компонентов


> Anatoly Podgoretsky ©   (19.10.09 11:28) [9]
> > Подскажите как правильней определить последнею строку
> ExcelА что такое последнея строка Экселя, по крайней мере
> есть три определения и это разные строки.



> Для более лучшего понятия моей проблемы привожу весь код



> Anatoly Podgoretsky ©   (19.10.09 11:28) [10]
> > Мой зашкалил за 800000 проверять дальше нестал :)Это ты
> зря надо было продолжать дальше.

Оффтоп


> Anatoly Podgoretsky ©   (19.10.09 11:31) [11]
> > While a<>"" do   // то что пришло в головуКстати это уже
> четвертое определение и вряд ли оно тебе подходит.Кстати
> твои вопросы совсем не относятся к Дельфи, это вопросы по
> DOM Экселя, а его производит другой производитель, не Борланд,
>  вот у него и надо искать ответ или хотя бы проштудировать
> файл excelXP.pas конечно если ты мазохист.

Спасибо что просветил, следующий раз буду знать.


 
sniknik ©   (2009-10-19 13:59) [17]

> Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров?
нет, не так, скорее есть компоненты которые предназначены и подходят для чего то конкретного, и использовать их совсем не по назначению признак ламеризма.

ADOTable не предназначен для того чтобы писать с его использованием... он был предназначен (вообще, имхо, это ошибка борланда, что они его сделали) для быстрого перевода программ с BDE на ADO (идея была, что простой заменой компонент)... те времена когда что то так переводили давно прошли, т.что теперь это просто признак ламеризма.


 
sniknik ©   (2009-10-19 14:20) [18]

кстати это не единственное
If
ADOTable1.Locate("kod_tovara", XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey]) = True  
Then

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

и кстати loCaseInsensitive в ADO не используется (но тут хоть без ошибок в логике, оно просто игнорируется).


 
Anatoly Podgoretsky ©   (2009-10-19 14:34) [19]

> Фуфик  (19.10.2009 13:09:16)  [16]

Ты решил, что аггресивное поведение тебе пойдет на пользу.
И определение офтопа говорит о твоей недостаточной квалификации, видимо ты даже не понял о чем речь.

> Хочешь сказать что компоненты Делфи есть специально как для ламеров так и для вырожусь не ламеров?
> Не приведеш полный список этих компонентов

Это достаточно объекная работа и выполнять ее без коммерциализации как то не умно. Но пример функци для ламеров, это например IncDay но и это им особо не помогает, поскольку Борланд не сообразил, что для них нужна еще функция DecDay, без нее они впадают в полный ступор. А ты знаешь как сделать DecDay без этой функции.


 
Anatoly Podgoretsky ©   (2009-10-19 14:40) [20]

> sniknik  (19.10.2009 14:20:18)  [18]

Особенно красиво это для цифровых кодов, наряду с loCaseInsensitive


 
Фуфик   (2009-10-19 14:59) [21]


> нет, не так, скорее есть компоненты которые предназначены
> и подходят для чего то конкретного, и использовать их совсем
> не по назначению признак ламеризма.

Хорошо я тот саммый ламер который попался на этикомпоненты.


> ADOTable не предназначен для того чтобы писать с его использованием.
> .. он был предназначен (вообще, имхо, это ошибка борланда,
>  что они его сделали) для быстрого перевода программ с BDE
> на ADO (идея была, что простой заменой компонент)... те
> времена когда что то так переводили давно прошли, т.что
> теперь это просто признак ламеризма.

У меня стоит база Access, и причем здесь BDE. я например умею бращаться к базам Access только через ADOTable, ну и я как умею так и сделал. Ты как мастер может посоветуешь как лучше. Как ни как я ещё новичок в этом


> кстати это не единственноеIfADOTable1.Locate("kod_tovara",
>  XLS.activesheet.Cells[x,1].value, [loCaseInsensitive, loPartialKey])
> = True  Thenклевая конструкция ;)хотя это еще можно списать
> на "экстравагантность письма", т.я. явной ошибки тут нет,
>  но вот логику...ищется kod_tovara, и что то делается, и
> при поиске используется loPartialKey, частичное совпадение.
> .. т.е. получается для тебя товары для примера, зеленый
> горошек и виски урожая 1788 года, одно и тоже...в общем
> либо ты не знаешь зачем что такое этот ключ, либо у тебя
> логика хромает... хорошая, но хромает. © Вини Пухи кстати
> loCaseInsensitive в ADO не используется (но тут хоть без
> ошибок в логике, оно просто игнорируется).

Ну это я привык использовать в BDE ну и туда тоже вписал. Понятии не имел для чего они. А что тогда посоветуешь использовать?


> Anatoly Podgoretsky ©   (19.10.09 14:34) [19]
> поведение тебе пойдет на пользу.

У кого тут агрессивное поведения? Я не сколько не зол ни на кого из вас.


> Anatoly Podgoretsky ©   (19.10.09 14:40) [20]
> Это достаточно объекная работа и выполнять ее без коммерциализации
> как то не умно. Но пример функци для ламеров, это например
> IncDay но и это им особо не помогает, поскольку Борланд
> не сообразил, что для них нужна еще функция DecDay, без
> нее они впадают в полный ступор. А ты знаешь как сделать
> DecDay без этой функции.

По мне так Оффтоп


 
sniknik ©   (2009-10-19 15:42) [22]

> У меня стоит база Access, и причем здесь BDE
читай внимательнее уже написанное и узнаешь.

> я например умею бращаться к базам Access только через ADOTable, ну и я как умею так и сделал
ну так и не говори, что то что ты сделал оптимальнее чего то (тем более всего найденного в гугле, где есть куча кода от профессионалов)... "как умею" это не оптимально, вот когда будешь уметь разными способами, тогда и будет один в конкретном случае оптимальнее другого, но даже в этом случае не оптимальнее всего гугля.

> Ты как мастер может посоветуешь как лучше. Как ни как я ещё новичок в этом
т.е. сначала огрызаешься на очевидное, а после "я новичок" помогите мне... ну, ну. а где гарантия, что следующее очевидное (совет) ты поймешь и применишь, а не проигнорируешь или опять не начнешь огрызаться думая что все непонятое это обидные для тебя лично слова?
ладно, совет - для того чтобы полноценно работать с ADO нужно первым делом удалить с палитры ADOTable, ADOQuery, ADOStoredProc, и учится пользоваться только тем что осталось...
ну вот, я попробовал.

> Ну это я привык использовать в BDE ну и туда тоже вписал.
в BDE с логикой поиска по части кода тоже будет та же проблема. и если у тебя ее не было значит очень везло.

> Понятии не имел для чего они. А что тогда посоветуешь использовать?
учится, учится, и еще раз учится. (другого на банальные вопросы не посоветуешь, ну может еще в хелп заглянуть...). тем более уже объяснил почему, в чем глюк. но похоже непонятое тебе проще проигнорировать чем вникнуть в смысл написаного.


 
Фуфик   (2009-10-19 15:45) [23]


> sniknik ©   (19.10.09 14:20) [18]


Фигня получается
loPartialKey тебе не нравится а loCaseInsensitive ты говоришь в  ADO не используется. Так третьего та не дано ведь, может я ошибаюсь но вот по справке нашел что TLocateOption = (loCaseInsensitive, loPartialKey)


 
Фуфик   (2009-10-19 15:58) [24]


> ну так и не говори, что то что ты сделал оптимальнее чего
> то (тем более всего найденного в гугле, где есть куча кода
> от профессионалов)... "как умею" это не оптимально, вот
> когда будешь уметь разными способами, тогда и будет один
> в конкретном случае оптимальнее другого, но даже в этом
> случае не оптимальнее всего гугля.

Говоря об оптимальности я имел виду поиск последней (заполненной) строки в Excele, и несколько небыл задан вопросом об использовании другого кроме ADOTable для доступа к своей базе, вы б и неузнали об этом не привел бы я полный код


> т.е. сначала огрызаешься на очевидное, а после "я новичок"
> помогите мне... ну, ну. а где гарантия, что следующее очевидное
> (совет) ты поймешь и применишь, а не проигнорируешь или
> опять не начнешь огрызаться думая что все непонятое это
> обидные для тебя лично слова?


насчет огрезатся извини если тебе чет не понравилось, а советы за спасибо буду дальше гуглить и
> учится, учится, и еще раз учится


 
sniknik ©   (2009-10-19 16:00) [25]

и что это доказывает?
тип интеджер это тоже к примеру дофига чисел, а в качестве кодов исключений честь используется... или в любом другом частном случае. а  в стпвке тем не менее можно найти - Integer - 2147483648..2147483647
и что?

еще советы, не путай тип и значение, ищи инфу не просто в справке а в нужном разделе.

и потом, ты опять не пытаешься понять, ты пытаешься опровергнуть... (сейчас в ход пойдут заезженные аргументы типа - "в споре рождается истина"... :)


 
sniknik ©   (2009-10-19 16:01) [26]

> честь используется
часть не используется


 
sniknik ©   (2009-10-19 16:09) [27]

> Говоря об оптимальности я имел виду поиск последней (заполненной) строки в Excele
тебе в начале говорили о подключение к книге как к базе,  вместо того чтобы спросить, если/что непонятно, ты предпочел спор (ни о чем), т.е. ты на самом деле не хотел оптимального ты хотел чтобы тебя похвалили сказав "молодец, правильно написал, ну может вот тут можно чуть ускорить, но в общем идеал...", извини но это было бы вранье.
вот тебе оптимальное, если бы пошел по тому пути, с подключением
ADODataSet.Last;
готово. ни короче, ни быстрее врядли сделаешь (если конечно имеется ввиду именно последняя в наборе, а не просто одна запись которую можно было бы вернуть запросом, тогда это было бы быстрее но писать больше).


 
Anatoly Podgoretsky ©   (2009-10-19 16:15) [28]

> sniknik  (19.10.2009 16:09:27)  [27]

Мы к Микрософту посылали, за изучением DOM?
Так там есть функция поиска последней заполненой строчки, надо сходить и найти как она называется.


 
sniknik ©   (2009-10-19 16:21) [29]

> Мы к Микрософту посылали, за изучением DOM?
ну, так я тоже говорил, есть не один путь что то сделать... ;)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.12.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
2-1256050979
CodeRz
2009-10-20 19:02
2009.12.06
Найти число длиной N


2-1255711170
den49
2009-10-16 20:39
2009.12.06
Чтение из файла при помощи Filestream


4-1222413068
Riply
2008-09-26 11:11
2009.12.06
RtlCopyUnicodeString и IRQL


2-1255701197
Артём
2009-10-16 17:53
2009.12.06
Динамические окна


1-1227792603
Дмитрий Белькевич
2008-11-27 16:30
2009.12.06
Приложение блокирует папку после копирования файлов в неё





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский