ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 使用VSTO进行BOM快速录入功能的实现

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-6-22 12:52 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 864163213 于 2021-6-22 13:04 编辑

复制代码
     主要由以上几方面组成来实现          1 excel 任务窗格 外接应用程序
      2 用户控件
      3 数据库
   
    实现效果1

        表格内快速写入物料信息
   实现方式:

   把所有系统物料绑定用户控件TREE,通过双击即可把对应的物料的型号,厂家,编码写到当前BOM表内

以使工程无需从其它地方查找;由到数据都从数据库读取,不管外网内网均可以同步读取
控件的点击事件代码如下:
  1. Private Sub addwin()
  2.         Dim MyControl As MyTask = New MyTask
  3.         WritR.Checked = True
  4.         ischeck = True

  5.         Try
  6.             TaskPaneShared.MyPane = Globals.ThisAddIn.CustomTaskPanes.Add(MyControl, "--")
  7.             TaskPaneShared.MyPane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionRight
  8.             TaskPaneShared.MyPane.Width = 600
  9.             TaskPaneShared.MyPane.Visible = True
  10.         Catch ex As Exception
  11.             MessageBox.Show(ex.Message)
  12.         End Try

  13.     End Sub
复制代码
任务窗格代码如下:

  1. Imports System.Windows.Forms

  2. Public Class MyTask
  3.     Private xlApp As Excel.Application
  4.     Dim Tr As TreeView
  5.     Dim Lb As ListBox
  6.     Dim xlDa As TaskData
  7.     Public WriteRow As Boolean
  8.     Private Shared MT As MyTask
  9.     Private Shared ReadOnly _Lock As Object = New Object


  10.     Public Shared Function GetInstance() As MyTask
  11.         If IsNothing(MT) Then
  12.             SyncLock _Lock
  13.                 If IsNothing(MT) Then
  14.                     MT = New MyTask
  15.                 End If

  16.             End SyncLock
  17.         End If
  18.         Return MT
  19.     End Function

  20.     Private Sub MyTask_Load(sender As Object, e As EventArgs) Handles Me.Load
  21.         xlApp = Globals.ThisAddIn.Application
  22.         Lb = Me.ListBox1
  23.         Tr = Me.TreeView1
  24.         addTr2()
  25.         xlApp.ScreenUpdating = True
  26.         addlb("备注信息,价格")
  27.     End Sub

  28.     Public Sub addTr2()
  29.         TreeView1.Nodes.Clear()
  30.         xlDa = New TaskData()
  31.         Dim Top_LS() As String = xlDa.Top_LS.ToArray
  32.         For i = 0 To Top_LS.GetUpperBound(0)
  33.             If Trim(Top_LS(i)) = "" Then Continue For
  34.             Dim k As Integer = TreeView1.Nodes.Add(New TreeNode(Top_LS(i))) '第一级
  35.             Dim Tr As TreeNode = TreeView1.Nodes(k)
  36.             AddTreenode(Tr, Top_LS(i))
  37.         Next
  38.       
  39.     End Sub
  40.     ''' <summary>
  41.     ''' 递归树状图
  42.     ''' </summary>
  43.     ''' <param name="Tr">节点</param>
  44.     ''' <param name="key">上级</param>
  45.     Private Sub AddTreenode(Tr As TreeNode, key As String)
  46.         If xlDa.OtherCls.ContainsKey(key) Then
  47.             Dim items() As String = xlDa.OtherCls(key).ToArray
  48.             For z = 0 To items.GetUpperBound(0) '同级
  49.                 Dim i As Integer = Tr.Nodes.Add(New TreeNode(items(z)))
  50.                 Dim item As String = Tr.Nodes(i).Text
  51.                 If Trim(item) <> "" Then '查是否有下一级
  52.                     Dim NewTr As TreeNode = Tr.Nodes(i)
  53.                     Dim NewKey As String = key & item
  54.                     AddTreenode(NewTr, NewKey)
  55.                 End If
  56.             Next
  57.         End If
  58.     End Sub
  59.     Private Sub addlb(li As String)
  60.         Dim mLv() As String = li.Split(Chr(44))
  61.         Lb.Items.Clear()
  62.         If IsNothing(mLv) OrElse mLv.Length < 1 Then Return
  63.         For Each item As String In mLv
  64.             Lb.Items.Add(item)
  65.         Next
  66.     End Sub

  67.     Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
  68.         Lb.Items.Clear()
  69.         Dim index As TreeNode = Tr.SelectedNode
  70.         If IsNothing(index) Then Return
  71.         Dim s As String = index.Text
  72.         If xlDa.Noteinfo.ContainsKey(s) Then
  73.             Lb.Items.AddRange(xlDa.Noteinfo(s))
  74.         End If
  75.     End Sub

  76.     Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick
  77.         Dim index As Integer = Lb.SelectedIndex
  78.         If IsNothing(index) Then Return
  79.         Dim s As String = Lb.Items(index).ToString
  80.         TextBox1.Clear()
  81.         TextBox1.Text = Lb.Items(Lb.SelectedIndex).ToString
  82.         'Clipboard.SetDataObject(Lb.Items(index))

  83.         'MessageBox.Show("内容已经复制完毕")
  84.     End Sub
  85.     Dim b As Boolean
  86.     Private Sub TreeView1_DoubleClick(sender As Object, e As EventArgs) Handles TreeView1.DoubleClick
  87.         Lb.Items.Clear()
  88.         Dim xlApp As Excel.Application = Globals.ThisAddIn.Application
  89.         Dim index1 As TreeNode
  90.         Dim index0 As TreeNode
  91.         Dim index As TreeNode = Tr.SelectedNode
  92.         If IsNothing(index) Then Return
  93.         Dim Val As String = index.Text
  94.         Dim str As String = xlApp.ActiveCell.Address
  95.         Dim C As String = str.Substring(1, 1)
  96.         Dim R As Integer = CInt(str.Substring(3))
  97.         If WenKong.ischeck Then

  98.             If str.Contains(Chr(44)) Or str.Contains(":") Then
  99.                 MessageBox.Show("请选择单个表格")
  100.                 Return
  101.             End If
  102.             If R < 6 Then Return
  103.             If index.Level = 3 Then
  104.                 index1 = index.Parent
  105.                 index0 = index1.Parent
  106.                 Dim index01 As TreeNode = index0.Parent
  107.                 xlCellWrite({index0.Text, index1.Text, index.Text, index01.Text}, R)
  108.             End If
  109.         Else
  110.             xlApp.ActiveCell.Value = Val
  111.         End If
  112.         xlApp.Range(C & (R + 1)).Select()
  113.         xlApp = Nothing
  114.         b = True
  115.     End Sub
  116.     Private Sub xlCellWrite(v() As String, R As Integer)
  117.         If IsNothing(v) Then Return
  118.         xlApp = Globals.ThisAddIn.Application
  119.         xlApp.Cells(R, CellAdress.Cadress.Main).Value = v(0)
  120.         xlApp.Cells(R, CellAdress.Cadress.Brand).Value = v(1)
  121.         xlApp.Cells(R, CellAdress.Cadress.Spec).Value = v(2)
  122.         xlApp.Cells(R, CellAdress.Cadress.Topclassify).Value = v(3)
  123.         If xlDa.Unit.ContainsKey(v(0) & v(1) & v(2)) Then
  124.             xlApp.Cells(R, CellAdress.Cadress.unit).Value = xlDa.Unit(v(0) & v(1) & v(2))
  125.         End If
  126.     End Sub
  127.     Private Sub TreeView1_BeforeCollapse(sender As Object, e As TreeViewCancelEventArgs) Handles TreeView1.BeforeCollapse
  128.         If b Then
  129.             e.Cancel = True
  130.         End If
  131.         b = False
  132.     End Sub
  133.     Private Sub Btn_Ex_Click(sender As Object, e As EventArgs) Handles Btn_Ex.Click
  134.         TreeView1.ExpandAll()
  135.     End Sub
  136.     Private Sub Btn_C_Click(sender As Object, e As EventArgs) Handles Btn_C.Click
  137.         TreeView1.CollapseAll()
  138.     End Sub

  139.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  140.         Dim val As String = UCase(M_name.Text)
  141.         Dim val2 As String = UCase(M_brand.Text)
  142.         Dim val3 As String = UCase(M_supply.Text)
  143.         DGV1.Rows.Clear()
  144.         If IsNothing(xlDa.SearcgDic) Then xlDa = New TaskData()
  145.         For Each Str As String In xlDa.SearcgDic.Keys
  146.             If Str.ToUpper.Contains(val) Then
  147.                 If Str.ToUpper.Contains(val) Then
  148.                     If Str.ToUpper.Contains(val2) Then
  149.                         DGV1.Rows.Add(xlDa.SearcgDic(Str))
  150.                     End If
  151.                 End If
  152.             End If
  153.         Next
  154.     End Sub


  155. End Class
复制代码



2525.gif

TA的精华主题

TA的得分主题

发表于 2021-6-22 13:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-6-23 15:30 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-23 16:13 | 显示全部楼层
mohao 发表于 2021-6-23 15:30
请问可以帮我看看这个VSTO代码怎么解决吗?
http://club.excelhome.net/thread-1589522-1-1.html

已回复
参考下面
  1. Dim objPPT As Microsoft.Office.Interop.PowerPoint.Application
  2.         Dim wb As Excel.Workbook = CType(Globals.ThisAddIn.Application.ActiveWorkbook, Excel.Workbook)
  3.         Dim pth As String = wb.Path & "\自动报表.pptx"
  4.         objPrs = objPPT.Presentations.Open(pth, , , msoFalse)
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-23 16:28 | 显示全部楼层
mohao 发表于 2021-6-23 15:30
请问可以帮我看看这个VSTO代码怎么解决吗?
http://club.excelhome.net/thread-1589522-1-1.html



刚好作为一个实例

ExcelAddIn2.zip

100.25 KB, 下载次数: 44

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-6-23 16:36 | 显示全部楼层
mohao 发表于 2021-6-23 15:30
请问可以帮我看看这个VSTO代码怎么解决吗?
http://club.excelhome.net/thread-1589522-1-1.html

回复了,你看看

刚好作为一个实例

  1. Dim objPPT As Microsoft.Office.Interop.PowerPoint.Application
  2.         objPPT = New Microsoft.Office.Interop.PowerPoint.Application
  3.         Dim wb As Excel.Workbook = CType(Globals.ThisAddIn.Application.ActiveWorkbook, Excel.Workbook)
  4.         Dim pth As String = wb.Path & "\自动报表.pptx"
  5.         objPrs = objPPT.Presentations.Open(pth, , , msoFalse)
复制代码

TA的精华主题

TA的得分主题

发表于 2021-6-25 13:49 | 显示全部楼层
864163213 发表于 2021-6-23 16:36
回复了,你看看

刚好作为一个实例

谢谢,现在EXCEL的图表怎么更新到PPT里我大致学会了一点,请问一个,在WORD文档里,有表格、文字,那么应该怎么能自动更新的PPT里呢?能不能也做一个VSTO的实例出来?

WORD更新PPT.zip

224.08 KB, 下载次数: 14

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 09:56 , Processed in 0.044001 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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