精华内容
下载资源
问答
  • 这是《Excel VBA:办公自动化》教程的第3节,介绍变量。1.变量的基本知识案例:在「单元格B3」输入不同的行号,然后点击「显示答案」按钮,程序就会自动计算右边相应题目的答案,如何实现?[备注]1.题目中F列的数据...
    067ca684c18625bd687fec7baca545c2.png

    这是《Excel VBA:办公自动化》教程的第3节,介绍变量。

    a093a6f6ab45c7c6624b903729c76ba4.png

    1.变量的基本知识

    案例:在「单元格B3」输入不同的行号,然后点击「显示答案」按钮,程序就会自动计算右边相应题目的答案,如何实现?

    8726d77e778fcaeb3ce6d42e96e14f33.png

    [备注]

    1.题目中F列的数据采用了RANDBETWEEN(10,100),H列采用了RANDBETWEEN(20,50);

    2.函数RANDBETWEEN(bottom,top),用于返回一个介于bottom(最小值)和top(最大值)之间的随机数,且每次Excel编辑后该公式都会自动刷新返回的随机数;

    我们一起思考一下,这样一个需求用第02篇(todo文章传输门)分享的能够实现吗?我们来分析一下:

    806e6e714757dc5162f06a7c15e9eaa0.png

    可以看到:因为「行号」被我们写为「固定」的4,所以导致我们按下按钮,程序就只能计算第四行的相应单元格的运算结果。

    如果按照上面这个思路,是不是我们需要在每行后面都加上一个「查看答案」的按钮,然后关联每一个宏。

    e383943b2d0eab1ae3863be3e61656b6.png

    如果是这样的话,那么还学什么VBA,直接手工输入,它不香吗?

    是的,那么我们用VBA如何实现呢?

    6e3b23f437cb3ca98864c1fd2c7b26c0.png

    我们观察发现:行号是变化的,而且是「正向递增加1」的规律。

    在VBA中,我们将这种根据需要能够随时变化的称为变量。

    其实,「变量」这个概念,我们在初中都已经能够运用的出神入化了,比如:

    ad3981ec1bb1c41912d0f2c2b1ff141f.png

    这里面,我们通常称x为自变量,能够取任何变化的数字,而y(因变量)就会得到相应的计算结果。怎么样,有么有很熟悉的味道?

    回到刚才的那个题目,我们需要将这些变化的行号数字更改为变量。我们用x代替,那么程序就变为:

    5dbd45273a9fa208bfbd222920829df1.png

    我们又知道,变量x的变化是依据「单元格B2」内容的变化而变化,也就是:

    f91d7c44ddd6e7fd8dff7d7fd86cfe85.png

    [备注]

    在VBA中,「=」专业术语是「赋值」

    即:将等式右边的内容赋值给等式左边,可以类似于我们日常所理解的等号

    那么,这个程序完整的代码(乘法测试是这个小程序的名称),就是:

    a63f92ada5f60e1809c0d7ad78dbb825.png

    接下来,为了方便大家的理解,我们来模拟一下程序的运行步骤:

    (1)点击按钮「查看答案」

    209a711cfa0669c17d455c6fdb767808.png

    (2)按钮自动连接运行宏「乘法测试」

    ceca42df9cd9a9f61d31874144a6daf8.png

    (3)宏「乘法测试」开始逐行执行-第一行

    c07dbee0b7e28b60b027c5d9b8f468b3.png

    VBA看到Cells(2, 2),说这个我认识,Cells(2, 2)就是「单元格B2」。于是去寻找「单元格B2」的值,发现「单元格B2」=1

    2b9ec2032372160e3e4a49079b73849c.png

    (4)「单元格B2」的值1带入Cells(x, 10) = Cells(x, 6) * Cells(x, 8),变为Cells(1, 10) = Cells(1, 6) * Cells(1, 8),翻译为人话就是:单元格J1 = 单元格F1* 单元格 H1

    09a2ffb2cee2bccdab6d2730ab7c605a.png

    (5)然后,「乘法测试」宏去Excel中寻找单元格F1的值为 28,单元格H1的值为30,计算二者之间的值

    d7e63688f1d58c32b5fb13a161a94c08.png

    (6)最后,将二者的乘积赋值给「单元格F1」,并执行值写入操作

    55db44902ad9115ea8b2dc581b14a54f.png

    通过,以上我们使用VBA中的变量使我们的程序更加的灵活

    有的同学可能会说:猴子,我想把x换为Cells(2, 2) ,把程序改为这个样子

    730206738ed6139e4ac48eb85c7588a6.png

    的确,完全可以这样,结果完全一样。但是这样操作,有以下几点缺点:

    1)程序写起来特别的长,非常容易出错;

    2)代码不易维护,修改难度大;

    3)VBA从内存中读取变量的时间要远低于读取单元格的时间;

    因此,可以总结使用变量有以下好处(拿小本本记好):

    (1)程序灵活,易于维护和修改;

    (2)代码简洁,更加优雅;

    (3)执行速度更快,效率更高。

    2.变量命名规则

    案例:已知「单元格D3」为固定值10,在「单元格C3」输入任意数值,点击「查看答案」求得长方形的面积显示在「单元格E3」

    fca192c9373b5ff66d905c4ca637dc67.png

    那么,我们该如何写代码呢?

    (1)将「单元格C3」也就是Cells(3, 3)的数值取出来,赋值给变量x,那么变量x现在就是「长」

    7bbcdf7fa704c754f8fa9edb7ad5a282.png

    (2)用变量y代表长方形面积,根据「长方形面积 = 长 * 宽」公式写为「y = x * Cells(3, 4)」

    5aa66a4ee59377257831458ce12bf45f.png

    (3)最后,将「y」值赋值给「单元格E5」也就是Cells(3, 5),并同时执行数值写入操作

    f218aa5f47970bc48e9c7ea313c5dc82.png

    最终,程序就能够比较好的完成了,到这里似乎完成了所有的工作。

    但是大家有没有发现,代码是写完了,可是上面都是x,y这些英文字母,那么这些到底代表什么意思?

    370c0dcd4bc8b1f1be5a890eef65cc4d.png

    是的,一份优雅的代码,必须有一个好的名字。比如大家看下下图,是不是会很清晰呢?

    a7200168fe42ac14ce0ff325c667e994.png

    是的,这样写,确实非常容易读懂。但是,大家需要注意给VBA中变量取名字

    需要注意以下几点:

    (1)尽量使用有意义的名字,且尽量使用英文或拼音命名

    一方面,变量命名有意义就是大家可以读懂,知道变量表达的意义,增强代码的可读性。

    另一方面,尽量使用英文或拼音,因为绝大多数的程序基本都是完全支持英文,部分语言或是版本对中文兼容性较差。比如:长,用英文「length」或是「chang」,而尽量不用使用中文「长」

    (2)不要使用特殊字符

    我们一般常用的是英文、中文、数字、下划线且不能以数字开头

    (3)不能和系统保留字(关键字)一致

    保留字(关键字)就是在VBA中被程序赋予特殊含义的单词。比如:sub和end sub表示程序的开始和结束;for表示循环;while表示循环.....

    (4)VBA大小写不敏感

    比如:定义变量Aa = 1 和变量 aA = 10,我们人可能认为两个变量不一样,但是在VBA认为这两个变量是一样的。

    3.总结

    好了,总结一下今天的VBA知识点。

    (1)变量就是根据需要能够随时变化的,使用它有以下3个优点:

    a.程序灵活,易于维护和修改;

    b.代码简洁,更加优雅;

    c.执行速度更快,效率更高。

    (2)变量命名有讲究,需要注意以下四点:

    a.尽量使用有意义的名字,且尽量使用英文或拼音命名

    b.不要使用特殊字符

    c.不能和系统保留字(关键字)一致

    d.VBA大小写不敏感

    60485e5fcdeaf5b1fe670df8ad28dfe6.png

    推荐:人工智能时代的必学技能

    c01a1d7ac193b174f89bf36f914b4d15.png
    展开全文
  • 沿用上期的数据库,增加了用变量去匹配数据的方式,并且保留了上期指定匹配的方式进行对比。在采取变量去匹配的时候,好处在于进行下面的操作不需要更新宏代码:1、随时增减需要查询的数据2、数据源的列可以随意变化...

    一、简单演示和代码展示

    cd8b4868d4700341a894efce6d6061ea.gif

    本期宏的触发方式,选择事件触发——只要B1单元格的内容有变化,就会执行宏。

    沿用上期的数据库,增加了用变量去匹配数据的方式,并且保留了上期指定匹配的方式进行对比。

    在采取变量去匹配的时候,好处在于进行下面的操作不需要更新宏代码:

    1、随时增减需要查询的数据

    2、数据源的列可以随意变化

    4e9ca038e048683c4a4f6d9761c941b3.png

    二、新对象/方法的介绍

    1. 事件

    之前我们介绍的宏,都是通过按一个按钮触发的。除此之外,还有 事件 触发——通俗地理解,就是这个事情发生以后,自动会触发宏代码的运行。

    事件,都有固定的名字和参数,不要尝试去修改,改了就无法触发了。

    我们刚开始用 VBA,不需要过于滥用 事件,先知道有这么一种存在就好,后续的视频——应该是比较后续的视频,还会有介绍,因为本人并不是特别喜欢用事件。

    但如果你喜欢,觉得 事件 非常酷,可以在代码窗口右上角这里,下拉箭头这里,都是 事件,而左边这个下来箭头,则可以选择具有 事件 的对象。

    923fd2a3efdbefdf51168912def2142a.png

    注意:需要把事件触发的代码,写在对应的Sheet表格下面。

    2. Private / Public

    如果是 Private, 除了用在 Sub,还用在 Function 和 变量。Private 表示只有本模块可以调用, Public 表示所有模块都可以调用。

    事件,应该都是 Private 的。

    3. 数组Array

    两种定义方式:

    Dim Array1(1 To 5) As Integer ' 声明数组变量。

    Array2 = Array(1, 2, 3, 4, 5) ' 使用Array函数直接赋值。

    4. Application.WorksheetFunction

    在 Visual Basic 语句中可以使用大多数 Microsoft Excel 工作表函数。

    比如常用的VLookup,SumIf,Subtotal,Sum,Match等等,我曾经无聊算过一次,总共有174个,随着Excel的更新,这个数字估计有上下浮动了。

    5. Clear

    清除内容和格式设置。

    有个类似的ClearContents,清除内容,保留格式(跟用Rows("3:" & r1) = Null的效果一样)。

    三、执行思路及过程分析

    在上期的视频中说到,进行数据查询和匹配时,少量数据可以用直接指定的方式,大量数据的时候,建议用变量的方式。

    在本期的例子里面,前面小半部分,是对直接指定方式的回顾,后面的部分,是用变量的方式的具体实现方法。

    至于是通过 事件 触发,还是通过 按钮 触发,其实代码基本都一样的。

    只是这里我们用了 Worksheet_Change 这个事件,也就是更改单元格,为了不让宏乱触发,所以往往需要加一个限制触发的条件:

    就是这一句——(If Target.Count = 1 And Target.Address = "$B$1" Then)

    Target,理解成发生改变的单元格就可以了。

    回到执行思路——

    【1】确定查询条件

    表1《查库存》的 B1 是我们的查询条件,当我们输入 名称 的,想跟这个 物品 相关的所有信息都调出来,包括表2 和表3 的。

    第 2 行代码,触发宏的条件就是 B1 单元格发生变化,而且发生变化的单元格数量只有 1 个。

    【2】用指定的方式,提取 表2 的数据。

    第 3 行算是我们的老朋友了,取最大的行号。第 4 行,是把之前的查询结果清空。注意,rmax1 已经是最大列号,为什么这里用 rmax1 + 1 呢?

    如果并没有查询数据,最大行是 2,执行 Rows("3:2").Clear ,会把第 2 行的内容清除掉——这也是刚接触 VBA,使用最大行列的时候,容易出现意外的地方。

    好,接着往下看——

    我们需要 表2 中提取的数据有 3 列,就是灰色的这三列,2、4、5 列,当通过 If 语句匹配到名字相同时,就进行赋值。我们看这 3 行代码,左边的是当前工作表,也就是 表1,分别是 2、4、5 列,而右边的,是 表2,分别对应 4、6、7 列。其中中间这个,乘 -1,是因为 表2 的是出库的记录,后面还会进行一个存量统计的计算。

    (注意:上期定义一个变量 x,完全是为了展示 select case 的使用。本期提取的数据列,根上期不同,而表2对应的列号,直接指定,并没有使用x。)

    2dd99bbb28a069dc452b177293d337b2.png

    【3】用变量的方式,提取 表3 的数据

    首先,定义一个数组变量 myitem 。这里定义了 100 个元素,但实际上,我们只用了不到 10 个。

    cmax,取的是第 2 行的最大列号,我们实际使用的数组元素个数也是由 cmax 决定。

    下面的一个 For 循环,用到了 Excel 的一个公式 Match ,引用的命令就是 Application.WorksheetFunction.Match ,紧跟着的括号的内容,跟 Excel 的用法是一样,不同在于对单元格的引用,要遵循 VBA 的规则,像 Cells(2, i) 和 Range("1:1") 都是。

    这个 For 循环,通过 Match 公式,其实就实现了 表1 第 2 行的查询内容,在表3 中表头对应的位置,这一步很简单,却是理解后面赋值语句的关键。

    注意:Match公式的应用,限制了表1 第 2 行表头跟表3 的表头,取名必须一致。

    下一句 namec 获取的是 物料名称 在表3 中表头的列号。

    现在有了 myitem(i) 和 namec,就把 查询条件,以及 查询内容 都用变量表示了。这样做的好处,就是不管表3 的列如何调整或者新增一些列,宏都不需要修改。

    前面做了那么多,都是为最后的两层 For 循环做准备的。

    外层的 For 循环,跟前面 表2 的数据获取一样,对 表3 进行逐行匹配。

    内层的 For 循环,就是名字匹配以后,对 表1 进行逐列赋值。如果对这个赋值看得迷惘的话,需要回顾一下之前的那个 For 循环。

    最后两个命令行,是对 D 列的数量进行求和,结果写在 rmax+1 行。

    【4】变化查询条件验证结果

    有兴趣的朋友,可以试试调整 表3 的列和 表1 的一些查询条件,看看宏是不是仍能正常运行。

    1. 变更表3 的列

    包括变更原来列的位置,任意新增列等。

    2. 调整表1 种查询列的顺序,但灰色这几个一旦调整,是会影响第【2】点数据的获取的。

    【5】重点需要理解的内容

    本期的宏代码,第一次看,估计有点绕,重点是下面两个语句:

    1、确定变量对应关系:

    myitem(i) = Application.WorksheetFunction.Match(Cells(2, i), Worksheets("库存记录").Range("1:1"), 0)

    2、完成赋值:

    Cells(rmax1 + 1, i) = Worksheets("库存记录").Cells(j, myitem(i))

    左边是 i 列,右边是 myitem(i) 列,只要把这对应关系想通了,就能明朗了。

    四、本期宏完整展示

    Private Sub Worksheet_Change(ByVal Target As Range)If Target.Count = 1 And Target.Address = "$B$1" Then rmax1 = [A1].CurrentRegion.Rows.Count() Rows("3:" & rmax1 + 1).Clear  rmax2 = Worksheets(2).[A1].CurrentRegion.Rows.Count() For j = 1 To rmax2 If Worksheets(2).Cells(j, 5) = [B1] Then rmax1 = [A1].CurrentRegion.Rows.Count() Cells(rmax1 + 1, 2) = Worksheets(2).Cells(j, 4) Cells(rmax1 + 1, 4) = Worksheets(2).Cells(j, 6) * (-1) Cells(rmax1 + 1, 5) = Worksheets(2).Cells(j, 7) End If Next  Dim myitem(1 To 100) As Integer cmax = [AAA2].End(xlToLeft).Column For i = 1 To cmax myitem(i) = Application.WorksheetFunction.Match(Cells(2, i), Worksheets("库存记录").Range("1:1"), 0) Next namec = Application.WorksheetFunction.Match([A1], Worksheets("库存记录").Range("1:1"), 0) rmax3 = Worksheets("库存记录").[A1].CurrentRegion.Rows.Count() For j = 1 To rmax3 If Worksheets("库存记录").Cells(j, namec) = [B1] Then rmax1 = [A1].CurrentRegion.Rows.Count() For i = 1 To cmax Cells(rmax1 + 1, i) = Worksheets("库存记录").Cells(j, myitem(i)) Next End If Next  If [B1] <> "" Then rmax1 = [A1].CurrentRegion.Rows.Count() Range("D" & rmax1 + 1).FormulaR1C1 = "=sum(R3C:R[-1]C)" End IfEnd IfEnd Sub

    五、后话

    由于视频版制作非常耗时间,而且关注的朋友很少,暂停视频版的更新,见谅。

    df0023529397e543b036d15ba7cb0fde.png
    展开全文
  • 今天我们来说说多分类(无序)变量的χ2检验,基于R×2表的χ2检验(R为行变量,C为列变量=2)(此处一定注意的是:行变量为分组因素或自变量,列变量为结果变量或因变量。在呈现结果时行列的形式可交换,但表...

    马上到11月中旬,眼看都立冬了,刘岭教授的统计说说课堂让大家等久了吧。别急,统计说说第七期来了.......

    χ2检验是反应变量和分组变量都为二分类变量或多分类(无序)变量时,两变量间关系的分析方法。

    今天我们来说说多分类(无序)变量的χ2检验,基于R×2表的χ2检验(R为行变量,C为列变量=2)(此处一定注意的是:行变量为分组因素或自变量,列变量为结果变量或因变量。在呈现结果时行列的形式可交换,但表达的因素是不变的)。

    废话少说,看例子。

    例:某锡矿工龄相同的部分工种工人的硅沉着病患病率如表1所示。试分析不同工种间的硅沉着病患病率差异有无统计学意义?

    4150930afb5e885d72aeea60314a7264.png

    案例分析思考:

    1.研究目的:分析3个工种(风钻工、炮工、运输工)的硅沉着病患病率有无差异;

    2.研究设计类型:独立样本三组比较(风钻工、炮工、运输工),样本量不等;

    3.反应变量(即结果变量)患病率属于计数资料(二分类:患病和未患病);分组变量也属于计数资料(三分类:风钻工、炮工、运输工)(无序,即没有程度上差别),形成的交叉表也称3*2表(表1红框)(R=3,C=2)

    4. χ2检验的应用条件。

    具体操作:

    1. 数据格式 R×C表(本例为6行3列)(频数变量:工人例数;行变量:工种1=风钻工,2=炮工,3=运输工;列变量:患病情况1=患病,2=未患病)(图1)

    9174fec9a69d1c9258cbc4bf8213afa4.png

    2. 操作步骤

    (1) 定义频数变量:略,操作过程参看基于分类变量的卡方检验(一)例1

    (2) χ2检验

    分析(A)→描述统计(E)→交叉表(C)

    弹出“交叉表”主对话框(图2)。

    93bf990fd111e7734f6df76947c1f7c5.png

    ►行(O):选入行变量,本例为“工种”。

    ►列(C):选入列变量,本例为“患病情况”。

    ◇ 统计(S):点击“统计(S)”按钮,弹出“交叉表:统计”对话框,选定“þ 卡方(H)”(同基于分类变量的卡方检验(一)例1)。

    ◇ 单元格(E):点击“单元格(E)”按钮,弹出“交叉表:单元格显示”对话框,选定“þ 期望(E)和þ行(R)”(同基于分类变量的卡方检验(一)例1)。

    点击“继续(C)”回到主对话框,点击“确定”。

    3. 主要输出结果及分析

    (1)例1的交叉表(列联表)(表2)

    cf1e984e51a988db5990e67b45b51c96.png

    表2 给出了例1的列联表资料,结果显示风钻工的患病率为56.0%,炮工的患病率为62.1%,运输工的患病率为34.2%;所有理论频数均大于5。

    (2)例1的χ2检验表(表3)

    bc30046e8bb43fee3c7cbd2ea0c6a7fe.png

    表3给出了例1的卡方检验结果。结论:本例所有单元格理论频数均大于5,读取第1行皮尔逊卡方值,χ2=52.587,ν=2,P=0.000,差异有统计学意义,可以认为不同工种工人的硅沉着病患病率不同,即炮工比运输工硅沉着病患病率高。

    值得注意的是,当多个样本率或构成比的χ2检验结论为拒绝检验假设H0时,只能认为其总体率或总体构成比之间有差别,而不能说明它们彼此间都有差别。若要解决此问题,需要进一步两两比较的χ2检验,检验水准降低为

    b9f1182b19ed03cbaa7baa01e64dc413.png

    。操作步骤同四格表。注意:若此P>0.05,则无须再做两两比较了

    两两比较的方法:此方法也叫Bonferroni校正,降低检验水准以控制假阳性。例如进行3个工种的两两比较两两比较共进行3次,则新的检验水准即

    eb86120cc8e2383f3660f9911b3446cd.png

    1. 操作步骤

    (1)风钻工和炮工的比较

    ①筛选记录

    数据(D)→选择个案(S)

    弹出“选择个案”对话框(图3)。

    424be4e771ff8b1237035487aa089e3e.png

    ★选择:选择观察单位。

    ¡所有个案(A):选择全部观察单位(系统默认)。

    ¤如果条件满足(C):选择满足条件的观察单位。本例选此项。“如果(I)”按钮被激活,单击该按钮,弹出“选择个案:If”对话框(图4)。如选择“工种”变量赋值为1,2的观察单位为分析对象,可将条件表达式写为“工种<3”。

    fb3de84b76697c28edd03e164750be31.png

    ② 定义频数变量:略,同例1。

    χ2检验:略,同例1。

    2. 主要输出结果及分析

    (1)例1风钻工和炮工比较的交叉表(表4)

    2dae62e892750e58bf2b55338a3690a1.png

    表4 给出了风钻工和炮工的四格表资料,结果显示风钻工的患病率为56.0%,炮工的患病率为62.1%;所有理论频数均大于5。

    (2)风钻工和炮工比较的χ2检验表(表5)

    76f4fc961fe52e455da30995ec37b8ca.png

    表5给出了风钻工和炮工的χ2检验两两比较结果。结论:表中皮尔逊卡方值为1.548, P=0.213>0.0167,差异无统计学意义,尚不能认为风钻工和炮工的硅沉着病患病率有差别。

    以此类推,可以得到风钻工和运输工硅沉着病患病率比较的皮尔逊卡方值为19.019, P=0.000<0.0167,差异有统计学意义,可以认为风钻工和运输工的矽肺患病率有差别。炮工和运输工硅沉着病患病率比较的皮尔逊卡方值为50.220,P=0.000<0.0167,差异有统计学意义,可以认为炮工和运输工的硅沉着病患病率有差别。

    报告中卡方检验的表述形式:

    风钻工的患病率为56.0%,炮工的患病率为62.1%,运输工的患病率为34.2%,三组比较,采用卡方检验,差异有统计学意义(χ2=52.587, P=0.000),可以认为不同工种工人的硅沉着病患病率不同,进一步两两比较得到:风钻工和运输工的硅沉着病患病率有差别(P=0.000);炮工和运输工的硅沉着病患病率有差别(P=0.000),而风钻工和炮工的硅沉着病患病率比较差异无统计学意义(P=0.213>0.0167)。

    技术总结如下:

    1. R*2表的反应变量(结果变量)是二项分类变量,分组变量为多项无序分类变量(也可为有序分类变量即等级资料),即为R*2的χ2检验(多个率的比较)。

    2. R*2表χ2检验的应用条件:当有以下三种情况或之一存在时,均不适宜进行χ2检验①有1/5以上格子的理论频数小于5;②一个理论频数小于1;③总样本例数小于40。

    3.不满足应用条件时的处理方式:①增加样本含量(最好!)②根据专业知识,删除理论频数过小的行或列,或将理论频数过小的行或列与性质相近的行或列合并(丢失信息!不推荐,应慎重)③改用Fisher确切概率法。

    4.多个率比较(R*2表)的规范操作:①在整体上做χ2检验(注意应用条件);②若整体上的P>0.05,即差异无统计学意义,就此结束,下结论。③若整体上的P<0.05,即差异有统计学意义,需进一步两两比较:采用Bonferroni法进行。首先对需要比较的R*2表资料进行分割,变成多个四格表;其次对每个四格表进行检验;再次采用

    5ef11a9d9a7de73e0dc076831f709791.png

    计算调整的水准,其中为事先确定的水准(通常);最后以调整作为检验水准,下有无统计学意义的结论。

    本节内容采用的是SPSS 23.0版本。

    接下来大家仔细思考、消化知识,有问题可以留言,我们会请刘岭教授一一解答,并在下期公布。

    337ff6cb7b6cdf52b4e9dce952fb5475.gif

    撰稿:刘岭 约稿编辑:刘芹

    排版:毕丽 审核:王东

    39824c3bc080b6a601016d5e8fea4625.png

    专家简介:刘岭:陆军军医大学卫生统计学教研室副教授,主要从事卫生统计学教学、科研工作。担任中华卫生信息学会第八届统计理论与方法专业委员会委员,重庆市预防医学卫生统计专业委员会副主任委员,并担任《第三军医大学学报》等多家杂志的编委、统计审稿专家。

    展开全文
  • 思路是这样的:定义变量→变量赋值→窗口选择Word模板文件→打开Word模板文件→替换内容→另存替换后的Word文件一、定义变量 Dim StarGun As ObjectDim WordD As ObjectDim PathW As StringDim Tit, TheDate, SP, ...
    题外:由于漏掉了勾选Microsoft Word 16.0 Object Library这个关键步骤(不勾选是无法导出的),故修改后再次发出。本期我是从知乎上的郭大牛老师那里学的,常建议大家去阅读,这里真的拜谢郭大牛老师。
    https://zhuanlan.zhihu.com/p/76755973?utm_source=wechat_session&utm_medium=social&utm_oi=842149456383193088郭大牛:根据Excel数据生成Word文档
    虽然代码可能有一点难,但由于实在是太便利,觉得还是应该拿出来,哪怕简化后的,也是有作用的,主要还是要尽力尝试。开始正题。先看视频。本次只是针对Excel单行数据的单次Word文档填充,逻辑关系上是比较简单的。如果再往下想,循环填充多行,批量形成多个Word文档也是可以的,这个就以后再说了。这一次由于关联到Word,我们要先按如下顺序操作:Excel开发工具栏→VB编辑器→工具引用找到Microsoft Word 16.0 Object Library并打钩确定。这样我们才能关联到Word,实质相当于一个Excel和Word之间的接口。

    50e47d461442a3faae2866a1e8b133c9.png

    思路是这样的:定义变量→变量赋值→窗口选择Word模板文件→打开Word模板文件→替换内容→另存替换后的Word文件一、定义变量
    Dim StarGun As ObjectDim WordD As ObjectDim PathW As StringDim Tit, TheDate, SP, AP As StringDim a As Integer
    这里先把StarGun和WordD定义为对象,PathW、Tit、TheDate、SP、AP定义为字符串型变量,a定义为整数。二、赋值
                a = ActiveCell.Row          Tit = Cells(a, 2)      TheDate = Format(Cells(a, 1), "mm月dd日")           SP = Format(Cells(a, 5), "#0.00")           AP = Format(Cells(a, 11), "#0.00")        Level = Cells(a, 12) & "级"
    ActiveCell.Row即取值当前选择的单元格的行号,然后把想要替换的单元格的内容赋值于剩下的5个变量内。如果想要替换更多的单元格内容,就要赋值更多的变量。Format用于调整对象格式。三、窗口选择Word模板文件
    With Application.FileDialog(msoFileDialogFilePicker)          .Filters.Add "word文件", "*.doc*", 1         .InitialFileName = "C:\Users\Dick\Desktop\vba撰写\"         .AllowMultiSelect = False         If .Show Then PathW = .SelectedItems(1) Else Exit Sub    End With
    以上可以解读为:在指定路径下(.InitialFileName = "C:\Users\Dick\Desktop\vba撰写\"),选择文件名含有".doc"的Word文档,只能选择一个Word文档;如果没有选择文件则直接退出本次命令执行。四、打开Word模板文件
        Set StarGun = CreateObject("Word.Application")          StarGun.Visible = True    Set WordD = StarGun.Documents.Open(PathW, , False)
    这一段三句功能为打开第三步选择的Word模板文件,其中StarGun.Visible意义在于使这个Word文件打开时处于可见状态,如果为False则是不可见,其它句子就不必纠结了。五、替换内容

    本例代码中这一部分虽然比较长,但是基本都是一个个点对点的替换动作,这里只取其一做解释。

    With StarGun.Application.Selection        .Find.ClearFormatting                .Find.Replacement.ClearFormatting                With .Find             .Text = "{$监测点名称}"             .Replacement.Text = Tit        End With        .Find.Execute Replace:=wdReplaceAll    End With
    以此为例,主要意思就是把已打开的Word模板中的{$监测点名称},替换为变量Tit(Tit已经赋值)。.Find.Execute Replace:=wdReplaceAll是Word的VBA命令,意思为替换所有内容,每一个变量替换都要带这一句,缺少了会报错。如果需要增减修改替换的变量,复制With .Find至wdReplaceAll,修改赋给Text的内容即可。六、另存替换后的Word文件
       WordD.SaveAs  ThisWorkbook.Path & "\" & "监测点数据Word" & "(" & Tit & ")" & ".doc"
    关于Save as在第二篇宏录制里有解释,这里就不再赘述了。附上完整代码
    Sub 按钮8_Click()Dim StarGun As Object 'Word.ApplicationDim WordD As Object 'Word.DocumentDim PathW As String '模板文件路径名Dim Tit, TheDate, SP, AP As StringDim a As Integer         a = ActiveCell.Row       Tit = Cells(a, 2)   TheDate = Format(Cells(a, 1), "mm月dd日")        SP = Format(Cells(a, 5), "#0.00")        AP = Format(Cells(a, 11), "#0.00")     Level = Cells(a, 12) & "级"    With Application.FileDialog(msoFileDialogFilePicker)   '窗口打开Word文件并不选时报错         .Filters.Add "word文件", "*.doc*", 1         .InitialFileName = "C:\Users\Dick\Desktop\vba撰写\"         .AllowMultiSelect = False         If .Show Then PathW = .SelectedItems(1) Else Exit Sub    End With     Set StarGun = CreateObject("Word.Application")    '打开模板文件        StarGun.Visible = True    Set WordD = StarGun.Documents.Open(PathW, , False)   With StarGun.Application.Selection    '开始替换        .Find.ClearFormatting            'ClearFormatting为清除目标位置现有格式,如加粗底色等,为后面仅作字符替换做准备        .Find.Replacement.ClearFormatting                With .Find             .Text = "{$监测点名称}"             .Replacement.Text = Tit        End With        .Find.Execute Replace:=wdReplaceAll    'wdReplaceAll是Word的VBA命令,替换所有内容         With .Find             .Text = "{$监测时间}"             .Replacement.Text = TheDate        End With        .Find.Execute Replace:=wdReplaceAll         With .Find             .Text = "{$S指数}"             .Replacement.Text = SP        End With        .Find.Execute Replace:=wdReplaceAll                 With .Find             .Text = "{$A指数}"             .Replacement.Text = AP        End With        .Find.Execute Replace:=wdReplaceAll                 With .Find             .Text = "{$风险等级}"             .Replacement.Text = Level        End With        .Find.Execute Replace:=wdReplaceAll    End With    WordD.SaveAs ThisWorkbook.Path & "\" & "监测点数据Word" & "(" & Tit & ")" & ".doc"End Sub
    这套程序是我在4月份时开始使用的(我用的不太一样,文中简化了很多),当时真挺难,几乎是每一句都读不懂,只是看出了能增减修改变量的位置,于是不明就里的就开始使用了。因此,看不看得懂可能还真不是十分重要,反正能用就行了,别的以后再说。附件在阅读全文,码【gefv】

                                                                                                          完

    展开全文
  • VB6里面,如何把B,C的地址改成A的,达到读写3个变量都是相同结果 类.***=33,操作这样的函数,过程,或者共享变量,都会慢个几倍 【新提醒】【VB6】在VB6里实现“指针类型”——像C语言的[]那样用()来读写...
  • vb循环中变量赋值的问题

    千次阅读 2005-10-19 21:13:00
    问题:在for 循环中如果将变量的定义和创建都放在循环中时,那么在整个循环过程中对对象的操作都是对同一个对象的操作.分析:当从一个循环进入下一个循环是虽然好象都有new关键字创建了一个新的对象,但事实并非如此,new...
  • Dim T As Type T = System.String '这里提示错误 “String”是一个类类型,不能用作表达式 这里应该怎么写才对呢?
  • 可以用关键字True与False给Boolean变量赋值,写法如下:Function IsInt(Num) As BooleanIf Int(Num) =NumThenIsInt = TrueElseIsInt = FalseEndIfEndFunction其中,Num就是要处理的o1,IsInt返回值就是布尔型的变量...
  • 代码如下,多线程给全局变量a复制,在线程中a的值确实是等于“abc”但是线程结束后,a的值就丢失了! Public Class Class1 Public a As String '全局变量 Dim myThread As Threading.Thread ‘线程 ...
  • VB.net机房收费系统小问题之变量赋值前被使用

    千次阅读 热门讨论 2016-04-10 16:26:40
    敲机房的时候遇到这个问题,变量赋值前被使用 原因:没有实例化 应改成:  Dim FacadeGroupQuery As New Facade.GroupQueryFacade 什么是实例化? 在面向对象的编程中,通常把用类创建对象的过程称为...
  • 【新手请教】 sqlCmd = "SELECT RANK() OVER ...字符串变量长度没有限制 [img=https://img-bbs.csdn.net/upload/201507/31/1438332441_964985.png][/img] 有时候可以有时候不可以。。。郁闷中……请教各位,拜谢!
  • 请问怎么在vb中得到数组中单个变量原始赋值变量的名字?怎么知道数组对应变量是哪个给它的赋值呢?
  • 在C#中可以直接赋值,可在vb.net中怎样直接赋值呢? C#code interface IFactory {} IFactory operFactory =new AddFactory(); Operation oper=operFactory.CreateOperation() 谢谢啦啦!
  • 字符串变量赋值时存储地址的变化

    千次阅读 2018-05-28 22:57:18
    VB6中,我们并不关心字符串的存储问题,因为系统已经为我们处理好了这个问题。先看看下面的代码:Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ...
  • VB.net赋值给文本控件汇编分析

    千次阅读 2012-03-07 00:16:00
    以上实验结果表明,通过临时字符变量暂存,当所有字符赋值完之后再给控件赋值的时间将是直接赋给控件所需的时间效率的1700倍左右。那么根据下面的部分汇编代码可知后者直接赋给控件的方式在循环中,每一次赋值多执行...
  • vb6,类模块,声明一个全局变量如何赋值? 要求打开窗体时就已经赋值了 Option Explicit Public IsGameBox As Boolean 'Set IsGameBox = True'这种报错 Private Sub Form_Load()'这种不执行 MsgBox ("1") ...
  • Private Sub Form_Load()  Dim sysenv As Object  Set sysenv = CreateObject("WScript.Shell").Environment("system") ... MsgBox sysenv("vbtest")  sysenv("vbtest") = "test ok"  MsgBox
  • VB变量类型及控制语句(基础篇)

    千次阅读 2018-11-22 08:24:19
    (1)赋值运算符 = (2)数学运算符: &amp;、+ (字符连接符)、+(加)、-(减)、*(乘)、/(除)、Mod(取余)、\(整除)、-(负号)、^(指数) (3)逻辑运算符:Not(非)、And(与)、Or(或)、Xor...
  • TypeName 函数,返回一个 String,提供有关变量的信息。TypeName 函数示例本示例使用 TypeName 函数返回有关变量的信息:' 声明变量。Dim NullVar, MyType, StrVar As String, IntVar As Integer, CurVar As ...
  • 变量有生存周期这一点程序员们都了解,在VB.Net中增加了一个修饰Shared。Shared 关键字指示一个或多个被声明的编程元素将被共享。要点是:共享元素不关联于某类或结构的特定实例。需要通过使用类名或结构名称或者类...
  • wincc 赋值变量

    千次阅读 2010-07-05 10:02:00
    wincc 有两种: 1: C 脚本方式 2: VB脚本方式   2种方式... 给内部Char变量testVar 赋值为"报警"; >>> SetTagBit("Falg",1); 给内部二进制变量Flag 赋值为1;  SetTagByte("Fla
  • 代码如下,怎样把“00:00:00”字符串转换为date类型,使数值一致 Optional ByVal iPrintTime As Date = "00:00:00
  •  MyDate = Format(Text1.Text, "short date") '给变量赋值  Adodc1.RecordSource = "select * from tb_stu where 出生年月= '" Str(MyDate) "'"  Adodc1.Refresh  Set DataGrid1.DataSource = Adodc1  End If ...
  • 如下代码: '可空整型;注:iValue 可以是某个类的属性; dim iValue as integer? '(1)、这时的 iValue 值为 Nothing iValue = Nothing '显式赋空 ...2、或者说检查这个变量是否被初始化?
  • 问题请教下各位,文本框的坐标文本, 例如:111,222回车333,444回车555,666,这样的格式不确定有多少组 怎样才能不下标越界,请教高手优化代码,或给方法,我是新手,请大家多多关照 Private Sub Command1_Click() ...
  • vb怎么样能获取一个access 表里面的记录总数,并赋值给一个变量 先用记录集打开此表然后用记录集的recordcount属性获取记录条数Recordcount只对客户端游标(adUseClient)有效 dim s as longset rs=new adodb....

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 293
精华内容 117
关键字:

vb变量赋值