ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VSTO入门问题集

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-23 14:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 VBA万岁 于 2015-12-23 14:20 编辑
excelhomesnake 发表于 2015-12-22 18:53
没看到你的截图.但大概看了一下代码部分.
你用pia打开excel文件,接着又用ado连接excel文件.应该会被占用 ...


       有一个疑问——如何删除废弃的类?
                之前仿照152楼第2个链帖,写了个DataAccess类,想实现将当前活动工作表省市区数据导入Access数据库,但后来在167楼的代码中跟本就用不上这个类。
                所以,现在想删除这个类,但当我关闭它后,直接将其从程序文件中移走时,VSTO会报错。不知道如何将其清走?

TA的精华主题

TA的得分主题

发表于 2015-12-23 14:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
VBA万岁 发表于 2015-12-23 14:18
有一个疑问——如何删除废弃的类?
                之前仿照152楼第2个链帖,写了个DataAcces ...

直接在你的项目中,删除代码或代码所在的cs文件,就可以.你说的vs编译错误,你应该看看错误信息列表.估计是有地方使用了这个类所导致的.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-23 15:38 | 显示全部楼层
excelhomesnake 发表于 2015-12-23 14:45
直接在你的项目中,删除代码或代码所在的cs文件,就可以.你说的vs编译错误,你应该看看错误信息列表.估计是 ...

有空我再看看。
另,关于类,是不是相当于VB及VBA当中的模块?——VB项目中是有模块的,但我发现VC#中似乎没有。

TA的精华主题

TA的得分主题

发表于 2015-12-23 16:12 | 显示全部楼层
VBA万岁 发表于 2015-12-23 15:38
有空我再看看。
另,关于类,是不是相当于VB及VBA当中的模块?——VB项目中是有模块的,但我发现VC#中似 ...

你所说的应该是指代码模块,C#没有听说过.
但这个应该是一种组织代码的形式而已.之前我使用vba,大部分情况也是写类模块,很少使用模块.
在我看来,你说的模块就是一种静态的写法,在编译的时候就可以确定运行逻辑(当然vba是解释运行的).相当于一个静态类或静态方法.

TA的精华主题

TA的得分主题

发表于 2015-12-23 16:50 | 显示全部楼层
VBA万岁 发表于 2015-12-23 15:38
有空我再看看。
另,关于类,是不是相当于VB及VBA当中的模块?——VB项目中是有模块的,但我发现VC#中似 ...

恐怕之前的回复被吃掉了.
C#里面没有代码模块的概念,至少我没有听过,但有程序集模块,功能与你说的完全不一样.
至于从性质来说,你说的代码模块,其实与静态类或静态方法差不多,都是编译确定的.
我也会一点vba,其实vba模块可以做的事情,静态类一样可以做到的.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-23 17:20 | 显示全部楼层
excelhomesnake 发表于 2015-12-23 16:50
恐怕之前的回复被吃掉了.
C#里面没有代码模块的概念,至少我没有听过,但有程序集模块,功能与你说的完全不 ...

多谢指点!
看来C#基础理论的学习迫在眉睫,目前正在边啃《C#设计模式》,边搜索网上实例进行测试......

TA的精华主题

TA的得分主题

发表于 2015-12-23 17:27 | 显示全部楼层
VBA万岁 发表于 2015-12-23 17:20
多谢指点!
看来C#基础理论的学习迫在眉睫,目前正在边啃《C#设计模式》,边搜索网上实例进行测试......

不客气.
推荐你可以看看<C#高级编程>的前几章.
还有<果壳中的C#>,都是很好的资料.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-25 16:31 | 显示全部楼层
excelhomesnake 发表于 2015-12-23 17:27
不客气.
推荐你可以看看的前几章.
还有,都是很好的资料.

帖上下载链接:
果壳中的C#_C#

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-25 18:49 | 显示全部楼层
VBA万岁 发表于 2015-12-23 14:07
八(二)问题终于测试成功,原来只需将167楼的第38句代码改为如下即可:
OleDbCommand command = new Ol ...

完整代码(包括删除及新建Access数据代码)如下:
  1. string accessFilePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\数据源\省市区三级联动.mdb";
  2.         private void button2_Click(object sender, EventArgs e)
  3.         {
  4.             newAccess();

  5.             object o = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
  6.             Microsoft.Office.Interop.Excel._Application app = o as Microsoft.Office.Interop.Excel._Application;
  7.             Microsoft.Office.Interop.Excel.Workbook srcbook = app.ActiveWorkbook;//得到当前活动的excel文档
  8.             Microsoft.Office.Interop.Excel.Worksheet sh = (Microsoft.Office.Interop.Excel.Worksheet)srcbook.ActiveSheet;//得到当前Sheet
  9.             try
  10.             {
  11.                 OleDbConnectionStringBuilder connectStringBuilder = new OleDbConnectionStringBuilder();
  12.                 connectStringBuilder.DataSource = srcbook.FullName;
  13.                 connectStringBuilder.Provider = "Microsoft.Ace.OleDb.12.0";
  14.                 connectStringBuilder.Add("Extended Properties", "Excel 12.0");
  15.                 using (OleDbConnection cn = new OleDbConnection(connectStringBuilder.ConnectionString))
  16.                 {
  17.                     cn.Open();
  18.                     DataSet ds = new DataSet();
  19.                     string sql = "Select * from [" +sh.Name + "$]";
  20.                     OleDbCommand cmdLiming = new OleDbCommand(sql, cn);
  21.                     using (OleDbDataReader drLiming = cmdLiming.ExecuteReader())
  22.                     {
  23.                         ds.Load(drLiming, LoadOption.OverwriteChanges, new string[] { sh.Name });
  24.                         DataTable dt = ds.Tables[sh.Name];
  25.                         if (dt.Rows.Count > 0)
  26.                         {
  27.                             for (int i = 0; i < dt.Rows.Count; i++)
  28.                             {
  29.                                 //写入数据库数据
  30.                                 string MySql = "insert into VBA实现省市区三级联动(省,市,区) values('" + dt.Rows[i]["省"].ToString() + "','" + dt.Rows[i]["市"].ToString() + "','" + dt.Rows[i]["区"].ToString() + "')";
  31.                                 OleDbConnection connct = new OleDbConnection();
  32.                                 string oleDB = "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + accessFilePath;
  33.                                 connct.ConnectionString = oleDB;
  34.                                 //打开数据库
  35.                                 connct.Open();
  36.                                 OleDbCommand command = new OleDbCommand(MySql, connct);
  37.                                 command.Connection = connct;
  38.                                 int res = command.ExecuteNonQuery();
  39.                                 // 关闭连接
  40.                                 connct.Close();
  41.                                 //return res;
  42.                             }
  43.                             MessageBox.Show("数据导入成功!");
  44.                         }
  45.                         else
  46.                         {
  47.                             MessageBox.Show("请检查你的Excel中是否存在数据");
  48.                         }
  49.                     }
  50.                 }
  51.             }
  52.             catch (Exception ex)
  53.             {
  54.                 MessageBox.Show(ex.ToString());
  55.             }
  56.         }

  57.         private void newAccess()
  58.         {
  59.             if (System.IO.File.Exists(accessFilePath) == true)
  60.             {
  61.                 System.IO.File.Delete(accessFilePath);
  62.             }
  63.             //以上代码删除已存在的同路径同名的的;以下的代码为新建,需添加“Microsoft ADO Ext. 2.8 for DDL and Security”及“Microsoft ActiveX Data Objects 2.8 Library”两个引用

  64.             ADOX.Catalog catalog = new Catalog();
  65.             catalog.Create("Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + accessFilePath + ";Jet OLEDB:Engine Type=5");
  66.             
  67.             ADODB.Connection cn = new ADODB.Connection();
  68.             cn.Open("Provider=Microsoft.Ace.OleDb.12.0;Data Source=" + accessFilePath, null, null, -1);
  69.             catalog.ActiveConnection = cn;
  70.             ADOX.Table table = new ADOX.Table();
  71.             table.Name = "VBA实现省市区三级联动";
  72.             ADOX.Column column = new ADOX.Column();
  73.             column.ParentCatalog = catalog;
  74.             column.Name = "ID";
  75.             column.Type = DataTypeEnum.adInteger;
  76.             column.DefinedSize = 9;
  77.             column.Properties["AutoIncrement"].Value = true;
  78.             table.Columns.Append(column, DataTypeEnum.adInteger, 9);
  79.             table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);
  80.             table.Columns.Append("省", DataTypeEnum.adVarWChar, 50);
  81.             table.Columns.Append("市", DataTypeEnum.adVarWChar, 50);
  82.             table.Columns.Append("区", DataTypeEnum.adVarWChar, 50);
  83.             catalog.Tables.Append(table);
  84.             cn.Close();
  85.         }
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-25 19:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-12-25 18:49
完整代码(包括删除及新建Access数据代码)如下:

至此,关于省市区数据相关的VS项目(包括复合框控件数据联动及Excel表数据与外部文件数据的交换)已制作完毕,制作源码如下: ExcelHelpTaskPane.rar (583.72 KB, 下载次数: 2)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-28 20:59 , Processed in 0.037243 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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