Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в документе Excel из MFC / 9 сообщений из 9, страница 1 из 1
18.07.2007, 15:42
    #34667638
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Код: plaintext
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.
if(!AfxOleInit())  // Your addition starts here
	{
       AfxMessageBox("Could not initialize COM dll");
       return ;
	}            // End of your addition

         		 
	//Start a new workbook in Excel
    _Application oApp;
    oApp.CreateDispatch("Excel.Application");

    if (!oApp)
	{ 
       AfxMessageBox("   Error");
       return ;
	} 

	COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
	Workbooks oBooks = oApp.GetWorkbooks();
    _Workbook oBook = oBooks.Add(vOpt);
    	
	/*m_ExcelWorksheets.Add(covOptional,covOptional,COleVariant(short(1)),COleVariant(instPath+"\\Protokol.xlt");*/

	COleVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
		
	oBooks.Open(szInTouchCSVFile,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty,vEmpty);
Range oRange;

Запустили Excel,открыли файл. теперь мне нужно запустить поиск по 1 столбцу методом
oRange.Find.

1)Не знаю, как нужно инициализировать oRange перед поиском (логика подсказывает, что нужно взять ячейку А1:1)
2)Метод Find имеет такие параметры:

Find(
S, // What: OleVariant;
EmptyParam, // After: OleVariant;
xlValues, // LookIn: OleVariant;
xlPart, // LookAt: OleVariant;
xlByRows, // SearchOrder: OleVariant;
xlNext, // SearchDirection: XlSearchDirection;
False, // MatchCase: OleVariant;
False, //MatchByte: OleVariant
// нужно установить в True, если
EmptyParam // SearchFormat: OleVariant
);

Компилятор плюётся, что он не знает что это за константы xlValues, xlPart, xlByRows, xlNext. По идее они предопределены. Что делать?
...
Рейтинг: 0 / 0
18.07.2007, 16:18
    #34667817
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Нашёл ссылку от английского товарища по несчастью.Он сам перелопатил кучу хидеров и создал классный хидер по ссылке http://]www.pcreview.co.uk/forums/thread-962371.php
...
Рейтинг: 0 / 0
18.07.2007, 18:07
    #34668243
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Проблема ещё не решена:

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
f(!AfxOleInit())  // Your addition starts here
{
       AfxMessageBox("Could not initialize COM dll");
       return ;
}            // End of your addition

         		 
   //Start a new workbook in Excel
    _Application oApp;
    oApp.CreateDispatch("Excel.Application");

    if (!oApp)
	{ 
       AfxMessageBox("   Íåâäàëà ñïðîáà çàïóñêó Excel. Ïåðåâ³ðòå ÷è Excel\n"\
	                 "âñòàíîâëåíèé íà êîìï'þòåð³ àáî ïåðåçàâàíòàæòå êîìï'þòåð");
       return ;
	} 

   COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
   Workbooks oBooks = oApp.GetWorkbooks();
   _Workbook oBook = oBooks.Add(vOpt);
    	
   COleVariant vt(DISP_E_PARAMNOTFOUND, VT_ERROR);
   	
   oBooks.Open(szInTouchCSVFile,vt1,vt1,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt1);

   Worksheets oSheets = oBook.GetActiveSheet();
   Range oRange,oFindRes;
	
	
   if(oRange.Find(COleVariant(":IO"),vOpt,xlValues,xlPart,xlByColumns,xlNext,xlIgnoreCase,vOpt))
   {
       AfxMessageBox("Found");
       while(oFindRes.FindNext(!!!!!!!!!!!!!!!!!!!))
       {
	AfxMessageBox("Found1");
       }
}
   
    oApp.SetVisible(TRUE);
    oApp.SetUserControl(TRUE);

Вот вместо !!!!!!!!!!!!!!!!!!! должна передаваться текущая ячейка, в которой находимся. Но передать тип Range нельзя. Кто знает какой параметр передаётся методу FindNext. Может есть исходники
...
Рейтинг: 0 / 0
18.07.2007, 18:11
    #34668259
Macros.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
eppopovКто знает какой параметр передаётся методу FindNext. Может есть исходники
А если записать макрос в Excel'e и посмотреть что там используется?
...
Рейтинг: 0 / 0
18.07.2007, 18:14
    #34668268
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Macros. eppopovКто знает какой параметр передаётся методу FindNext. Может есть исходники
А если записать макрос в Excel'e и посмотреть что там используется?

А как это можно сделать?Как создать макрос я знаю, а вот как увидеть стандартные параметры?
...
Рейтинг: 0 / 0
18.07.2007, 18:21
    #34668300
Macro.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
eppopov Macros. eppopovКто знает какой параметр передаётся методу FindNext. Может есть исходники
А если записать макрос в Excel'e и посмотреть что там используется?

А как это можно сделать?Как создать макрос я знаю, а вот как увидеть стандартные параметры?
Записываем макрос, потом смотрим его текст:
что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub Macro1()
    Cells.Find(What:="5", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate
    Cells.FindNext(After:=ActiveCell).Activate
    Cells.FindNext(After:=ActiveCell).Activate
End Sub
Потом можно в справку за подробностями... ( у меня справка для VB не установлена, поэтому подробности посмотреть не могу)
...
Рейтинг: 0 / 0
19.07.2007, 17:40
    #34671215
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
FindNext(VARIANT & AfterCell) требует указать ячейку.Как её указать я без понятия, т.к. предыдущий вызов Find возвращает тип Range. Как указать ячейку для FindNext(VARIANT & AfterCell) ?
...
Рейтинг: 0 / 0
19.07.2007, 19:59
    #34671612
eppopov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
     if(!AfxOleInit())  // Your addition starts here
     {
           AfxMessageBox("Could not initialize COM dll");
           return;
     }            // End of your addition

                  
    //Start a new workbook in Excel
    _Application oApp;
    oApp.CreateDispatch("Excel.Application");

    if (!oApp)
    { 
       AfxMessageBox("   Error");
       return;
     } 
    COleVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    Workbooks oBooks = oApp.GetWorkbooks();
    _Workbook oBook;//= oBooks.Add(vOpt);
        
    COleVariant vt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant vt1((short) 0 , VT_I2);
        
    oBook = oBooks.Open(szInTouchCSVFile,vt1,vt1,vt,vt,vt,vt,vt,vt,vt,vt,vt,vt1);

    Worksheets oSheets = oBook.GetSheets();
    _Worksheet oSheet = oSheets.GetItem(COleVariant(short( 1 )));
    Range oRange,oFindRes;

    oRange = oSheet.GetRange(COleVariant("A1"), COleVariant("A1"));
    oFindRes = oRange.Find(COleVariant(":IO"),vOpt,xlValues,xlPart,xlByColumns,xlNext,xlIgnoreCase,vOpt);
    char szStr[ 100 ];
    if(oFindRes)
    {
                 ZeroMemory(szStr, 1000 );
    WideCharToMultiByte(CP_ACP, 0 ,oRange.GetValue().bstrVal,- 1 ,szStr,sizeof(szStr),NULL,NULL);
        
    inr nRow= 1 ;
                while(oFindRes)
    {
        ZeroMemory(szStr, 1000 );
        WideCharToMultiByte(CP_ACP, 0 ,oFindRes.GetValue().bstrVal,- 1 ,szStr,sizeof(szStr),NULL,NULL);
        nRow++;
        oFindRes = oRange.FindNext(oRange.GetItem(COleVariant(short(nRow)),COleVariant(short( 1 ))));
    }


Мне нужно пройтись по первому столбцу и найти все подходящие условию ячейки. Метод FindNext() работает только для oRange.GetItem(COleVariant(short(nRow)),COleVariant(short(1))) вместо строки nRow задать 1, а иначе ошибка. В чём я неправ? Почему только при nRow=1. Помогите, может кто знает ссылку на человеческую документацию по excel'евским методам с описанием всех параметров, у меня вообще ничего нет
...
Рейтинг: 0 / 0
20.07.2007, 01:29
    #34671871
Macro.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в документе Excel из MFC
Справка Microsoft Excel
FindNext Method


Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions and returns a Range object that represents that cell. Doesn’t affect the selection or the active cell.

Syntax

expression.FindNext(After)

expression Required. An expression that returns a Range object.

After Optional Variant. The cell after which you want to search. This corresponds to the position of the active cell when a search is done from the user interface. Note that After must be a single cell in the range . Remember that the search begins after this cell; the specified cell isn’t searched until the method wraps back around to this cell. If this argument isn’t specified, the search starts after the cell in the upper-left corner of the range.

Remarks

When the search reaches the end of the specified search range, it wraps around to the beginning of the range. To stop a search when this wraparound occurs, save the address of the first found cell, and then test each successive found-cell address against this saved address.

------------------------------

FindNext Method Example

This example finds all cells in the range A1:A500 that contain the value 2 and makes those cells gray.

With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Interior.Pattern = xlPatternGray50
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в документе Excel из MFC / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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