我写了一段c函数ProgramExecute来调用EXCEL文件,date是我wincc自己建的内部变量:
char path[255];
//如路径改变相应的字符串也要改变
strcpy(path,"C:\\Program Files\\Microsoft Office\\Office\\EXCEL.EXE E:\\reporttest\\report\\");
strcat(path,GetTagChar("date")); //Return-Type: char*
strcat(path,".xls");
//SetTagChar("path",path); //Return-Type: BOOL
ProgramExecute(path); //Return-Type: unsigned long int
调出EXCEL没有问题。但我还有一个一直在运行的EXCEL文件,其中有用宏写的那段OPC读wincc变量的程序(帮助里好像有,我又找不到了,顺便问一下万版帮助文档的查找方法),和整点打开当天EXCEL文件往里存一条数据的程序。我在宏里还写了一段打开前判断当天的工作簿是否打开的程序,如果打开了就不再打开,存完数据后自动关闭。
Dim WK As Workbook
For Each WK In Workbooks
If WK.Name = fn Then
GoTo OPENED
End If
Next WK
Workbooks.Open (ThisWorkbook.Path & "\report\" & fn)
OPENED:
打开后的后续操作。。。
问题就来了:如果我WINCC调出的EXCEL没关,照理说是应该检测到的(我手动打开excel试过)。但用上面一段脚本调出的excel却没被检测到,表现为又打开一个EXCEL。我不知道是怎么回事。
前阵浏览论坛看到城外斑竹说ShellExecuteA可以用于打开很多东西,就试了下:
#pragma code("Shell32.dll")
VOID ShellExecuteA(HWND, LPCTSTR , LPCTSTR , LPCTSTR , LPCTSTR , INT);
#pragma code()
HWND hwnd;
char path[255];
hwnd=FindWindow(NULL,"WinCC-运行系统 -");
strcpy(path,"E:\\reporttest\\report\\");
strcat(path,GetTagChar("date")); //Return-Type: char*
strcat(path,".xls");
//SetTagChar("path",path); //Return-Type: BOOL
//ProgramExecute(path); //Return-Type: unsigned long int
ShellExecuteA(hwnd, "open", path,NULL,"E:\\reporttest\\report\\",SW_SHOWMAXIMIZED);
程序打开没问题,上述的宏中无法检测到打开的excel的问题也没有了。
程序能正常运行。
我只是看到两种方法打开的EXCEL最小化时有区别:第一种好像是一个大的excel图标;第二种和原来采集数据的EXCEL的图标是一样的,像是多个文档似的图标。我猜第一种是不是打开了另一个EXCEL的进程之类的函数(不懂瞎说)。虽然现在任务完成了,但问题还在,希望斑竹和各位高手给我个解释。