乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > vb如何获取多个<em>excel</em>程序其中一个的控制权? 在一个电脑...-excel

vb如何获取多个<em>excel</em>程序其中一个的控制权? 在一个电脑...-excel

作者:乔山办公网日期:

返回目录:excel表格制作


VLOOKUP是一个查找函数,给定一个查找的目标,它就能从指定的查找区域中查找返回想要查找到的值。它的基本语法为:
VLOOKUP(查找目标,查找范e68a84e8a2ad7a64365围,返回值的列数,精确OR模糊查找)
下面以一个实例来介绍一下这四个参数的使用
例1:如下图所示,要求根据表二中的姓名,查找姓名所对应的年龄。
公式:B13 =VLOOKUP(A13,$B$2:$D$8,3,0)
参数说明:
1 查找目标:就是你指定的查找的内容或单元格引用。本例中表二A列的姓名就是查找目标。我们要根据表二的“姓名”在表一中A列进行查找。
公式:B13 =VLOOKUP(A13,$B$2:$D$8,3,0)
2 查找范围(VLOOKUP(A13,$B$2:$D$8,3,0) ):指定了查找目标,如果没有说从哪里查找,EXCEL肯定会很为难。所以下一步我们就要指定从哪个范围中进行查找。VLOOKUP的这第二个参数可以从一个单元格区域中查找,也可以从一个常量数组或内存数组中查找。本例中要从表一中进行查找,那么范围我们要怎么指定呢?这里也是极易出错的地方。大家一定要注意,给定的第二个参数查找范围要符合以下条件才不会出错:
A 查找目标一定要在该区域的第一列。本例中查找表二的姓名,那么姓名所对应的表一的姓名列,那么表一的姓名列(列)一定要是查找区域的第一列。象本例中,给定的区域要从第二列开始,即$B$2:$D$8,而不能是$A$2:$D$8。因为查找的“姓名”不在$A$2:$D$8区域的第一列。
B 该区域中一定要包含要返回值所在的列,本例中要返回的值是年龄。年龄列(表一的D列)一定要包括在这个范围内,即:$B$2:$D$8,如果写成$B$2:$C$8就是错的。
3 返回值的列数(B13 =VLOOKUP(A13,$B$2:$D$8,3,0))。这是VLOOKUP第3个参数。它是一个整数值。它怎么得来的呢。它是“返回值”在第二个参数给定的区域中的列数。本例中我们要返回的是“年龄”,它是第二个参数查找范围$B$2:$D$8的第3列。这里一定要注意,列数不是在工作表中的列数(不是第4列),而是在查找范围区域的第几列。如果本例中要是查找姓名所对应的性别,第3个参数的值应该设置为多少呢。答案是2。因为性别在$B$2:$D$8的第2列中。
4 精确OR模糊查找(VLOOKUP(A13,$B$2:$D$8,3,0) ),最后一个参数是决定函数精确和模糊查找的关键。精确即完全一样,模糊即包含的意思。第4个参数如果指定值是0或FALSE就表示精确查找,而值为1 或TRUE时则表示模糊。这里兰色提醒大家切记切记,在使用VLOOKUP时千万不要把这个参数给漏掉了,如果缺少这个参数默为值为模糊查找,我们就无法精确查找到结果了。
1、接下来,我们的任务是通过利用VLOOKUP函数来实现查找同学C的成绩。为此在单元格中输入“=VLOOKUP”,此时就会发现VLOOKUP包括三个参数和一个可选参数。
其中“lookup_value”是指要查找的值。
参数“table_array”是指搜索的区域,在此在除标题之后的整个数据区域。
第三个参数“col_index_num”是指整个函数返回单元格所在的列号。
2、最后以右括号结尾,并按回车键,就出现想要的结果啦。


http:///KB/COM/cominterop.aspx
codeproject上有一个类似的项目,是从ROT中获取activex对象的,可以参考.

我下载后稍微试验了一下,开两个文件名不同的excel,但一直取到同一个名称上,还不能实现你的效果
我的代码:
// System.Runtime.InteropServices

[DllImport("ole32.dll")]
public static extern int GetRunningObjectTable(int reserved,out System.Runtime.InteropServices.UCOMIRunningObjectTable prot);
[DllImport("ole32.dll")]
public static extern int CreateBindCtx(int reserved,out System.Runtime.InteropServices.UCOMIBindCtx ppbc);

private void btnDprocess_Click(object sender,EventArgs e)
{
List<object> list = new List<object>();
int numFetched;
UCOMIRunningObjectTable runningObjectTable;
UCOMIEnumMoniker monikerEnumerator;
UCOMIMoniker[] monikers = new UCOMIMoniker[1];
GetRunningObjectTable(0,out runningObjectTable);
runningObjectTable.EnumRunning(out monikerEnumerator);
monikerEnumerator.Reset();
while(monikerEnumerator.Next(1,monikers,out numFetched) == 0)
{
UCOMIBindCtx ctx;
CreateBindCtx(0,out ctx);
string runningObjectName;
monikers[0].GetDisplayName(ctx,null,out runningObjectName);
AInfo(runningObjectName);
Guid g = new Guid();
monikers[0].GetClassID(out g);
AInfo(g.ToString());
object runningObjectVal;
runningObjectTable.GetObject(monikers[0],out runningObjectVal);
list.Add(runningObjectVal);
}
for(int i = 0;i < list.Count;i++)
{
OfficeExcel._Application xls = list[i] as OfficeExcel._Application;
if(xls == null)
continue;
try
{
this.listBox1.Items.Add(i.ToString("D3")+"\t"+xls.Workbooks[1].Name);
}
catch { }
}
}

希望对你有参考价值

又查了一下,貌似你的需求是不可能实现的
"You can't connect to a "specific" instance of an application when using
GetActiveObject, if you need this you will have to create a new instance."
不能用GetActiveObject访问特定的应用程序实例,如果需要这样,只能创建新的实例.

No, you can only connect to the single instance that was registered in the
ROT. If you have 3 instances of the "same" server application running, you
will always connect to the first application that was started as this is the
one registered.
只能访问到ROT中注册的单一实例.如果有一个服务程序同时运行了三个实例,总是会访问到启动后的第一7a64e59b9ee7ad94337个注册实例
If you need a private instance you will need to create a new instance (using
.... = new Excel.ApplicationClass(); )and not connect to an instance that is
already running. This is the point of automation, you should not connect to
an instance started by an interactive user.
可以用new Excel.ApplicationClass创建一个私有的新实例,但不能访问运行中的
实例.这是Automation的机制....
Willy Denoyette [MVP]
http://bytes.com/topic/c-sharp/answers/272571-multiple-excel-processes

发现多个实例也确实有两种模式,
一个是通过双击多个xls文件而产生的多个Excel实例,
另一个是通过Excel的快捷方式开启的多个空的Excel实例.

第一种ROT里面的是一个Excel的CLSID和多个文档的路径,通过IMoniker::GetDisplayName显示如下:
C:\Documents and Settings\Administrator\??\Book1.xls
!{00024500-0000-0000-C000-000000000046}
C:\Documents and Settings\Administrator\??\Book2.xls

第二种ROT里面是多个实例Excel的CLSID,通过IMoniker::GetDisplayName显示如下:
!{00024500-0000-0000-C000-000000000046}
!{00024500-0000-0000-C000-000000000046}

第一种通过文档路径的那个IMoniker应该可以得到Excel的实例指针(我没有对Excel进行测试,对另外一种类似的自动化对象进行了测试).我现在想在第e68a847a64337二种情况下用CLSID的那个IMoniker来获得Excel的实例指针,却不知该如何操作.刚刚接触COM不久.希望各位大侠不要见笑.下面我贴出我的代码,代码本身比较简单.可以方便地建立一个win32工程就可以进行测试了.

#include "stdafx.h"
#include <windows.h>
const TCHAR szExcel[] = _T("!{00024500-0000-0000-C000-000000000046}");
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hRes;
CLSID clsid;
IUnknown *pUnk = NULL;
IDispatch *pDisp = NULL;

hRes = OleInitialize(NULL);
if (FAILED(hRes))
{
_tprintf(_T("OleInitialize failed (0x%08X)\n"), hRes);
return -1;
}
CLSIDFromProgID(_T("Excel.Application"), &clsid);

IRunningObjectTable * pROT = NULL;
IEnumMoniker * pEnum = NULL;
IMoniker * pMoniker = NULL;
IBindCtx * pBindCtx = NULL;
PWSTR pszName = NULL;
ULONG cElt;

for (;;)
{
// get interface pointer of the running object table
hRes = GetRunningObjectTable(NULL, &pROT);
if (FAILED(hRes))
{
_tprintf(_T("GetRunningObjectTable failed (0x%08X)\n"), hRes);
break;
}

// create binding context object
hRes = CreateBindCtx(0, &pBindCtx);
if (FAILED(hRes))
{
_tprintf(_T("CreateBindCtx failed (0x%08X)\n"), hRes);
break;
}

// enumerate running objects
hRes = pROT->EnumRunning(&pEnum);
if (FAILED(hRes))
{
_tprintf(_T("IRunningObjectTable::EnumRunning failed (0x%08X)\n"),
hRes);
break;
}
// go through all monikers in the table and display moniker name
while (pEnum->Next(1, &pMoniker, &cElt) == S_OK)
{
hRes = pMoniker->GetDisplayName(pBindCtx, NULL, &pszName);
if (FAILED(hRes))
{
_tprintf(_T("IMoniker::GetDisplayName failed (0x%08X)\n"), hRes);
break;
}
_tprintf(_T("%ls\n"), pszName);
//利用pszName来判断是否Excel
if(lstrcmp(pszName,szExcel))
{
//我想在这里取得Excel的实例接口指针,可是不知道怎么操作.*********************************
//下面这句一直出错
hRes = pMoniker->BindToObject(pBindCtx,NULL,IID_IUnknown/*clsid*/,(VOID**)&pDisp);
if (SUCCEEDED(hRes))
{
}
}

CoTaskMemFree(pszName);
pMoniker->Release();

pszName = NULL;
pMoniker = NULL;
}

break;
}

if (pszName != NULL)
CoTaskMemFree(pszName);
if (pMoniker != NULL)
pMoniker->Release();
if (pEnum != NULL)
pEnum->Release();
if (pBindCtx != NULL)
pBindCtx->Release();
if (pROT != NULL)
pROT->Release();

OleUninitialize();
return 0;
}

相关阅读

关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网