ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

请问在vsto中,怎么使用工作表公式??

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-27 16:36 | 显示全部楼层 |阅读模式
在VBA中可以使用 a = Application.WorksheetFunction.Sum(Sheets(1).Range("A3:A10"))
VSTO 不能使用Dim a As Integer = Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("A3:A10")),提示WorksheetFunction不是Vbe.Interop.Application成员。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-28 09:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
咋没人解决啊,只有自己百度啦。

TA的精华主题

TA的得分主题

发表于 2014-8-28 12:21 | 显示全部楼层
文档级例子:Sheet1激活时运行函数sum计算范围A1:E1。
  1. Private Sub Sheet1_Startup() Handles Me.Startup
  2.         Dim app As Excel.Application = Me.Application
  3.         Dim rng As Excel.Range = Globals.Sheet1.Range("A1:E1")
  4.         Dim i As Integer
  5.         For i = 1 To 5
  6.             rng.Cells(1, i) = i
  7.         Next
  8.         '赋值给变量
  9.         Dim n As Integer = app.WorksheetFunction.Sum(rng)
  10.         '赋值给单元格
  11.         Globals.Sheet1.Range("B2").Value2 = app.WorksheetFunction.Sum(rng)
  12.     End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-28 21:19 | 显示全部楼层
lipton 发表于 2014-8-28 12:21
文档级例子:Sheet1激活时运行函数sum计算范围A1:E1。

谢谢啦,果不然有高手。参考你的代码,写成这样就可以了。Dim a As Integer = Excel.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("A3:A10"))

TA的精华主题

TA的得分主题

发表于 2014-8-29 08:23 | 显示全部楼层
lqg2069 发表于 2014-8-28 21:19
谢谢啦,果不然有高手。参考你的代码,写成这样就可以了。Dim a As Integer = Excel.Application.Workshe ...

Dim a As Integer = Excel.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("A3:A10"))

这句代码。参数对象包含了3个可变因素,不利于应对需求改变,无论是什么语言都适应的一个原则是“把变与不变隔离开来”

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-29 09:07 | 显示全部楼层
本帖最后由 lqg2069 于 2014-8-29 09:09 编辑
lipton 发表于 2014-8-29 08:23
Dim a As Integer = Excel.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("A ...

非常赞同5楼的说法。这样写简单,但不利于需求的改变。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-29 09:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这样写也可以,没报错 Dim a As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("A3:A10"))

TA的精华主题

TA的得分主题

发表于 2014-8-29 09:43 | 显示全部楼层
Globals.ThisWorkbook.Sheets(1).Range("A3:A10")

表示工作表集合的第一张表(不管是什么表),某天用户不经意的移动了表或插入一张新表,程序不报错(比报错更糟糕)继续运行,但结果不是你想要的。或是用在另一个工作簿 ,工作表并不是原来的顺序,这类的困惑在论坛里经常见到,其中的原因是以为短句就是优化,一句话完成多个功能等等,起码我在很长一段时间是这样认为的。

TA的精华主题

TA的得分主题

发表于 2014-8-31 11:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
程序设计有几个基本原则:
单一职责,职责清晰
面向功能组合编程,而不是面向过程编程
一个过程不要包含两个以上影响返回结果的参数
把变与不变隔离开来(应对需求改变)

有位著名的编程大师说过,一个过程超过25行这个算法就应重写。这句话包含了上面的几个原则。

初学编程的时候看过一段源代码
大致是

sub test()
     dim a
     dim b
     dim c
     a=1
     b=1
    c = add(a,b)

end sub

function add(a,b)
    add=a+b
end function

当时看了很困惑干嘛要这样写
这样不是更简单:

sub test()
    dim c

   c = 1+1

end sub

这需要自己悟。

另:不赞成在汇总代码里用插入公式的方式进行汇总,每一个单元格的改变会引发重算很耗资源,而且过程无法控制。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 09:24 | 显示全部楼层
本帖最后由 lqg2069 于 2014-8-31 09:30 编辑
lipton 发表于 2014-8-29 09:43
Globals.ThisWorkbook.Sheets(1).Range("A3:A10")

表示工作表集合的第一张表(不管是什么表),某天用户 ...

以上是简化的语句。我用excel取得WCF服务的数据,放在临时表qtbb,然后用excel二次汇总数据,下面是我的原代码。
Private Sub Sheet2_ActivateEvent() Handles Me.ActivateEvent
        Globals.ThisWorkbook.Application.ScreenUpdating = False
        With Globals.ThisWorkbook.Sheets("地区商品")
            Globals.ThisWorkbook.Application.StatusBar = "正在汇总 地区商品,请稍等。。"
            .range("b1") = Globals.ThisWorkbook.Sheets("报表").Range("b1").Text & Year(Now()) & "年" & Month(Now()) & "月" & Globals.ThisWorkbook.Sheets("报表").Range("f1").Text & "汇总进.销.存报表"
            Dim z As Integer = .UsedRange.Rows.Count
            If z > 6 Then .Rows("4:" & z - 2 & "").Delete()
            Dim z3 As Integer = Globals.ThisWorkbook.Sheets("qtbb").UsedRange.Rows.Count
            z = Globals.ThisWorkbook.Sheets("报表").Range("G1").Value2
            If z > 0 Then
                .Rows("4:" & z + 3 & "").Insert()
                .Range("A4:d" & z + 4 & "").value = Globals.ThisWorkbook.Sheets("qtbb").Range("B3:E" & z + 2 & "").value
                Dim BB As Integer = .UsedRange.Rows.Count
                .Range("A4:C" & BB - 2 & "").NumberFormatLocal = "@"
                .Range("E4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[1])"
                .Range("F4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[1])"
                .Range("G4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[9])-SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[10])"
                .Range("H4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("I4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[9])-SUMIF(qtbb!C2,地区商品!RC1,qtbb!C[10])"
                .Range("J4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("K4").FormulaR1C1 = "=RC[-4]+RC[-2]"
                .Range("L4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("M4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C10)"
                .Range("N4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("O4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C11)"
                .Range("P4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("Q4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C12)"
                .Range("R4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C13)"
                .Range("S4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C14)"
                .Range("T4").FormulaR1C1 = "=RC[-3]+RC[-2]+RC[-1]"
                .Range("U4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("V4").FormulaR1C1 = "=RC[-9]+RC[-7]+RC[-2]"
                .Range("W4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("X4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C15)"
                .Range("Y4").FormulaR1C1 = "=RC[-1]*RC4"
                .Range("Z4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C20)"
                .Range("AA4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C21)"
                .Range("AB4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C22)"
                .Range("AC4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C23)"
                .Range("AD4").FormulaR1C1 = "=SUMIF(qtbb!C2,地区商品!RC1,qtbb!C24)"
                .Range("AE4").FormulaR1C1 = "=RC[-7]+RC[-5]-RC[-4]+RC[-3]+RC[-2]-RC[-1]"
                .Range("AF4").FormulaR1C1 = "=RC[-27]+RC[-21]-RC[-10]-RC[-8]+RC[-6]-RC[-5]+RC[-4]+RC[-3]-RC[-2]"
                .Range("E4:AF4").AutoFill(Destination:=.Range("E4:AF" & BB - 2 & ""))
                .Range("E" & BB - 1 & ":AF" & BB - 1 & "").FormulaR1C1 = "=SUM(R[-" & BB - 5 & "]C:R[-1]C)"
                .Range("e4:af" & BB - 1 & "").value = .Range("e4:af" & BB - 1 & "").value
                If .Range("AF" & BB - 1 & "").Value <> 0 Then Globals.ThisWorkbook.Sheets("报表").Range("o2") = "报表不平!" Else Globals.ThisWorkbook.Sheets("报表").Range("o2") = ""
                Dim wsth As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets("qtbb").Range("y3:y" & z3 & ""))
                Dim bs As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets(1).Range("z3:z" & z3 & ""))
                Dim zc As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets("qtbb").Range("aa3:aa" & z3 & ""))
                Dim jh As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets("qtbb").Range("ab3:ab" & z3 & ""))
                Dim dh As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets("qtbb").Range("ac3:ac" & z3 & ""))
                Dim th As Integer = Me.Application.WorksheetFunction.Sum(Globals.ThisWorkbook.Sheets("qtbb").Range("ad3:ad" & z3 & ""))
                If System.Math.Abs(wsth) + System.Math.Abs(bs) + System.Math.Abs(zc) + System.Math.Abs(jh) + System.Math.Abs(dh) + System.Math.Abs(th) = 0 Then
                    Globals.ThisWorkbook.Sheets("报表").Range("p2") = ""
                Else
                    Globals.ThisWorkbook.Sheets("报表").Range("p2") = "未审(退货" & wsth & "报损" & bs & "支出" & zc & "),未收(进货" & jh & "调货" & dh & "退货" & th
                End If
            End If
        End With
        Globals.ThisWorkbook.Application.StatusBar = False
        Globals.ThisWorkbook.Application.ScreenUpdating = True
    End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 21:38 , Processed in 0.041277 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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