第8课 VBA输入语句InputBox

2019-03-28 15:16

第八课输入语句Inputbox

上一节课讲述了输出语句Msgbox,它可以将某些信息输出到屏幕上。 本节课讲述与之对应的输入语句。

输入语句主要Inputbox函数和Application.Inputbox方法,它们功能相近,不过后者更强大。

第8.1节 Inputbox函数

Inputbox函数是VBA中用于录入数据的函数,它可在屏幕上创建一个输入框,等待用户

输入字符。当按下“确定”或者“取消”按钮后可返回用户录入的String类型的文本或者空文本(当按下“取消”键时是空文本)。 Inputbox可为用户提供数据录入窗口,然后根据用户录入的字符决定下一步的操作。 例如下图中,用户的录入信息决定程序的计算方式,这是典型的inputbox应用。

图1以录入值确定计算方式

8.1.1 Inputbox函数的语法

Inputbox的具体语法如下:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

其中第一参数是必选参数,其余参数为可选参数。各参数的详细解释见下表:

表1Inputbox的参数详解

部分 Prompt Title Default Xpos Ypos Helpfile Context 描述 作为对话框消息出现的字符串表达式。prompt 的最大长度大约是 1024 个字符,由所用字符的宽度决定 显示对话框标题栏中的字符串表达式。如果省略 title,则把应用程序名放入标题栏中 显示文本框中的字符串表达式,在没有其他输入时作为默认值 数值表达式,成对出现,指定对话框的左边与屏幕左边的水平距离。如果省略 xpos,则对话框会在水平方向居中 数值表达式,成对出现,指定对话框的上边与屏幕上边的距离。如果省略 ypos,则对话框被放置在屏幕垂直方向距下边大约三分之一的位置 字符串表达式,识别帮助文件,用该文件为对话框提供上下文相关的帮助 数值表达式,由帮助文件的作者指定给某个帮助主题的帮助上下文编号

其中最重要的是前面三个参数,包括提示信息、对话框标题和默认值。

在特殊情况下,第四、第五参数也具有其实用价值——强制指定对话框的显示位置,从

而防止对话框挡住当前窗口。

8.1.2 案例应用

从以下案例中,可以加深对Inputbox的认识。

1.定制“另存为”对话框

设计一个用于文件另存的对话框,固定保存在C盘下,用户可以随意定制文件名,默认名称为当前日期。代码如下:

Sub 工作簿另存()

Dim FileName As String '声明变量

'弹出一个录入框,让用户指定文件名,默认值为当前日期

FileName = InputBox(\请输入工作簿新名称\另存为\ '如果按下了取消或者录入空值,那么结束过程 If Len(FileName) = 0 Then Exit Sub

'当前工作簿另存到C盘中, 文件名为用户指定字符 ThisWorkbook.SaveAs \End Sub

执行以上代码时,将弹出一个“另存为”对话框供用户录入新名称,其默认值为当前日期,如下图所示:

图2定制的“另存为”对话框

关于以上代码,补充八点:

(1)Inputbox的返回值总是文本,如果要求返回值不是文本尽量改用application.Inputbox。 本例中用变量FileName来保存Inputbox的值,所以变量FileName的数据类型也用String。 (2)date语句用户于获取当前的系统日期,默认的日期格式受控制面板所影响,分隔符有可能是“-”也可能是“/”,而“/”不能作为文件名称,所以本例采用Format函数将它格式化,强制使用“-”作分隔符。

(3)Format函数类似于工作表函数text,可以将数值、日期按需求转换格式。而且text函数能用的格式绝大多数都能用于Format中。

(4)InputBox函数的第4、第5参数分别使用10,表示输入框显示在屏幕左上角,离幕屏的上边缘和左边缘的距离都是10。原点是屏幕左上角,而不是Excel应用程序的左上角,当改变Excel的窗口大小可以看出差异。

(5)InputBox函数允许用户随意录入字符,也提供默认值。默认值由函数的第三参数决定。 (6)按下“取消”按钮时,函数的返回值是空文本,其长度为0。由于文件的名字不可能长度为0,所以为了防错,加入“Exit Sub”,表示用户不指定文件名称就结束过程,不再执行后面的代码。

(7)ThisWorkbook表示VBA代码所在工作簿,例如代码写在Book1中,那么ThisWorkbook代表Book1,代码写在Book2中那么ThisWorkbook代表Book2。

(8)Workbook.SaveAs方法表示将工作簿另存,可以使用关键字“Workbook.SaveAs方法”在帮助中搜索到它的详细说明。它的参数是文件路径,查例采用的“\”。

2.根据指定月份批量创建工作表

要求:用户指定一个月份,程序创建以该月每日日期命名的工作表。代码如下:

Sub 新建工作表() '批量建立新表,个数等于本月天数,同时对日期命名,并建立目录 Dim i As Byte, months As Byte '声明变量

'弹出一个对话框,让用户指定月份,默认显示当前月

months = InputBox(\请输入月份,程序将建立该月每日日期命名的工作表\\确定月份\Month(Date))

'批量生成工作表,其个数等于指定月份的天数减去当前已有工作表个数,即确保工作表数量等于该月天数

WorkSheets.Add After:=WorkSheets(WorkSheets.Count), Count:=Day(DateSerial(Year(Date), months + 1, 0)) - Sheets.Count

'将所有工作表重命名,工作表名对应每日的日期

For i = 1 To Worksheets.Count

WorkSheets(i).Name = months & \月\日\ '对每个工作表命名 Next i

MsgBox \建立完毕!\End Sub

执行以上代码时,先弹出以下对话框:

图3输入月份(默认值是当前月的月份)

录入月份后可以得到以下结果:

图4以指定月中每日日期命名的工作表

针对以上代码需要补充五点:

(1)代码中“Dim i As Byte, months As Byte”用于声明变量和变量的数据类型,这是下一节课的讲述重点。本课时稍有了解即可。

数据类型Byte的范围是0-255,因为月份和日期的范围是1-12和1-31,所以宜用Byte型变量。

(2) Month函数用于计算日期值的月份。由于Date表示当前系统日期,所以Month(Date)的计算结果是本月月份。

(3)由于要创建等于整月天数的工作表,而工作簿中已经在若干个工作表,可能1个也可能3个,所以本例采用的办法是整月的天数减去现有的工作表数量(WorkSheets.Count)。

Worksheets.Add方法表示创建工作表,其语法如下:

Worksheets.Add(Before, After, Count, Type)

其中Before和After表示新表的参照位置,两者只能取其一。

Count参数表示工作表的数量,即一次性创建的数量。本例采用的是“Day(DateSerial(Year(Date), months + 1, 0)) - Worksheets.Count”,即整月天数减去已经有的工作表数量。

Type参数表示新表的类型,默认值是工作表。

(4)代码“After:=Worksheets(Worksheets.Count)”表示新表的位置是最后一个工作表之后。“Worksheets.Count”表示工作表的总数量,“Worksheets(Worksheets.Count)”则是最后一个工作表。

(5)“Day(DateSerial(Year(Date), months + 1, 0))”比较难懂一点。“DateSerial(Year(Date), months + 1, 0)”表示变量months所代表的月份的下一个月的0号这一天的日期值,由于日期函数DateSerial可以智能地调节日期,没有0日这一天,所以将下月0日调整为本月最后一天。代码正是利用了这个智能调节功能,故意将月份设置为months + 1,将日期设置为0日,从而简单地获得months月最后一天的日期。

最后利用Day函数计算这个日期在当月中属于第几天。例如2013年2月28日的日期序号是41333,Day函数能将它转换成28,表示这一天是当月的第28天。 (6)创建好工作表后,利用一个循环语句对工作表重命名,

“For i = 1 To Worksheets.Count”表示从第1表到最后一个工作表。

“Worksheets(i).Name = months & \月\日\”表示对工作表逐个命名为“X月Y日”格式的工作表名称。

在第21课时会讲到循环语句。

(7)如果在Inputbox中需要更多的提示信息,那么可以使用Chr(10)来分行。例如本例中Inputbox语句可以修改为:

months = InputBox(\请输入月份,程序将建立该月每日日期命名的工作表\例如输入4月,则产生的工作表则为4月1日、4月2日??\确定月份\

3.将A1日期按指定样式转换为星期

A1存放日期,现需将其转换为星期,程序需要让用户决定转换方式,即提供三个可选项。 达成以上需求可以使用代码:

Sub 将A1日期转换为星期()

Dim Week As Byte '声明变量

'提供输入框,让用户选择转换方式。在输入框中可以预览转换后的结果 Week = InputBox(\请选择转换样式:\输入1:\\

& \输入2:\& WorksheetFunction.Text ([a1], \& Chr(10) & \输入3:\& WorksheetFunction.Text ([a1], \

& \输入4:\选择转换样式\ '根据用户录入的数字对A1的日期进行转换

[b1] = WorksheetFunction.Text ([a1], Choose(Week, \ End Sub

该过程中利用Inputbox显示一个输入框,在输入框中可以预览转换后的四种日期样式,只要输入1到4之间的任何数字,程序会对应地转换日期为星期格式。 假设A1是2013-3-2,那么输入框外观如下图所示。

图5提示用户选择转换样式

在该过程中,使用了Choose函数,它可以根据第一参数的值从后面的参数中选择对应的值作为Text程序没有使用防错功能,如果输入的值小于1或者大于4将产生错误。

第8.2节 Inputbox的限制

前面展示了Inputbox函数的功能及其在实际应用中的神奇功效,但也不代表它没有缺陷。

它不仅有缺陷,而且有较多缺陷。要更好地发挥程序的功能、更好地运用好字符输入框,就有必要了解它到底有哪些限制。

整体而言,Inputbox函数主要有以下限制,制约着它无法更好地在VBA中展现其功能:

1.不能检验用户录入字符的数据类型

通常,在VBA中期望终端用户录入什么类型的数据,但有时终端用户基于测试或者其他目的,会故意录入错误的数据,此时程序可能会弹出与实际错误不相符的提示。而作为开发者,有必要防范此事故发生。 例如录入表示月份的数值时,要求用户输入1到12的数字,但用户如果故意输入“5月”或者“五”,那么程序会产生错误,而且对于此类错误,Inputbox并没有内置任何防范措施。

2.不能产生单元格引用

如果用户需要输入单元格地址,在Inputbox对话框中,用户只能手工录入地址。这显然效率不高且容易产生错误。例如在Excel 2010使用兼容模式下却手工输入了“ZZ100”之类的错误。而更理想的方式是让用户直接选择区域,程序自动将选区地址返回给对话框。 这种问题只能留给Application对象的Inputbox方法来处理。

3.字符长度限制

对话框中的字符串和用户录入的字符(即第一和第三参数)都限定1024左右,如果是纯汉字则为511个。

如果用户的需求超过以上限制,应该考虑使用窗体来体现。

第8.3节 Application.InputBox 方法

VBA中有一个与Inputbox函数功能类似,却强大很多的语句——Application.Inputbox方

法。

要注意它是方法,不是函数。 Application.Inputbox方法在功能上与Inputbox函数基本一致,但却提供了数据类型检测


第8课 VBA输入语句InputBox.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:临时用水施工组织设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: