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

Вниз

поиск ячеек по excel файлам   Найти похожие ветки 

 
kate158 ©   (2009-09-22 16:03) [0]

что делаю:1.ищу excel файлы в папке (их названия у меня в мемо).2.нахожу опр ячейку по всем эксель файлам(ее адрес введен на форме в эдит поле).3. копирую название файла и значение ячейкив блокнот. вопрос таков. что неверно написано в коде (поиск ячейки по всем  файлам):

procedure TForm1.Button3Click(Sender: TObject);
var
 D1, D2 : Variant;
 E, W, SB,SH : Variant;
 i:integer;
BEGIN
   E  := CreateOleObject("Excel.Application");
     E.DisplayAlerts  := False;
     for i:=0 to Memo1.Lines.Count - 1 do
     E.WorkBooks.Open(trim(Memo1.Lines[i]), ReadOnly:=True);
     W := E.WorkBooks.Item[1];
     SH := W.Sheets.Item[1];
        D1 :=  SH.Range[EditAA.Text].Value;
        i:=i+1;
           showmessage(d1);
           //E.Visible:=true;
              e.WorkBooks.close;
  Application.ProcessMessages;
end;

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


 
Thrashead   (2009-09-22 16:43) [1]

1) после строки
for i:=0 to Memo1.Lines.Count - 1 do
блок операторов заключить в begin end; иначе не понятно, как вообще "цикл по файлам работает".

2) при использовании "for ..." нет необходимости наращивать счётчик i внутри цикла, for сам "щелкает".

3) возможно, следует (на всякий случай) проверять сначала количество строк в Memo1, а вдруг там пусто?

4) после всей обработки осбободить память: E.Free;

Удачи :)


 
Thrashead   (2009-09-22 17:10) [2]

п.4 - я немного напутал... - Надо Excel.Quit;

Насколько помню, чтобы получить значение ячейки, надо обращаться к Cell, причём по её "числовым координатам". А Range - это нечто другое, а именно диапазон ячеек, например "A1:H8". Если не ошибаюсь, у Range нет свойства Value.

Вообщем, как-то так:

procedure TForm1.Button3Click(Sender: TObject);
var
ExcelApp, WorkSheet: Variant;
SomeValue: String;
i: Integer;
begin
if Memo1.Lines.Count>0 then
 begin
  Excel: CreateOleObject("Excel.Application");
  Excel.Visible:=False;
  for i:=0 to Memo1.Lines.Count-1 do
   begin
    Excel.Workbooks.Open(Memo1.Lines[i]);
    WorkSheet:=Excel.Workbooks[1].WorkSheets[1];
    SomeValue:=VarToStr(WorkSheet.Cells[1,1]);
    ShowMessage(SomeValue);
    Excel.Workbooks.Close;
   end;
  Excel.Quit;
 end;
end;


 
Сергей М. ©   (2009-09-22 17:10) [3]


> осбободить память: E.Free


С чего бы Free ?
Это же не дельфийский объект, чтобы ему фри устраивать)


 
Thrashead   (2009-09-22 17:12) [4]

сергей М.
:) я перепутал малость. бывает.


 
Thrashead   (2009-09-22 17:24) [5]

я ещё добавил бы проверку на существование файла:
...
for i:=0 to Memo1.Lines.Count-1 do
if FileExists(Memo1.Lines[i]) then
 begin
  ...


 
kate158 ©   (2009-09-22 17:27) [6]

что делать если пользователь в эдит добавил адрес не одной ячейки? например d5,H6,g8?


 
Сергей М. ©   (2009-09-22 17:29) [7]

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


 
Thrashead   (2009-09-22 17:29) [8]

хмм...
Через Range можно обратиться и к одной ячейке:
SomeValue:=WorkSheet.Range["A1"].Value;

http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.range(VS.80).aspx


 
Сергей М. ©   (2009-09-22 17:31) [9]


> Через Range можно обратиться и к одной ячейке


Ему к одной и надо
См.

> нахожу опр ячейку


А юзер, зараза, взял да и ввел не одну)


 
Thrashead   (2009-09-22 17:34) [10]

Сергей:
и как этот ввод запретить? адрес ячейки ведь до IV65536. Маску делать?
Может
try ... except
?


 
Сергей М. ©   (2009-09-22 17:36) [11]


> Thrashead   (22.09.09 17:34) [10]


Обработка OnChange + перехват операции вставки текста в Edit-контрол из буфера обмена


 
kate158 ©   (2009-09-22 17:38) [12]

сорри..
мне надо не одну..
пользователь может ввести как D1, как d1:d5, как d1,g5,h6....


 
Thrashead   (2009-09-22 17:41) [13]

:)
становится интереснее


 
Thrashead   (2009-09-22 17:45) [14]

1) если в строке нет запятых и двоеточий, то обращаемся к ячейке, полагая, что введён корректный адрес;
2) если нет запятых, но есть одно двоеточие, то обращаемся к Range, полагая, что введён корректный диапазон;
3) если нет двоеточий, но есть запятая (-ые), то разбиваем на подстроки, и далее в цикле обрабатываем указанные ячейки.
хмм...


 
kate158 ©   (2009-09-22 17:55) [15]

самое интересное - 3)
+ пользователь вводит русские буквы
+ лишние пробелы...


 
Thrashead   (2009-09-22 18:05) [16]

русские буквы:
1) строку в верхний регистр;
2) если подстрока содержит символы ascii 48..57 или 65..90, то всё норм, иначе - в топку такую подстроку.

лишние пробелы:
написать доп.функцию для замены строки1 на строку2, например:
Replace(" ","");
заменить пробел на пустую строку.


 
Thrashead   (2009-09-22 18:07) [17]

Replace( где менять, что менять, на что менять );

ps. что за программа будет в итоге?


 
Сергей М. ©   (2009-09-22 19:12) [18]


> мне надо не одну


Если "не одну", то что тогда ты собрался записывать в Блокнот ? И в каком виде ?


 
kate158 ©   (2009-09-23 09:04) [19]

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


 
Сергей М. ©   (2009-09-23 09:12) [20]

Т.е. в результате требуется получить

c:\path1\file1.xls "Значение ячейки D5" "Значение ячейки H6" "Значение ячейки G8"
c:\path2\file2.xls "Значение ячейки D5" "Значение ячейки H6" "Значение ячейки G8"

или

c:\path1\file1.xls "Значение ячейки D5"
c:\path1\file1.xls "Значение ячейки H6"
c:\path1\file1.xls "Значение ячейки G8"
c:\path2\file2.xls "Значение ячейки D5"
c:\path2\file2.xls "Значение ячейки H6"
c:\path2\file2.xls "Значение ячейки G8"

?


 
kate158 ©   (2009-09-23 09:20) [21]

c:\path1\file1.xls "Значение ячейки D5" "Значение ячейки H6" "Значение ячейки G8"
c:\path2\file2.xls "Значение ячейки D5" "Значение ячейки H6" "Значение ячейки G8"


 
Сергей М. ©   (2009-09-23 09:22) [22]

Ну и какие проблемы ?


 
kate158 ©   (2009-09-23 09:24) [23]

в зависимости от того, скока ячеек выбрал пользователь.
если D1,G5, то
c:\path1\file1.xls "Значение ячейки D1" "Значение ячейки G5"
c:\path1\file2.xls "Значение ячейки D1" "Значение ячейки G5"
...
если D1:D5, то
c:\path1\file1.xls "Значение ячейки D1" "Значение ячейки D2" "Значение ячейки D3" "Значение ячейки D4" "Значение ячейки D5"
c:\path1\file2.xls "Значение ячейки D1" "Значение ячейки D2" "Значение ячейки D3" "Значение ячейки D4" "Значение ячейки D5"
...
если D1 то
c:\path1\file1.xls "Значение ячейки D1"
c:\path1\file2.xls "Значение ячейки D1"
...


 
Сергей М. ©   (2009-09-23 09:27) [24]


> kate158 ©   (23.09.09 09:24) [23]


Ценнейшее уточнение)

Ну а проблемы-то в чем заключаются ?


 
kate158 ©   (2009-09-23 09:31) [25]

кто говорил про проблемы?
ответ на 17 и 18 посты
уже программлю спасибо


 
kate158 ©   (2009-09-23 11:07) [26]

блин. тут еще добавилась тема. пользователь может ввести диапазон как D1,G4,F3:F8...


 
kate158 ©   (2009-09-23 11:08) [27]

как можно это все упростить? может на форму кинуть эдиты для фиксированного ввода ячеек?


 
Сергей М. ©   (2009-09-23 11:30) [28]

Ты же сказал что проблем нет ?)


 
kate158 ©   (2009-09-23 11:40) [29]

проблемы появляются с изменениями пунктов тз в ходе создания кода.. ))


 
Сергей М. ©   (2009-09-23 11:43) [30]

Нафих, спрашивается, нужно такое ТЗ, которое меняется по чьему-то сиюсекундному капризу ?)

Да и проблемы-то что-то не видно)


 
Сергей М. ©   (2009-09-23 11:45) [31]


> F3:F8


Ты не знаешь как "превратить"
F3:F8
в
F3, F4, F5, F6, F7, F8
?
Или где ?)


 
Thrashead   (2009-09-23 14:16) [32]

kate158:
не сомневаюсь, это будет Великая Программа. Спрашивал-то не про конкретную функцию работы с Excel, а в целом: что за проект, для чего и т.д. Для общего представления, о чём идёт речь.

Совет по ТЗ.
Составили, утвердили - и только потом программирование.
Если у заказчика Просветление - все изменения в следующей версии, билде и т.п. Желательно.

По поводу ввода адресов ячеек.
См. пост [14]. Мне кажется, осуществимо. Анализ строки не так уж сложен.
+ пост [31] - тоже не сложно.


 
Сергей М. ©   (2009-09-23 14:25) [33]


> Анализ строки не так уж сложен


Можно даже вообще ничего не анализировать.
Просто пока не поздно согласовать с Заказчиком предложение по изменению ТЗ в части способов указания юзером интересующих его диапазонов.
Вряд ли юзер будет против варианта интерактивного выбора интересующих его ячеек или диапазонов прямо на листе рабочей книги, вместо тупого набивания координат в Еdit"е.


 
kate158 ©   (2009-09-24 11:16) [34]

[31]
собственно, как "превратить"
F3:F8
в
F3, F4, F5, F6, F7, F8
?


 
Сергей М. ©   (2009-09-24 11:49) [35]


> kate158 ©   (24.09.09 11:16) [34]


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


 
kate158 ©   (2009-09-24 12:35) [36]

у самой (:))) мысли есть. но хочу других.
значит, так:
1.кинуть на форму 4 едита и забивать адреса ячеек вручную. типа такого:
 Edit1.Text+Edit2.Text+":"+Edit3.Text+Edit4.Text
далее цикл по Edit2 и Edit4..
2.одно поле едит.искать символ ":" типа
If Pos(":",Edit1.Text)<>0 then , вот что далее пока мысль не идет. тоже может выцеплять число и по нему  циклом идти..
может что еще можно придумать..


 
Сергей М. ©   (2009-09-24 12:41) [37]


> у самой


А, ну да .. Миль пардон)

"Ах, графиня, на что Вам судьбина жестокая ?" (С) МВ


> 2.одно поле едит.искать символ ":"


Угу.


> может выцеплять число и по нему  циклом идти


Угу.


 
Сергей М. ©   (2009-09-24 12:44) [38]

Ты [33] читала ?)


 
kate158 ©   (2009-09-24 13:28) [39]

>[38]
читала.это будет завтра.))


 
Сергей М. ©   (2009-09-24 13:36) [40]


> это будет завтра


В смысле ?)



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

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

Наверх





Память: 0.55 MB
Время: 0.007 c
6-1209894514
FireMan_Alexey
2008-05-04 13:48
2009.11.08
VPN


11-1207718048
YuriyM
2008-04-09 09:14
2009.11.08
Выравнивание текста в TKolEditBox


2-1253526247
Иван Василич
2009-09-21 13:44
2009.11.08
ADOQuery как вывести результат запроса ?


2-1253899875
tassa
2009-09-25 21:31
2009.11.08
Построение графика


15-1252134194
Копир
2009-09-05 11:03
2009.11.08
В неудачных запусках "Булавы" виноваты программисты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский