ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

谈谈vs2010 vsto C#入门

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 12:32 | 显示全部楼层
继续修改演练
原来的代码是工作表启动时运行两个子程序,在实际运用时可能要在工作表打开后才决定做什么。操纵这个过程就需要自定义功能菜单
点击添加新项目,选功能区(可视化设计器) ,在上面 添加 两个 按钮控件。
自定义功能.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 12:41 | 显示全部楼层
按 Ctrl+Alt+0打开代码区

加入事件代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Microsoft.Office.Tools.Ribbon;

  6. namespace ExcelWorkbook4
  7. {
  8.     public partial class Ribbon1
  9.     {
  10.         private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
  11.         {
  12.             this.button1.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(
  13.                                     this.button1_Click);
  14.             this.button2.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(
  15.                                     this.button2_Click);

  16.         }

  17.         private void button1_Click(object sender, RibbonControlEventArgs e)
  18.         {
  19.             Globals.Sheet1.DemoArray();
  20.         }

  21.         private void button2_Click(object sender, RibbonControlEventArgs e)
  22.         {
  23.             Globals.Sheet1.DemoDic();
  24.         }
  25.     }
  26. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 12:45 | 显示全部楼层
点击 生成,接着 点击发布,修改完成,在生成的文件夹运行Setup.exe,升级安装。
生成的实际效果图
自定义.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 12:51 | 显示全部楼层
增加了自定义功能的演练源代码。
版本1.0.0.6
代码测试通过
编译环境 win7 64 office2010 64 vs2010

ExcelWorkbook4.rar

523.45 KB, 下载次数: 73

TA的精华主题

TA的得分主题

发表于 2012-11-10 12:59 | 显示全部楼层
楼主问个问题
Globals.ThisWorkbook.ActiveSheet
上面这句怎么能得到活动工作表表名(要非循环的办法)

昨天弄个好久没结果
下面是循环的
Dim a As Excel.Worksheet
        For Each a In Globals.ThisWorkbook.Sheets
            MsgBox(Globals.ThisWorkbook.ActiveSheet Is a)
        Next

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 13:42 | 显示全部楼层
HHAAMM 发表于 2012-11-10 12:59
楼主问个问题
Globals.ThisWorkbook.ActiveSheet
上面这句怎么能得到活动工作表表名(要非循环的办法)

C#的
Excel.Worksheet sh;
            sh = this.Application.ActiveSheet;
            MessageBox.Show(sh.Name);

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 13:58 | 显示全部楼层
VB.NET的
  1. Private Sub Sheet1_Startup() Handles Me.Startup
  2.         Dim sh As Excel.Worksheet
  3.         Dim strName As String
  4.         sh = Me.Application.ActiveSheet
  5.         strName = sh.Name
  6.         MsgBox(strName)
  7.     End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-11-10 13:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ok
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sh As Excel.Worksheet
        sh = Me.Application.ActiveSheet
        MsgBox(sh.Name)
    End Sub

用Globals类不能这样

TA的精华主题

TA的得分主题

发表于 2012-11-10 15:26 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-11 08:47 | 显示全部楼层
数据库在Excel的数据统计,数据分析起很大的作用。
我测试过Excel+Access,在数据量大多列的 情况下,比数据源在同一个工作簿效率要高。
在演练里添加与Access连接
选用的是罗斯文数据库,一个经典的数据库模板。
演练删除两个子过程,DemoArray(),DemoDic()
添加了与Accessl连接的子过程DemoAccess()
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.OleDb;
  5. using System.Text;
  6. using System.Xml;
  7. using System.Xml.Serialization;
  8. using System.Windows.Forms;
  9. using Microsoft.Office.Tools.Excel;
  10. using Microsoft.VisualStudio.Tools.Applications.Runtime;
  11. using Excel = Microsoft.Office.Interop.Excel;
  12. using Office = Microsoft.Office.Core;
  13. //System.Collections.Generic;使用字典
  14. namespace ExcelWorkbook4
  15. {
  16.     public partial class Sheet1
  17.     {
  18.         //VBA代码: Dim sh As Worksheet
  19.         Excel.Worksheet sh;
  20.         //VBA代码:Set rng1 = Range("c1")
  21.         Excel.Range rng1;
  22.         
  23.         private void Sheet1_Startup(object sender, System.EventArgs e)
  24.         {
  25.             //Sheet1_Startup当工作表启动前需要完成的操作在这里执行
  26.             //这里的位置应该减少细节操作,用子过程完成         
  27.         }

  28.         private void Sheet1_Shutdown(object sender, System.EventArgs e)
  29.         {
  30.            //工作表关闭前需要执行的操作      
  31.         }

  32.         public void DemoAccess()
  33.         {
  34.             sh = this.Application.ActiveSheet;
  35.             // 设置访问连接并选择字符串。
  36.             //如果Access数据库采用默认加密,VBA代码无法打开,ADO.NET却可以
  37.             string strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\myFile\\罗斯文.accdb;Jet OLEDB:Database Password=";
  38.             string strSql = "SELECT * FROM 客户";

  39.             // 创建数据集,DataSet功能强大值得钻研
  40.             DataSet myDataSet = new DataSet();
  41.             OleDbConnection Cnn = null;
  42.          
  43.             Cnn = new OleDbConnection(strCnn);
  44.             OleDbCommand myCommand = new OleDbCommand(strSql, Cnn);
  45.             OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myCommand);
  46.             try
  47.             {
  48.                 //连接Access数据库
  49.                 Cnn.Open();
  50.                 //填充数据集
  51.                 myDataAdapter.Fill(myDataSet);
  52.             }
  53.             catch (Exception ex)
  54.             {
  55.                 MessageBox.Show(ex.Message);
  56.                 return;
  57.             }
  58.             finally
  59.             {
  60.                 //关闭数据库连接
  61.                 Cnn.Close();
  62.             }
  63.             //从脱机数据集获取数据表信息
  64.             
  65.             try
  66.             {               
  67.                 int i = 1;
  68.                 sh.Cells[i, 1].value2 = "罗斯文数据库客户数据表信息";
  69.                 i++;
  70.                 sh.Cells[i, 1].value2 = "客户数量";
  71.                 sh.Cells[i, 2].value2 = myDataSet.Tables[0].Rows.Count;
  72.                 i++;
  73.                 sh.Cells[i, 1].value2 = "数据表列字段";
  74.                 sh.Cells[i, 2].value2 = myDataSet.Tables[0].Columns.Count;
  75.             }
  76.             catch (Exception ex)
  77.             {
  78.                 MessageBox.Show(ex.Message);
  79.                 return;
  80.             }
  81.          }
  82.         public void DemoDic()
  83.         {
  84.         }
  85.         #region VSTO 设计器生成的代码

  86.         /// <summary>
  87.         /// 设计器支持所需的方法 - 不要
  88.         /// 使用代码编辑器修改此方法的内容。
  89.         /// </summary>
  90.         private void InternalStartup()
  91.         {
  92.             this.Startup += new System.EventHandler(Sheet1_Startup);
  93.             this.Shutdown += new System.EventHandler(Sheet1_Shutdown);
  94.         }

  95.         #endregion

  96. }
  97. }
复制代码
相应的 Ribbon 点击事件代码
  1. private void button1_Click(object sender, RibbonControlEventArgs e)
  2.         {
  3.             Globals.Sheet1.DemoAccess();
  4.         }
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-12 05:27 , Processed in 0.046818 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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