powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в документе Excel из MFC
9 сообщений из 9, страница 1 из 1
Поиск в документе Excel из MFC
    #34667638
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Поиск в документе Excel из MFC
    #34667817
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл ссылку от английского товарища по несчастью.Он сам перелопатил кучу хидеров и создал классный хидер по ссылке http://]www.pcreview.co.uk/forums/thread-962371.php
...
Рейтинг: 0 / 0
Поиск в документе Excel из MFC
    #34668243
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема ещё не решена:

Код: 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
Поиск в документе Excel из MFC
    #34668259
Macros.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eppopovКто знает какой параметр передаётся методу FindNext. Может есть исходники
А если записать макрос в Excel'e и посмотреть что там используется?
...
Рейтинг: 0 / 0
Поиск в документе Excel из MFC
    #34668268
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Macros. eppopovКто знает какой параметр передаётся методу FindNext. Может есть исходники
А если записать макрос в Excel'e и посмотреть что там используется?

А как это можно сделать?Как создать макрос я знаю, а вот как увидеть стандартные параметры?
...
Рейтинг: 0 / 0
Поиск в документе Excel из MFC
    #34668300
Macro.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Поиск в документе Excel из MFC
    #34671215
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FindNext(VARIANT & AfterCell) требует указать ячейку.Как её указать я без понятия, т.к. предыдущий вызов Find возвращает тип Range. Как указать ячейку для FindNext(VARIANT & AfterCell) ?
...
Рейтинг: 0 / 0
Поиск в документе Excel из MFC
    #34671612
eppopov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Поиск в документе Excel из MFC
    #34671871
Macro.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Справка 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
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в документе Excel из MFC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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