ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: VBA万岁

[求助] VSTO入门问题集

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-19 16:40 | 显示全部楼层
VBA万岁 发表于 2015-11-19 15:34
我新建的VSTO项目是Excel外接程序,故应该不能用“thisWorkbook”表示活动工作簿。不知以下两个链接中的 ...

想请教一下,任务窗格,只能在thisAddIn对象添加吗?如果我创建的是文档级别的项目,就不能添加任务窗格吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-20 08:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
excelhomesnake 发表于 2015-11-19 16:40
想请教一下,任务窗格,只能在thisAddIn对象添加吗?如果我创建的是文档级别的项目,就不能添加任务窗格吗?

没测试过,感觉应该可以的......我晚上试试......

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-20 09:51 | 显示全部楼层
excelhomesnake 发表于 2015-11-19 16:36
原理应该相同.例如,在任意ThisAddIn宿主下的对象,都可以用如下语句获取当前活动工作簿对象
Globals.This ...

我在功能区用了Globals.ThisAddIn.Application.ActiveWorkbook后出错,好像是说,没有ActiveWorkbook,是否要添加程序集引用......
试图用39楼第2个链接的方法显示活动工作簿的路径,虽未出错,但无任何反应。具体如下:
在(Excel外接程序)功能区添加一个按钮,按钮单击事件的部分代码如下:
  1. ......
  2. Microsoft.Office.Interop.Excel._Workbook myWorkbook;            //工作薄实例声明            
  3. //excel.Application.Workbooks.Add(true);         //不存在相同文件,则建立一个新的文件                myWorkbook = excel.ActiveWorkbook;
  4. MessageBox.Show(myWorkbook.path);
  5. ......     
复制代码

❶、然后任意打开一个Excel文件Book1,单击自定义功能区的那个按钮,居然没反应,既没显示该Excel文件的路公径,也没有出错 ;
❷而如在上述代码前增加一段打开另外一个工作薄代码,运行后能显示路径,显示的是后打开的那个工作薄Book2的路径,并不是我想要的Book1的路径。若增加的代码为打开并关闭另外一个工作薄,则运行后出现❶的情况;
❸转而试了一下36楼的方法,能显示路径,但始终为C盘一个可执行文件所在的路径,即活动工作簿的路径不是它,仍然显示它。不知为何?......

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-20 13:40 | 显示全部楼层
VBA万岁 发表于 2015-11-20 09:51
我在功能区用了Globals.ThisAddIn.Application.ActiveWorkbook后出错,好像是说,没有ActiveWorkbook,是 ...

通过第39楼第1个链接的方法终于解决了这个问题,代码如下:
  1. private void mb1_Click(object sender, RibbonControlEventArgs e)
  2.         {
  3.             object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  4.             Microsoft.Office.Interop.Excel._Application app = o as Microsoft.Office.Interop.Excel._Application;
  5.             Microsoft.Office.Interop.Excel.Workbook workBook = app.ActiveWorkbook;//得到当前活动的excel文档
  6.             //Microsoft.Office.Interop.Excel._Workbook wr = app.ActiveWorkbook;
  7.             System.Windows.Forms.MessageBox.Show(workBook.Path);
  8.             //string strDestWorkbook = Microsoft.Office.Interop.Excel.ActiveWorkbook.path;
  9.         }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-20 14:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 VBA万岁 于 2015-11-20 14:28 编辑
excelhomesnake 发表于 2015-11-19 16:36
原理应该相同.例如,在任意ThisAddIn宿主下的对象,都可以用如下语句获取当前活动工作簿对象
Globals.This ...


在ThisAddIn下直接用this.Application.ActiveWorkbook(如下图)虽未报错,但运行无反应——打开任一Excel文件,本应弹框显示所打开的Excel文件的路径的,但程序没有。

1.jpg

TA的精华主题

TA的得分主题

发表于 2015-11-20 20:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-11-20 14:19
在ThisAddIn下直接用this.Application.ActiveWorkbook(如下图)虽未报错,但运行无反应——打开任一Ex ...

不是很明白你的情况.但我这里是可以的

  1.             Excel.Workbook wrb = Globals.ThisAddIn.Application.ActiveWorkbook;

  2.             if (wrb==null)
  3.             {
  4.                 MessageBox.Show("当前没有任何激活的工作簿!");
  5.                 return;
  6.             }

  7.             string result = string.Format("{0}{1}{2}", wrb.Name, Environment.NewLine, wrb.Path);

  8.             MessageBox.Show(result);
复制代码

TA的精华主题

TA的得分主题

发表于 2015-11-20 20:49 | 显示全部楼层
本帖最后由 excelhomesnake 于 2015-11-20 20:51 编辑

你所说的没有反应,应该是里面有抛出异常的语句,但我发现在vsto,居然不会在运行时抛出.很怪异的感觉.
因为,一个新建但还没有保存的工作簿,是没有path的
附件是我目前试手的代码.

想请教一下,有没有application的newWorkbook事件的呢?

ExcelAddIn1.rar

92.53 KB, 下载次数: 80

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-21 22:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 VBA万岁 于 2015-11-21 22:28 编辑
excelhomesnake 发表于 2015-11-19 16:40
想请教一下,任务窗格,只能在thisAddIn对象添加吗?如果我创建的是文档级别的项目,就不能添加任务窗格吗?

测试了一下,好像不行,测试代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using System.Xml.Linq;
  8. using Microsoft.Office.Tools.Excel;
  9. using Microsoft.VisualStudio.Tools.Applications.Runtime;
  10. using Excel = Microsoft.Office.Interop.Excel;
  11. using Office = Microsoft.Office.Core;

  12. namespace ExcelWorkbook1
  13. {   
  14.     public partial class ThisWorkbook
  15.     {
  16.         internal Microsoft.Office.Tools.CustomTaskPane myTaskPane;
  17.         private void ThisWorkbook_Startup(object sender, System.EventArgs e)
  18.         {
  19.             myTaskPane = Globals.ThisWorkbook.CustomTaskPanes.Add(new UserControl1(""), "Excel Help");
  20.             myTaskPane.Visible = true;
  21.         }

  22.         private void ThisWorkbook_Shutdown(object sender, System.EventArgs e)
  23.         {
  24.         }

  25.         #region VSTO 设计器生成的代码

  26.         /// <summary>
  27.         /// 设计器支持所需的方法 - 不要
  28.         /// 使用代码编辑器修改此方法的内容。
  29.         /// </summary>
  30.         private void InternalStartup()
  31.         {
  32.             this.Startup += new System.EventHandler(ThisWorkbook_Startup);
  33.             this.Shutdown += new System.EventHandler(ThisWorkbook_Shutdown);
  34.         }

  35.         #endregion

  36.     }
  37. }
复制代码


6.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-21 22:44 | 显示全部楼层
VBA万岁 发表于 2015-11-19 08:44
二、C#中,活动工作薄怎样表示。

excelhomesnake大侠,不知道在C#中,活动工作薄、活动工作表怎样表示? ...

三、C#中,为什么用foreach (FileInfo file in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))没反应?

        以下两段代码分别为批量判断工作表是否存在保护及是否存在公式的。可一用foreach (FileInfo file indir.GetFiles(...))循环,程序则没了反应。一旦注释掉揗环代码,程序会有反应,但只能显示指定工作薄中所有工作表是否被保护或存在公式。而无法显示指定路径中所有工作薄的所有工作表是否被保护或存在公式。不知为何?


  1. private void mb2_Click(object sender, RibbonControlEventArgs e)
  2.         {
  3.             //fn判断工作表是否被保护(Pa.SuperTip.Substring(0, Pa.SuperTip.LastIndexOf("\") + 1));
  4.             fn判断工作表是否被保护(Pa.SuperTip);
  5.         }

  6.         private static void fn判断工作表是否被保护(string v_strDir)
  7.         {
  8.             String msg = "";
  9.             Application app = new Application();
  10.             //DirectoryInfo dir = new DirectoryInfo(v_strDir);

  11.             try
  12.             {
  13.                 //递归查找所有Excel 2007/2010的文件
  14.                 //foreach (FileInfo f in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))
  15.                 //{
  16.                     //Workbook book = app.Workbooks.Open(f.FullName);
  17.                     Workbook book = app.Workbooks.Open(v_strDir);
  18.                     msg = book.Name + "受保护的工作表有:\n";
  19.                     foreach (Worksheet sheet in book.Worksheets)
  20.                     {
  21.                         if (book.Worksheets[sheet.Name].ProtectContents==true)
  22.                         {
  23.                             msg = msg + sheet.Name + "\n";
  24.                         }
  25.                     }
  26.                    app.Application.DisplayAlerts = false;
  27.                    book.Close();
  28.                 //}
  29.             }
  30.             catch (Exception ex)
  31.             {
  32.                 throw ex;
  33.             }
  34.             finally
  35.             {
  36.                 app.Quit();
  37.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
  38.                 app = null;
  39.                 GC.Collect();
  40.             }

  41.             System.Windows.Forms.MessageBox.Show(msg);
  42.         }

  43.         private void mb3_Click(object sender, RibbonControlEventArgs e)
  44.         {
  45.             //fn判断单元格是否包含公式(Pa.SuperTip.Substring(0, Pa.SuperTip.LastIndexOf("\") + 1));
  46.             fn判断单元格是否包含公式(Pa.SuperTip);
  47.         }

  48.         private static void fn判断单元格是否包含公式(string v_strPath)
  49.         {
  50.             //StringBuilder sb = new StringBuilder();
  51.             Application app = new Application();
  52.             //DirectoryInfo dir = new DirectoryInfo(v_strPath);
  53.             string msg = "";
  54.             try
  55.             {
  56.                 //foreach (FileInfo file in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))
  57.                 //{
  58.                     //Workbook book = app.Workbooks.Open(file.FullName);
  59.                     Workbook book = app.Workbooks.Open(v_strPath);
  60.                     msg = book.Name + "含有公式的单元格:\n";
  61.                     foreach (Worksheet sheet in book.Worksheets)
  62.                     {
  63.                         msg = msg + "\n" + sheet.Name + ": \n";
  64.                         foreach (Range cel in sheet.UsedRange)
  65.                         {
  66.                             string src = cel.Value == null ? string.Empty : cel.Value.ToString();
  67.                             //string dest = destsheet.Cells[cel.Row, cel.Column].Value == null ? string.Empty : destsheet.Cells[cel.Row, cel.Column].Value.ToString();
  68.                             if (cel.HasFormula==true)
  69.                             {
  70.                                 msg = msg + cel.Address + "→" + cel.Value + "        ";
  71.                             }
  72.                         }
  73.                         //for (int i = 1; i < sheet.UsedRange.Rows.Count; i++)
  74.                         //{
  75.                             //for (int j = 1; j < sheet.UsedRange.Columns.Count; j++)
  76.                             //{
  77.                                 //if (sheet.Cells[i, j].Interior.Color != ColorTranslator.ToOle(Color.FromArgb(255, 204, 153)))
  78.                                 //{
  79.                                     //if (sheet.Cells[i, j].HasFormula==true)
  80.                                     //{
  81.                                         //msg=msg+book.Name + " " + sheet.Name + " 第" + i.ToString() + "行第" + j.ToString() + "列包含公式!\n";
  82.                                     //}
  83.                                 //}
  84.                             //}
  85.                         //}
  86.                     }
  87.                     book.Close();
  88.                 //}
  89.             }
  90.             catch (Exception ex)
  91.             {
  92.                 throw ex;
  93.             }
  94.             finally
  95.             {
  96.                 //app.Quit();
  97.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
  98.                 app = null;
  99.                 GC.Collect();
  100.             }

  101.             System.Windows.Forms.MessageBox.Show(msg);
  102.         }
复制代码


TA的精华主题

TA的得分主题

发表于 2015-11-22 02:49 | 显示全部楼层
VBA万岁 发表于 2015-11-21 22:44
三、C#中,为什么用foreach (FileInfo file in dir.GetFiles("*.xlsx", SearchOption.AllDirectories))没 ...

你需要在第二参数使用通配符,然后第三参数指定遍历所有子文件夹
具体可以参考附件

另外,建议你开启调试不捕捉异常,这样可以让你知道哪里出错.具体如下
菜单上的
调试 -> 异常 -> 把第二项勾上 -> 确定.

这样每次调试,一开始会报一个错误,你选继续就可以.

ExcelAddIn1.rar

101.83 KB, 下载次数: 34

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 02:05 , Processed in 0.048271 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表