精华内容
下载资源
问答
  • Sql_text = "Select fitemid,fnumber,fname,flowlimit,fhighlimit,fqty,sum(fsellqty) as fsellqty From V_XMK_V_XMK_SecInv_sell_Qty Where 1=1 " If startdate <> " " Then Sql_text = Sql_text &...
  • 1、字符指针字符串赋值给字符指针变量时,可以在定义的时候就初始化,也可以先定义,再赋值。2、字符数组但字符串赋值给字符数组时,可以在定义的时候就初始化,但不可以像字符指针那样先定义,后面再赋值。为了搞...

    1、字符指针

    字符串赋值给字符指针变量时,可以在定义的时候就初始化,也可以先定义,再赋值。

    85026e364a8e3ae3568fa131a3769301.png

    2、字符数组

    但字符串赋值给字符数组时,可以在定义的时候就初始化,但不可以像字符指针那样先定义,后面再赋值。

    55f20afc46ee1611360fb8610d70e18e.png

    为了搞明白如何用字符串赋值,首先要搞清楚双引号""的作用

    • 在内存的常量区申请空间,存放字符串;
    • 在字符串末尾增加'0';
    • 返回该内存空间的地址。

    所以,当字符串常量"hello","world"出现在表达式中时,其值是这些字符所存储的地址(在常量区),而不是这些字符本身。

    因此,可以把字符串赋值给字符指针变量。而赋值给字符数组时,

    char p1[9] = "hello";

    这是C语言支持的,是数组的初始化,可以理解为下面的代码:

    p1[0] = 'h';

    p1[1] = 'e';

    p1[2] = 'l';

    p1[3] = 'l';

    p1[4] = 'o';

    p1[5] = '0';

    但若先定义,再赋值,就是错误的。

    char p2[9];

    p2 = "world"; //错误

    因为数组名 p2 虽然也是地址,但却是指向本数组首元素的地址,不能更改。

    若希望字符数组先定义,再赋值,则可以通过调用函数 strncpy:

    c8134d74dbdc51dbebc6aada5c956e37.png

    char *strncpy(char *dest, const char *src, size_t n)

    把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

    展开全文
  • Sql_text = "Select fitemid,fnumber,fname,flowlimit,fhighlimit,fqty,sum(fsellqty) as fsellqty From V_XMK_V_XMK_SecInv_sell_Qty Where 1=1 " If startdate <> " " Then Sql_text = Sql_text &...
  • 数组声明一维数组Dim/Static/Private/Public([索引下界]To]索引上界)As二维数组Dim/Static/Private/Public(行数,列数)As...)上界值:UBound(数组名[,返回哪个维数的上界值])数组赋值使用循环语句初始化数组FOR=索引...
    e43f78fed2c5b5366872a818aa1cfded.png

    数组声明

    一维数组

    Dim/Static/Private/Public([索引下界]To]索引上界)As

    二维数组

    Dim/Static/Private/Public(行数,列数)As

    设置默认下界值

    Option Base 0|1

    查看数组的索引上界和下界值

    下界值:LBound(数组名[,返回哪个维数的下界值])

    上界值:UBound(数组名[,返回哪个维数的上界值])

    数组赋值

    使用循环语句初始化数组

    FOR=索引下界To索引上界

    =

    Next循环变量

    Array()函数初始化数组

    Array(以英文逗号隔开的数据序列表)

    使用数组值初始化数组

    动态数组

    声明动态数组

    Dim()As

    ReDim函数隐式数组声明

    ReDim([索引下界]To索引上界)

    每次使用ReDim后数组中的值会丢失,若要保留原有值,可使用ReDim Preserve语句扩充数组

    数组清除和重定义

    Erase 数组变量

    f177ee1d49046f3cfe36d9449d7566b6.png

    检测变量是否为数组

    IsArray(变量名)

    For Each数组的控件变量必须为变体

    不能直接给整个数组赋值

    数组中不能放置监视断点

    过程创建

    Sub过程

    在调用子过程时,将采用按参数值(ByVal)和按地址传递(ByRef)两种方式

    定义Sub过程

    利用录制宏来创建

    使用代码创建

    [Private|Public|Friend][Static]Sub 过程名 [(要传递的参数变量列表)]

    [过程语句]

    [Exit Sub]

    [过程语句]

    End Sub

    参数变量列表格式:

    [Option][ByVal|ByRef][ParamArray]参数名[()][As type][=defaultvalue]

    Function 函数

    参数传递可采用按参数值(ByVal)和按地址传递(ByRef)两种方式

    [Private|Public|Friend][Static]Function 函数名 [(要传递的参数变量列表)]

    [函数语句]

    [函数名=表达式]

    [Exit Function]

    [函数语句]

    End Function

    过程调用

    Call语句调用子过程

    Call 过程名[参数列表]

    直接调用

    过程名 参数列表

    调用自定义函数

    变量=函数名(参数列表)

    过程调试

    控制过程执行工具

    VBE开发环境:运行菜单、调试菜单

    运行:运行子过程/用户窗体

    中断:Ctrl+Break

    重新

    控制程序执行间隔的功能

    逐语句【F8】

    逐过程【Shift+F8】

    跳出【Ctrl+Shift+F8】

    运行到光标处【Ctrl+F8】

    监视

    添加监视

    编辑监视【Ctrl+W】

    快速监视【Shift+F9】

    切换断点【F9】

    清除所有断点【Ctrl+Shift+F9】

    调试方法

    程序侵入式调试

    Print过程 以Debug.Print输入立即窗口

    Assert过程 以Debug.Asset 条件表达式(表达式为假时弹出警告)

    变量监视

    调试技巧

    查看帮助文档

    每个程序位置都要检查

    怀疑代码错误

    不做无根据判断

    良好的编码风格

    Property属性过程和Event事件过程

    是VBA在对象功能上添加的连个过程

    函数和子过程的区别

    函数具有一个特定的返回值

    子过程没有返回值

    子过程用Sub关键字声明,函数用Function 关键字声明

    常用字符串函数

    Len(字符串/变量名) 返回字符数

    LenB(字符串/变量名) 返回字节数

    Left(字符串,长度) 返回指定字符串中从左边算起指定数量的字符

    Mid(字符串,开始,[长度]) 返回指定字符串从指定位置向右指定个数字符

    Right(字符串,长度) 返回指定字符串中从右边算起指定数量的字符

    String(返回字符长度,字符码或字符串表达式) 生成多个重复字符

    Replace(字符串表达式要替换的子字符串,要搜索的子字符串,用来替换的子字符串[,开始搜索位置[,替换次数[,判别比较方式]]]) 替换字符串

    StrConv(字符串表达式,转换类型,LCID) 转换字符串类型

    e7f7366c5c12c2232c24058d166bd73f.png

    LCase(字符串) 转换成小写

    UCase(字符串) 转换成大写

    StrComp(字符串1,字符串2[,比较方式]) 比较两个字符串是否相等

    313f091fd9d9679d20c060859081115c.png
    4583b708f7810ccd35c6f722522b6bf9.png

    日期函数

    Now() 返回计算机系统的当前日期和时间

    Date() 返回计算机系统的当前日期

    Time() 返回计算机系统的当前时间

    Year(日期参数)、Month(日期参数)、Day(日期参数) 返回日期参数的年、月、日

    Hour(时间参数)、Minute(时间参数)、Second(时间参数) 返回时间参数的小时、分钟、秒数

    Weekday(日期,[指定星期类型默认以周日为第一天]) 返回日期参数的星期值

    WeekdayName(日期,星期名称是否被缩写Boolean值,指定星期类型默认以周日为第一天)

    日期计算

    DateAdd(字符串表达式,时间间隔,日期字符串或字符串表达式) 一段时间后的日期或时间

    DateDiff(字符串表达式两个日期时间间隔,第一个日期,第二个日期[,指定一个星期的第一天默认周日[,指定一年的第一周]]) 计算两个日期间的间隔

    DatePart(返回的日期单位,日期[,一周的第一天[,指定一年的第一周]]) 获取指定日期在指定年的第几天、周和月

    cbe66341e4113bb6dcfec9ce9cf6b1ac.png
    cb4405931520113e3daa3cbc49c0b669.png

    FormatDateTime(日期[,日期/时间所使用的格式]) 将日期数字转换成日期或时间格式表达式

    327c82ca0ae49eb97b3156d42b22b24b.png

    清除字符串空格

    LTrim(字符串或字符串变量) 清除前导空格

    RTrim(字符串或字符串变量) 清除末尾空格

    Trim(字符串或字符串变量) 清除字符串中的空格

    字符与ASCII码转换

    Asc(字符串参数) 将字符串第一个字符转换成ASCII码

    Chr(ASCII码) 将ASCII码转换成对应字符

    相关代码说明和实例可查询VBA开发文档 以上内容是本人自学笔记总结,欢迎指正,有关Excel的问题,可私信联系,互相交流讨论,共同进步,谢谢。部分内容和数据来自互联网,如有疑问,欢迎联系。

    展开全文
  • 使用数组避免这一问题的方式就是将计算在内存完成,单元格只写入一个数值或字符串; 2. 数组的运算效率远高于读写单元格 看个实例来体会一下单元格逐个处理,和数组内存处理后统一导入的效率差异; 插入代码块的...

    223722927b61297fe545f8b652b2aaf4.png

    为什么使用数组?

    1. 缩减工作薄文件大小,提高运行效率

    一般而言只是使用 Excel 的内置工作表函数,在运算方面还是很高效的,但有时因为一个单元格牵扯的计算太多,比如调用多单元格数据,对结果文本进行部分替换,按照优先级和条件判断来确定不同的返回结果,这都会造成一个单元格的公式文本过长,当以此单元格为基础进行数千行的相对引用填充时,必然会导入工作薄快速的膨胀;

    如果因为某些复杂的处理,而使用了自定义函数,且应用的单元格也是几千行级别的,那么用户甚至会被迫选择在 "公式选项卡->计算选项",将自动计算变更为手动计算的方式来避免这种 Excel 自动进行全局计算的引发卡顿问题;

    使用数组避免这一问题的方式就是将计算在内存完成,单元格只写入一个数值或字符串;

    2. 数组的运算效率远高于读写单元格

    看个实例来体会一下单元格逐个处理,和数组内存处理后统一导入的效率差异;

    插入代码块的高亮显示实在不理想,先贴图吧;

    97e6cac6b93e72cea7146ef2bb298164.png

    FillRandom 在 A1:D10000 这四万个单元格中生成随机数;拷贝随机数为常数,避免触发自动计算带来的开销;

    任务目标:对每个随机数求平方,结果放置回工作表;

    ForEachCellImplement 使用逐个单元格取值,计算后放回的方式实现;

    ArrayImplement 使用将 A1:D10000 导入数组,在内存中完成计算,再统一放回工作表的方式实现;

    前者耗时 12718 毫秒,后者 47 毫秒;约 270 倍的效率差异;

    3. 在某些应用场景下,数组处理问题最简单

    把一行或一列单元格的数据以逗号拼接成字符串,在不使用数组的情况下一般会这样做;

    即便省略 resStr,If 语句整体压缩在一行,也需要 5 行代码,其中包含循环结构和条件判断处理字符串拼接的开头部分 ;

    如果使用数组,只需要一行就可以了;

    acd786cc16828ad4baeb9017947cd755.png

    4. 强化部分 Excel 功能

    如,SpecialCells,也就是 Excel 快捷键 F5 定位条件,Excel 中可以批量定位一种类型的单元格区域,但对定位结果进行多种条件处理,再将数据放回或者以这些数据为基础再进行其他数据的生成,Excel 菜单功能是无法完成的;

    Find 也就是 Excel 的 Ctrl + F,查找功能,同样可以利用 VBA 来完成,一旦拿到返回的一组单元格区域,处理方式就灵活多样了;

    整体来看数组可以极大的拓展 “返回值为单元格区域” 的功能的操作边界;

    5. VBA 其他容器使用效果也不理想

    比如 Collection(类似 Python 中的 List),Dictionary等,但支持的方法太有限,同时转换类型也没有便捷的方法来支持;

    这一点我个人理解是 Microsoft 还是希望用户以 Range 为核心,配合 Excel 本身的功能,以及这些功能对应的 VBA 调用,以此来完成任务目标; 如果用户的任务目标超越了这个界限用户就应该去使用 Microsoft 的其他产品如 Power BI,VSTO(Visual Studio Tools for Office)借助 C# 应该是想干什么都可以了;或者干脆极易上手 Python,借助 pandas 和 numpy 这些工具来处理 .xlsx .csv 等等;

    坑的原因

    VBA 数组的坑主要是由三个原因引起的:

    1.脚本语言的用户对数据类型的重视度不足;

    2.Range对象的存在,造成了数组一些潜规则式的转换机制;可以在下文 “感受 Range 的混乱” 部分体会一下;

    3.静态数组和动态数组的一些限制和数据导入规则;这远没有静态语言数组声明后全生命周期大小不可变,扩容需要重新创建来的清晰;

    感受 Range 的混乱

    如果这部分看蒙了就暂时过的它吧,后面看过 “Array() 和 Range 对象”,“数组初始化方式3”,“数组导入到单元格区域”,在回过头来理解一下这个部分会更有收获;

    1.Range("") 赋值给未声明的变量,TypeName 变为 Variant;TypeName() 是获取变量的数据类型;

    2.Variant() 不能使用 Range 类型的属性,如,.Address;

    3.想要使用 Range 类型的属性,先 Set varName = Range("");

    4.对于被 Set 成 Range 类型的变量:

    (1)IsArray() 仍然是 True;

    (2)不能将 Range 类型的变量赋值给已经声明的数组,报错 “类型不匹配”;

    (3)可以赋值给未声明的变量或 Variant 类型的变量(Dim x 或 Dim x as Variant),该 Range 类型的变量会自动转型为 Variant();

    最让人懵逼的地方是 Set 一个 Range() 它的 TypeName 是 Range,IsArray 是 True,但不能把它赋值给一个数组,如果把它赋值给一个 未声明的 或 Variant 变量,它又被自动转换成了 Variant(),看下面这个例子,注意 TypeName:

    1868043e32afe21645cbe23c14db44f5.png

    以下主要从以下几个方面来谈谈数组避坑:

    1. 数组声明
    2. Array() 方法 和 Range 对象
    3. 数组初始化
    4. 数组导入到单元格区域
    5. 数组作为参数和返回值

    对于脚本语言我个人更倾向,不开启强制变量声明;

    在不声明的状态下,直接对一个变量赋值,某些时候是更好的策略,比如,Filter() 的返回值,如果声明了 Variant() 去接收则报错(必须声明为 String()),For Each 的临时变量,会强制用户声明等等;如果要开启强制声明,在模块最上方加入如下语句:

    Option Explicit

    数组声明

    静态数组

    在 Option Base 的指定值不同的情况下,不设置编号的静态数组声明的大小是不同的;

    30b0eb2b41652f2b69c4f2278f49cc8c.png

    动态数组

    477041fa27dcd0f040c789eb85938055.png

    Array() 和 Range 对象

    讨论初始化之前,先来看两个给数组赋值的常用形式;

    所谓一次性装入,就是以一个数组或对象为数组赋值,赋值在一条语句中完成,Array() 和 Range 对象都属于一次装入;

    非一次性装入,就是利用循环结构逐个调用数组元素并进行赋值;

    1. Array() 函数

    Array(ParamArray ArgList() As Variant)

    注意 Array() 方法的参数和数据类型是 Variant,其函数的返回值是 Variant();

    a89fb978e94a233f64f2eb76465bf374.png
    官方文档 Variant 数据类型docs.microsoft.com

    Variant 包含除固定长度 String 数据以外的任何类型的数据;也就是说 Array() 的元素可以是任意类型,也可以是数组;

    2. Range 对象

    先说明一下本文用到的几个称呼,它们都是 Range对象 :

    (1)单元格区域,特指工作表中由单元格(Cell)所组成的 Range;

    (2)Range 类型,将 Range("A1:C3") 这种形式通过 Set 设置后得到的对象变量;

    (3)Range(""),特指赋值给变量,数据类型转型为 Variant() 的 Range;

    (4)Range 对象,指代 (1)-(3)中的情况,需要结合上下文来理解;

    15cba702e63cf1717a074b4ed8897056.png

    数组初始化

    几条规则:

    1.静态数组不能一次性装入数据;

    2.只声明是数组、大小及编号的数组,系统会分配为 Variant类型数组;

    3.只声明一个变量 (如,Dim varTemp),默认的数据类型 TypeName(varTemp) 是 Empty,varTemp 可以接收动态或静态数组,且可以是任意类型的数组;这种声明方式实际上就相当于在 非 Option Explicit 情况下,不声明直接使用变量;

    4.可以给 Variant数组 的元素赋值任意类型(逐个赋值的方式),但不能将 非Variant数组,赋值给 Variant数组(一次装入的模式),实际这一条是特指动态数组的,因为静态数组已经被不能一次装入的规则限制了;

    5.可以用静态数组为动态数组赋值,但静态数组只能是 Variant数组;

    2b210bc3698ce2f807772c757a27e8ac.png

    在 VBE 本地窗格对比一下数组元素的顺序 和 For Each 取元素的顺序;

    0d9493655ffddc69057e86ed02641da9.png

    22cb7b5ce72457c758beed80214a65f1.png

    推荐使用不声明的方式,因为部分函数,如 Filter() 的返回值是 String(),Variant 数组使用元素逐个赋值的方式可以接收 String 类型的数据,但 Variant数组 不能接收 String数组 的一次性赋值,如果一定要为数组声明类型则需要声明为 Dim arrDyn() as String,这点个人觉得挺坑的;

    7c106bf18622b53f74de39653bfa7cba.png

    数组清理

    这个用的不多顺便提一下吧;

    Erase arraylist

    arraylist 是一个或多个用逗号分隔开的需要清除的数组变量;只给出数组名,不带括号和下标;

    Erase 释放动态数组所使用的内存,下次引用该动态数组之前,必须 ReDim

    ecfeb02ecb8c3447ee57f76d5c683c11.png

    数组导入到单元格区域

    数组导入到单元格区域:

    如果 数组 的大小超过了单元格区域的大小,则相当于数组被单元格区域截取,如,例1;

    如果 单元格区域 的大小超过了数组的大小,则不足的部分以 "#N/A" 来填充,如,例2;

    f684c87328f33365af29962497a3817d.png

    例2,数组的大小是 3行4列,单元格区域的大小是 4行5列,不足的部分被 #N/A填充了;

    9d4f8fa01a212746def37db6b87c9fa7.png

    8411b21c53675414665efac7dee702d9.png

    虽然在数组初始化 方式3 中,提到 Range("") 赋值给数组,即便只有一行,它也是二维数组,但是将数组赋值给单元格区域时,可以使用一维数组;

    0b6ecd7c863504078968b1097b15d883.png

    数组的转置

    a2ef04c82b1e940a88b496cb1356a459.png

    前面提到从 Range("") 导入的数组,即是是一行,也是二维数组,即 Range("A1:J1") 是 (1 to 1, 1 to 10) 的二维数组;

    (1 to 1, 1 to 10) 形式的数组,也可以通过 Transpose 转置为一列数组,因此可以利用这个机制将一个 (1 to 1, 1 to 10) 转变为一个 (1 to 10) 的数组;

    4e67fe67e6ccf35b4fed08f40bc21699.png

    这也就文章开头部分的两次转置的原理;在 VBE 本地窗口看一下结构

    7c588834eba40ec01548fa4810251302.png

    数组作为参数和返回值

    58a1b087a0cd14d5cf58728c48bc0d74.png

    结束

    数组日常使用能看到的出现概率较高的坑应该是都在这里了,以后想到其他的再补充吧,欢迎交流!

    最后在补充一句,在文章开头的部分测试了四万个单元格的逐个读取和逐个写入,后来我又单独跑了一下逐个读取,时间是16毫秒左右,所以可以确定消耗资源的是单元格写入,在操作中尽量避免对单元格的写入吧。

    展开全文
  • 您在问题中显示的代码因以下原因而失败:Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")Assets是一种工作表,它是一种Object,在为对象赋值时必须使用Set:Set Assets = Array("pipe...

    您在问题中显示的代码因以下原因而失败:

    Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    Assets是一种工作表,它是一种Object,在为对象赋值时必须使用Set:

    Set Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    这会失败,因为Array("…")不是工作表。

    您暗示您的代码的早期版本会运行,但不会遍历工作表。原因是:

    MsgBox ActiveSheet.Name

    这将显示活动工作表的名称,但此循环中的任何内容都不会更改活动工作表。

    我对你的解决方案不满意,尽管它没有明显的错误。我看到太多的程序失败了,因为程序员在一个语句中做了太多。首先,声明越复杂,首先要做的就越久,在后续维护中理解的时间就越长。有时原来的程序员得到的陈述略有错误;有时维护程序员在尝试更新它时会出错。在每种情况下,程序员花费的额外时间都没有证明运行时的任何节省。

    Alex K已根据VBA的要求重新定义Assets和Asset作为变体,并添加Sheets(Asset).Select以更改哪个工作表处于活动状态,从而修复了您的代码。我不能赞同这一点,因为Select是一个缓慢的陈述。特别是,如果您不包含Application.ScreenUpdating = False,那么当您从每个Select重新绘制屏幕时,您的例程的持续时间可以通过屋顶。

    在解释我的解决方案之前,有一些关于变体的背景知识。

    如果我写:

    Dim I as Long

    I将始终为长整数。

    在运行时,编译器/解释器不必考虑遇到I时的内容:

    I = I + 5

    但是假设我写道:

    Dim V as Variant

    V = 5

    V = V + 5

    V = "Test"

    V = V & " 1"

    这是完全有效(有效但不明智)的代码,因为Variant可以包含数字,字符串或工作表。但是每当我的代码访问V时,解释器必须检查V的当前内容的类型,并确定它是否适合当前情况。这很费时间。

    我不想阻止你在适当的时候使用Variants,因为它们非常有用,但你需要知道它们的开销。

    接下来我希望提倡使用有意义和系统的名称。我根据我多年来使用的系统命名我的变量。我可以查看我的任何程序/宏,并知道变量是什么。当我需要更新12或15个月前编写的程序/宏时,这可以节省时间。

    我不喜欢:

    Dim Assets As Variant

    Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    因为&#34; pipe_mat_tables&#34;等不是资产;它们是工作表的名称。我会写:

    Dim WshtNames As Variant

    WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    我的第一个提议是:

    Option Explicit

    Sub Test1()

    Dim WshtNames As Variant

    Dim WshtNameCrnt As Variant

    WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    For Each WshtNameCrnt In WshtNames

    With Worksheets(WshtNameCrnt)

    Debug.Print "Cell B1 of worksheet " & .Name & " contains " & .Range("B1").Value

    End With

    Next WshtNameCrnt

    End Sub

    我可以将WshtNameCrnt命名为WshtName,但我被告知名称应至少相差三个字符以避免使用错误的字符而不注意。

    Array函数返回包含数组的变体。 For Each语句的控制变量必须是对象或变体。这就是我将WshtNames和WshtNameCrnt定义为变体的原因。请注意,您的解决方案有效,因为工作表是一个对象。

    我使用了With Worksheets(WshtNameCrnt),这意味着匹配的End With之前的任何代码都可以通过在开头有一个句点来访问此工作表的组件。因此.Name和.Range("B1").Value引用Worksheets(WshtNameCrnt)而不选择工作表。这比任何替代方案都更快更清晰。

    我使用Debug.Print而不是MsgBox,因为它不那么麻烦了。我的代码运行时没有必须为每个工作表按Return,我在立即窗口中有一个整洁的列表,我可以在闲暇时查看。在开发期间,我的代码中经常有很多Debug.Print语句,这就是为什么我输出一个句子而不仅仅是工作表名称或单元格值。

    我的第二个提议是:

    Sub Test2()

    Dim InxW As Long

    Dim WshtNames As Variant

    WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

    For InxW = LBound(WshtNames) To UBound(WshtNames)

    With Worksheets(WshtNames(InxW))

    Debug.Print "Cell B1 of worksheet " & .Name & " contains " & .Range("B1").Value

    End With

    Next InxW

    End Sub

    此宏与第一个宏具有相同的效果。我有时会发现For比For Each更方便,尽管在这种情况下我无论如何都看不到任何优势。请注意,即使WshtNames的下限始终为零,我也写了LBound(WshtNames)。这只是我(过度?过度)精确。

    希望这有帮助。

    展开全文
  • 主要内容一览本期主要包括以下几个方面的内容:VBA中的数据类型数据的储存数据的运算 数据类型Visual Basic有以下6种数据类型:数值型(Numeric)、字符串型(String)、布尔型(Boolean)、日期型(Date)、对象型(Object)...
  • VBA call 带参数 传递 字符串案例

    千次阅读 2019-03-10 00:29:57
    背景:计划用VBA写一个xml文件(开发工具 源 不能满足需求)整个脚本要很多次写入动作,所以做一个子程序直接调用。 解读:1....sub xiexml(接收任意字符串赋值文件路径到变量 xmlfile追加写入的...
  • 字符串中的乱码,VBA

    2010-07-01 20:10:18
    把单元格的值赋值字符串变量,再用msgbox函数现实字符串变量的值,竟然显示乱码
  • '替换后字符串 replaceStr = "" '判断字符串是否在词根存在 ifExists = 0 '判断表制作sheet页的单元格是否为空,不为空才遍历 Do While Not IsEmpty(Cells(i, 1)) ' 单元格的值赋值给变量 fromStr = Cells(i...
  • aaa = Sheet1.Cells(i, 8).Value 变量赋值。bbb = Mid(aaa, InStrRev(aaa, "&#41;", -1) + 5, 100) 截取"&#41;“ 这个字符后到第100位的字符ddd = UBound(Split(bbb, " ")) 计算空格出现的次数 bbb变量 空格...
  • 实际上窗体域时可以无限长的,不过默认情况下赋值超过255个字符会出现错误, 微软给出的解决方案: Sub WorkAround255Limit() Set Text1 form field to a unique string. ActiveDocument.FormFields("text1")....
  • 在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始。这个时候呢,我们可以通过切片的方式来截取出我们定义的字符串的一部分。使用切片的时候我们有两...
  • 第十回 split拆解字符串,动态数组接受结果集 相关知识点 1、split(待拆分字符,分隔符字符) 将字符串按指定分隔符拆分为多个子串, 需用数组接受结果集(动态数组); 再用for 循环将每个元素赋值给单元格 ...
  • 自定义函数 一、函数使用 自定义的函数如果要在 excel 表格中直接引用的话,需要在模块中定义,实测工作表和工作簿中...vba 函数可以返回数组,只要将函数名变量赋值为数组即可 二、函数参数 支持选择参数 支持...
  • VBA 数组定义,赋值,一维数组

    万次阅读 2019-12-19 13:35:43
    1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element 元素 数组里的元素是...
  • 大家好,上节介绍了在使用数组之前如何...以常用的二维数组为例,声明一个3*4的二维数组arr1,数据类型为字符串型。dim arr1(2,3) as string声明数组时省略下标,默认从0开始,所以第一维是0至2,第二维是0至3。数...
  • 一维数组可以通过这样一行代码来整体赋值:arr = Array("你", "我", "他", "1", "2", "3", "aa", "bb", "cc...第一种:使用[{}]将字符串括起来,字符串行间用分号(;)分割,列间用逗号(,)分割: arr = [{"你", "..
  • 大家好,上节介绍了在使用数组之前如何...以常用的二维数组为例,声明一个3*4的二维数组arr1,数据类型为字符串型。dim arr1(2,3) as string声明数组时省略下标,默认从0开始,所以第一维是0至2,第二维是0至3。数...
  • VBA对变量类型没有进行严格的管控,无论哪种情况,定义的类型和实际使用中赋值类型并没有什么关系,也就是说定义为integer的变量相同赋值字符串。反之也然。 这种结果往往会在程序中产生歧义,导致错误...
  • 关于VBA中Evaluate的用法

    千次阅读 2020-04-02 11:53:49
    Evaluate用法:将字符串转换为值或对象。...通过用Evaluate方法,将同样一个字符串赋值给B1单元格,B1显示为6,转换成了一个值。 二、将字符串转换成对象 下图中先给A1单元格赋值为一,用于对比B1和...
  • VBA中,可以通过Dim语句定义变量,在程序运行的过程中,定义的变量可以...定长字符串与变长字符串 隐式声明 步骤1 按组合键【Alt+F11】打开VBE。 步骤2 选择菜单“插入”——“模块”,并输入以下代码。 ...
  • 包含8个自定义函数: 1.提取中文,支持多个中英文交替2.赋值3.Copy首行,给其他行赋值4.获得链接5.截字符串中首尾两个-之间的部分6.提取中文前面的英文7.截取字符串中最后一次出现要str之后的字符串
  • vba17-25

    2020-12-06 10:30:10
    数值:0 字符串:""空字符串 布尔:False 变体:Emply(空) 2 布尔值:false(0) True(1) 所有非0的数字转换成布尔类型都是True 3变量定义简写 dim i % integer整型 dim j& long长整型 double 小数 $ string ...
  • VBA研究】VBA数据类型定义与效果

    千次阅读 2015-08-07 11:55:27
    作者:iamlaosong 数据类型是对同一类数据的统称,如文本、日期、数值等。VBA里的数据类型有:字节... VBA对数据类型定义的管控并不强,比如定义成整数型的变量同样可以赋值字符串,但是如果不注意,就会导致逻辑错误。
  • Excel VBA编程

    万次阅读 多人点赞 2019-04-11 16:45:51
    文章目录如何创建VBAVBA语法规则声明变量给变量赋值让变量存储的数据参与运算关于声明变量的其他知识变量的作用域特殊的变量——数组声明多维数组声明动态数组其他创建数组的方法数组函数利用UBound求数组的最大索引...
  • vba】了解语法

    2019-09-03 23:20:38
    同一行声明变量 Dim FullName As String, DateOfBirth As ...或者+来连接字符串 表明字符串的长度Dim extension As String * 3 使用符号声明变量 Dim FirstName$ 上面的声明和Dim FirstName As String是一样的。其...
  • 2 VBA基础 VBA基础包括 变量的声明,定义,赋值,取值,数据类型 Excel表格的基本操作 VBA自带函数的使用方法 ...字符类型用来存储字符串,比如 helloworld,你好 布尔类型,就是 true/false 2.1.2 变量声明 语...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

vba字符串赋值