零基础学Excel VBA(2)

第 5 章   Excel VBA 中 的 代 码 结 构

能 独 立 完 成 一 个 或 大 或 小 任 务 的 代 码 集 合, 称 为 一 个 独 立 的 程 序。

程 序 又 根 据 有 无 执 行 的 对 象 分 为 模 块 程 序、 过 程 程 序 和 事 件 程 序。

模块程序

在 Excel VBA 中, 模 块 是 作 为 一 个 单 元 保 存 在 一 起 的 VBA 定 义 和 过 程 的 集 合, 是 存 放 VBA 程 序 代 码 的 地 方。

在 Excel VBA 中, 模 块 分 为 标 准 模 块 和 类 模 块 两 种。

  • 标 准 模 块: 用 于 存 放 全 局 变 量 公 共 函 数 的 声 明、 函 数、 自 定 义 函 数 等, 用 户 可 以 在 模 块 所 在 的 工 程 中 调 用 该 模 块 的 全 局 变 量、 函 数 等。 标 准 模 块 只 能 在 同 一 个 工 程 中 调 用。
  • 类 模 块: 用 于 存 放 用 户 自 己 创 建 对 象 的 定 义。 与 标 准 模 块 不 同 的 是, 类 模 块 可 以 跨 工 程 调 用。 在 使 用 VBA 编 程 过 程 中, 绝 大 部 分 都 是 集 中 在 对 标 准 模 块 进 行 操 作 上, 几 乎 都 用 不 上 对 类 模 块 进 行 编 程。

使 用 模 块 来 管 理 程 序 代 码 有 以 下 两 个 优 点。

  • 能 够 通 过 在 顶 部 通 用 声 明 的 区 域 中 定 义 模 块 级 别 的 变 量, 使 得 在 模 块 内 部 能 够 共 享 这 些 变 量。
  • 可 以 对 过 程 和 变 量 设 置 一 定 的 权 限, 只 允 许 内 部 访 问, 这 两 种 机 制 可 以 加 强 过 程 之 间 的 通 信, 合 理 地 整 合 模 块 中 的 代 码, 从 而 完 成 一 个 共 同 的 目 标。

过程程序

VBA 程 序 代 码 最 终 还 是 以 过 程 为 单 位 的。 过 程 是 程 序 中 较 小 的 逻 辑 单 元, 其 包 括 一 系 列 用 于 完 成 某 种 任 务 或 计 算 的 语 句。 每 个 过 程 都 有 自 己 的 并 且 唯 一 的 名 字, 在 工 作 簿 中 以 此 来 区 分 不 同 的 过 程。 过 程 的 命 名 有 自 己 的 规 则, 其 具 体 如 下 所 示。

  • 过 程 名 称 的 第 1 个 字 母 不 能 是 数 字 或 者 下 划 线。
  • 名 字 可 以 包 括 数 字 和 下 划 线, 但 不 能 包 括 空 格、 句 号、 感 叹 号, 以 及@、#、 $、& 等 特 殊 字 符。
  • 名 字 可 以 用 中 文, 但 是 为 了 保 持 兼 容 性, 建 议 最 好 使 用 英 文, 不 使 用 中 文。
  • 名 字 的 最 大 字 符 数 为 255 个

过 程 程 序 简 单 的 说 就 是 通 过 代 码 完 成 一 个 任 务。 过 程 程 序 没 有 明 确 的 服 务 对 象, 但 可 以 被 其 他 程 序 所 调 用。 过 程 程 序 又 根 据 是 否 有 返 回 值 分 为 子 过 程 程 序 和 函函 数 过 程 程 序 两 种。

  • 子 过 程 程 序 运 行 后 不 能 返 回 值
  • 函 数 过 程 程 序 运 行 后 则 可 以 返 回 值。

在 默 认 的 情 况 下, 所 有 模 块 中 的 子 过 程 为 Public( 公 用 的), 也 就 是 说 在 应 用 程 序 中 的 任 何 地 方 都 可 以 调 用 它 们。 用 户 可 以 根 据 自 己 的 需 要 将 其 改 为 Private( 私 有 的)。

子 过 程 程 序 除 了 具 有 常 用 的 语 法 结 构 之 外, 还 具 有 标 准 的 语 法 结 构。 具 体 的 语 法 结 构 如 下 所 示。

[Private | Public][ Static] Sub Procedurename( arguments) 
Statements
End Sub

标 准 语 法 结 构 中 的 arguments 部 分 类 似 于 变 量 声 明, 其 声 明 了 从 调 用 过 程 传 递 进 来 的 值。 声 明 的 语 法 如 下 所 示。 [Optional][ By Val | ByRef][ ParamArray] varname[()][ As type][ = defaultvalue] 语 法 中 的 参 数 说 明 如 下 所 示。

  • Optional: 表 示 参 数 可 选。
  • [ By Val | ByRef]: 表 示 规 定 参 数 的 传 递 方 式, 默 认 值 是 ByRef。
  • ParamArray: 只 用 于 arguments 的 最 后 一 个 参参 数, 指 明 最 后 这 个 参 数 是 一 个 Variant 元 素 的 Optional 数 组。
  • Varname: 表 示 参 数 名。
  • Type: 表 示 用 来 指 定 传 递 的 数 据 类 型。
  • Defaultvalue: 表 示 可 以 用 来 设 定 默 认 值。
Sub input_type()
    Worksheets("Sheet1").Activate
    ' 调用sub
    is_digital (Cells(1, 2))
End Sub


Sub is_digital(s As String)
    'ASC函数得到的结果是字串的首字母的ASCII值, 这里的判断函数并不严密
    If Asc(s) >= 48 And Asc(s) <= 57 Then
        MsgBox " 输 入 的 内 容 为 数 值 数 据"
    Else
        MsgBox " 字 符 或 特 殊 字 符 数 据"
    End If
End Sub

函 数 过 程 程 序

函 数 过 程 又 称 自 定 义 函 数 的 过 程, 其 不 但 可 以 在 程 序 中 使 用, 也 可 以 和 工 作 表 函 数 一 样 在 工 作 表 中 使 用。 和 子 过 程 相 比, 函 数 过 程 运 行 的 结 果 是 返 回 值 而 不 是 达 到 某 种 效 果。

函 数 过 程 的 语 法 结 构 如 下 所 示。

```vb [Public | Private][ Static] Function name[( arglist)][ As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function

**函 数 过 程 的 语 法 与 子 过 程 程 序 的 语 法 相 类 似, 但 是, 函 数 过 程 需 要 返 回 一 个 值, 即 需 要 给 name 变 量 赋 值**, name 变 量 的 数 据 类 型 由 As type 来 指 定。 该 赋 值 语 句 可 以 在 函 数 过 程 语 句 中 的 任 何 位 置 出 现, 否 则, 函 数 将 会 返 回 一 个 默 认 值。

### 事 件 程 序 
事 件 程 序 是 一 种 特 殊 的 子 过 程 程 序。 **当 某 种 特 定 的 事 件 发 生 时 才 执 行 的 程 序 称 为 事 件 程 序。** 如 当 打 开 工 作 簿 时 触 发 某 个 程 序 的 运 行, 打 开 工 作 簿 的 动 作 就 是 一 个 事 件。 

#### 事 件 程 序 的 添 加 
在 添 加 事 件 程 序 时, 需 要 指 定 对 象, 因 此 在 添 加 前 需 要 先 选 取 该 对 象 并 打 开 该 对 象 的 代 码 窗 口, 然 后 在 代 码 窗 口 的“ 对 象” 列 表 框 中 选 取 该 对 象, 并 在“ 过 程” 列 表 框 中 选 取 需 要 的 事 件。 

这 一 点 与 添 加 过 程 程 序 有 所 不 同, 在 添 加 过 程 程 序 时, 只 需 要 添 加 过 程 代 码 就 可 以 了, 不 需 要 选 取 对 象 和 所 需 要 的 事 件。 

在 代 码 窗 口 的“ 对 象” 列 表 框 中 选 择 完 对 象, 并 且 在“ 过 程” 列 表 框 中 选 择 完 对 象 的 事 件 之 后, 在 代 码 窗 口 中 就 会 自 动 添 加 该 程 序 的 开 始 和 结 束 语 句。


从 前 面 事 件 程 序 的 添 加 中 可 以 看 出, 事 件 程 序 主 要 由 对 象 和 发 生 在 该 对 象 上 的 事 件 组 成, 其 具 体 的 程 序 结 构 如 下 所 示。 

```vb
Sub 对 象 名 称_ 事 件 名 称( 自 变 量) 
程 序 代 码 
End Sub

代 码 中 的“ 对 象 名 称_ 事 件 名 称( 自 变 量)” 是 在 选 取 对 象 及 其 事 件 后 自 动 添 加 的, 该 对 象 名 称 及 其 事 件 名 称 在 添 加 后 不 能 够 被 修 改, 括 号 中 的 自 变 量 也 是 由 系 统 自 动 指 定 的, 也 不 能 够 被 修 改。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next

    Dim StrCons As String
    StrCons = InputBox(" 请 确 认 是 否 关 闭 工 作 簿, 如 果 关 闭 则 输 入 确认关闭, 然 后 单 击 确 定 按 钮")

    If StrCons = "确认关闭" Then
        Cancel = False
    Else
        Cancel = True
    End If

End Sub

实 现 当 改 变 当 前 工 作 簿 的 大 小 时, 将 在 工 作 表 的 单 元 格 中 显 示 当 前 工 作 簿 的 宽 度、 高 度 和 当 前 的 位 置 坐 标 信 息。

Private Sub Workbook_WindowResize(ByVal Wn As Window)
Dim width As Integer, height As Integer, left As Integer, top As Integer

width = Wn.width
height = Wn.height
left = Wn.left
top = Wn.top

Worksheets("Sheet1").Range("a1").Value = width
Worksheets("Sheet1").Range("a2").Value = height
Worksheets("Sheet1").Range("a3").Value = left
Worksheets("Sheet1").Range("a4").Value = top

End Sub

过 程 程 序 与 事 件 程 序 的 区 别

  • 过 程 程 序 的 所 有 程 序 代 码 必 须 手 动 进 行 创 建, 而 事 件 程 序 的 开 始 和 结 束 的 代 码 可 以 通 过 选 择 对 象 和 对 象 的 事 件 进 行 自 动 生 成。
  • 过 程 程 序 通 常 由“ 宏” 来 调 用 执 行, 而 事 件 程 序 只 有 在 某 个 事 件 被 触 发 时 才 会 被 执 行。
  • 过 程 程 序 常 与 用 户 自 定 义 的 对 象 相 关 联, 而 事 件 程 序 则 常 与 Excel 本 身 存 在 的 对 象( 如 工 作 簿 和 工 作 表 对 象) 相 关 联。

李俊民. 零基础学Excel VBA (零基础学编程) (Kindle 位置 2065-2072). 机械工业出版社. Kindle 版本.

VBA中的对象,属性,方法

在 Excel VBA 当 中, 工 作 簿、 工 作 表、 单 元 格、 图 表 等 都 是 对 象。 此 外, 在 Excel 中 还 可 以 插 入 一 个 窗 体 和 按 钮 等 对 象, 这 些 也 是 Excel VBA 中 的 对 象。

在 VBE 开 发 环 境 中 的“ 对 象 浏 览 器” 窗 口 中, 可 以 查 看 Excel VBA 中 的 全 部 对 象,可以在视图菜单中打开或者按F2快捷键打开对象浏览器.

在 Excel VBA 中, 对 象 和 属 性 中 间 用“.” 分 隔 开, 表 示 属 性 属 于 哪 个 具 体 的 对 象, 对 象 与 属 性 间 的 语 句 格 式 如 下 所 示。

对 象. 属 性 = 属 性 值

Sub cell_color()
    Worksheets("Sheet1").Activate
    Cells(2, 2).Font.Color = RGB(0, 0, 255)
    Cells(2, 2).Value = "Hello World!"
End Sub

方 法 是 指 对 对 象 执 行 的 某 种 动 作, 从 而 完 成 某 件 事 情 或 某 个 动 作。在 操 作 Excel 对 象 中, 打 开 与 删 除 工 作 表, 复 制 单 元 格 等 都 是 Excel VBA 中 方 法 的 实 例。“ 打 开” 与“ 删 除” 是 对 工 作 表 对 象 的 方 法,“ 复 制” 是 对 单 元 格 的 方 法。

与 属 性 和 对 象 之 间 的 关 系 一 样, 对 象 和 方 法 之 间 也 用“.” 分 隔 开。 除 此 之 外, 有 的 方 法 还 带 有 自 变 量, 自 变 量 与 方 法 之 间 用 空 格 分 隔 开。 用 方 法 操 作 对 象 的 语 法 格 式 如 下 所 示。

对象.方法 自变量

Sub delete_sheet2_sheet3()
    On Error Resume Next
    sheet2.Delete
    sheet3.Delete
    '名称为 sheet2 的工作表
    Sheets("sheet2").Delete
End Sub

复制粘贴示例:

Sub copy_and_paste()
    Worksheets("Sheet1").Activate
    '复制内容
    Cells(2, 2).Copy
    '粘贴已经复制的内容
    Cells(2, 3).PasteSpecial xlPasteAll
End Sub

第 6 章   工 作 簿 相 关 的 操 作

从 本 章 开 始, 将 讲 解 如 何 使 用 Excel VBA 来 控 制 Excel 对 象。

新 建 工 作 簿

在 当 前 位 置 新 建 工 作 簿 :Excel VBA 中 有 Workbooks 和 Workbook 两 种 表 示 工 作 簿 的 对 象。 Workbooks 对 象 是 Workbook 对 象 的 集 合, 通 过 使 用 Workbooks 对 象 的 Add 方 法 可 以 新 建 一 个 工 作 簿。

Sub add_and_save_workbook()
    Dim wb As Workbook
    Set wb = Workbooks.Add

    '默认会保存到文档文件夹
    wb.SaveAs "test.xlsx"

    '文件路径分割必须用 \
    wb.SaveAs "d:\test.xls"

    '没有相对路径的说法,只能用字符串拼接计算符 & 实现相对路径
    '注意名称前加上 \
    wb.SaveAs ThisWorkbook.Path & "\test2.xls"
    wb.Close
    Set wb = Nothing

End Sub

打开工作簿

Sub open_wb()
    '如果已经打开,进行提示,不重复打开
    Dim num_wb As Integer

    For num_wb = 1 To Workbooks.Count
        If Workbooks(num_wb).Name = "test2.xls" Then
            MsgBox "Workbook 已打开"
            Exit Sub
        End If
    Next num_wb

    '打 开 设 置 保 护 的 工 作 簿, 只需要 填写密码参数
    Workbooks.Open ThisWorkbook.Path & "\test2.xls", Password:=""
End Sub

保存工作簿

Sub save_wb()
    '保 存 当 前 工 作 簿
    ActiveWorkbook.Save
    '另存为工作簿, 可以用来备份工作簿,默认保存到文档文件夹
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\test3.xlsm"
    '保 存 指 定 的 工 作 簿
    Workbooks("test3.xlsm").Save
End Sub

saveAs时, 路径一定写全啊.

关闭工作簿

Sub close_wb()
    Dim num_wb As Integer
    '如果没有打开,关闭该工作簿会报错
    Dim is_open  As Boolean
    is_open = False
    For num_wb = 1 To Workbooks.Count
        If Workbooks(num_wb).Name = "test2.xlsm" Then
            is_open = True
        End If
    Next num_wb

    If is_open = False Then
        MsgBox "Workbook 没有打开"
        Exit Sub
    End If

    Workbooks("test2.xlsm").Close

End Sub

Sub close_active_wb()
    '关闭当前工作簿, 关闭前保存
    ActiveWorkbook.Close savechanges:=True

    '关闭所有工作簿
    Workbooks.Close
End Sub

工作簿的应用

1.禁止打印

在BeforePrint 事件中添加代码.

Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Cancel = True
    MsgBox "禁止打印"
End Sub

2.禁 止 编 辑 工 作 簿 中 的 所 有 单 元 格

Dim tempStr As String
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    '"Workbook" 对 象 的" SheetSelectionChange" 事 件 在 选 取 单 元 格 时 发 生,
    '当 选 取 单 元 格 时, 首 先 将 单 元 格 中 的 内 容 保 存 到 变 量 TempStr 中。
    tempStr = ActiveCell.Value
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'SheetChange 事 件 是 在 单 元 格 内 容 改 变 事 件, 即 当 单 元 格 中 的 内 容 改 变 时, 将 会 触 发 该 事 件。
    '当 单 元 格 中 的 内 容 改 变 时, 将 变 量 中 值 赋 给 单 元 格, 从 而 实 现 无 法 编 辑 单 元 格 中 内 容 的 功 能。
    Application.EnableEvents = False
    Target = tempStr
    Application.EnableEvents = True
End Sub

3.禁 止 使 用 关 闭 按 钮

在 Excel 的 工 作 簿 当 中, 通 过 单 击 工 作 簿 右 上 角 中 的【 关 闭】 按 钮 可 以 关 闭 工 作 簿。 在 工 作 簿 中 Workbook 对 象 的 BeforeClose 事 件 中 可 以 将 工 作 簿 中 的【 关 闭】 按 钮 设 置 为 失 效 状 态

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Cancel = True
End Sub

4.关 闭 工 作 簿 时 弹 出 提 示 信 息

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim i As String
    i = MsgBox("Close?", vbOKCancel)
    '如 果 变 量 的 值 为 vbOK 则 表 示 单 击 选 择 的 是【 确 定】 按 钮, 此 时 执 行 将 Cancel 的 值 设 置 为" False" 的 操 作, 关 闭 工 作 簿;
    '如 果 变 量 的 值 为 vbCancel( 第 6 行 代 码), 则 表 示 单 击 选 择 的 是【 取 消】 按 钮,
    '此 时 执 行 将 Cancel 的 值 设 置 为" True" 的 操 作, 禁 止 关 闭 工 作 簿。

    If i = vbOK Then
        Cancel = False
    Else
        Cancel = True
    End If
End Sub

第 7 章   工 作 表 的 相 关 操 作

1.新 建 工 作 表

Sub add_sheets()
    '添加单张工作表
    Sheets.Add

    '添加指定名称的工作表,需要判断是否存在
    Dim i As Integer
    Dim sheet_exist As Boolean
    sheet_exist = False
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "表名称" Then
            sheet_exist = True
        End If
    Next i

    If sheet_exist = True Then
        MsgBox "sheet名称已经存在,不会创建"
    Else
        Sheets.Add
        ActiveSheet.Name = "表名称"
    End If
End Sub

2.在指定位置新建工作表

在 指 定 位 置 新 建 工 作 表 在 新 建 工 作 表 时, 可 以 在 指 定 的 位 置 插 入 新 建 的 工 作 表。 在 指 定 位 置 新 建 工 作 表 主 要 可 分 为 以 下 4 种 情 况, 即

  • 在 指 定 工 作 表 前 新 建 工 作 表
  • 在 指 定 工 作 表 后 新 建 工 作 表
  • 在 工 作 表 的 最 前 位 置 新 建 工 作 表
  • 在 工 作 表 的 最 后 位 置 新 建 工 作 表,
Sub insert_sheets()
    'SheetVBA 如果不存在,创建之
    Dim i As Integer
    Dim sheet_exist As Boolean
    sheet_exist = False
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "SheetVBA" Then
            sheet_exist = True
        End If
    Next i

    If sheet_exist = False Then
        Sheets.Add
        ActiveSheet.Name = "SheetVBA"
    End If

    Worksheets("SheetVBA").Activate
    Dim strSheetName As String
    strSheetName = Cells(1, 1).Value

    If strSheetName = "" Then
        strSheetName = "SheetVBA"
    End If

    '在指定工作表前插入工作表
    Sheets.Add Before:=Sheets(strSheetName)

    '在指定工作表后插入工作表
    Sheets.Add after:=Sheets(strSheetName)

    '在 所 有 工 作 表 之 前 新 建 一 个 新 的 工 作 表
    Sheets.Add Before:=Sheets(1)

    '在 所 有 工 作 表 之 后 新 建 一 个 新 的 工 作 表
    Sheets.Add after:=Sheets(Sheets.Count)

    '新 建 工 作 表 并 指 定 名 称
    ActiveSheet.Name = "test"

    '新建指定数量的多张表,如:3张
    Sheets.Add Count:=3

    '激活指定名称的表
    Sheets("SheetVBA").Activate

End Sub

仅保留指定的sheet:

Sub keep_only_SheetVBA()
    'SheetVBA 如果不存在,创建之
    Dim i As Integer
    Dim sheet_exist As Boolean
    sheet_exist = False
    For i = 1 To Sheets.Count
        If Sheets(i).Name = "SheetVBA" Then
            sheet_exist = True
        End If
    Next i

    If sheet_exist = False Then
        Sheets.Add
        ActiveSheet.Name = "SheetVBA"
    End If
    '仅保留SheetVBA

    For i = Worksheets.Count To 1 Step -1
        If Sheets(i).Name <> "SheetVBA" Then
            MsgBox Sheets(i).Name & " deleted"
            '不提示删除信息
            Application.DisplayAlerts = False
            Sheets(i).Delete
            Application.DisplayAlerts = False
        End If
    Next i
End Sub

激 活 与 选 取 工 作 表

如 果 想 要 编 辑 工 作 表 或 者 单 元 格, 首 先 需 要 先 激 活 或 选 取 工 作 表。

激 活 工 作 表 使 用 的 是 工 作 表 对 象 的 Activate 属 性。

Sub activate_sheet()
    Sheets(Cells(1, 3).Value).Activate
End Sub

选 取 工 作 表 使 用 的 是 工 作 表 对 象 的 Sheet 属 性。

Sub select_sheet()
    Sheets(Cells(2, 3).Value).Select
End Sub

从 执 行 的 结 果 来 看, 选 取 工 作 表 与 激 活 工 作 表 的 结 果 相 同。 实 际 上, 在 操 作 一 张 工 作 表 时 二 者 的 结 果 是 相 同 的, 都 是 选 取 工 作 表 并 将 工 作 表 设 置 为 活 动 的 状 态。二 者 的 主 要 区 别 是 当 同 时 选 取 多 张 工 作 表 时, 只 能 将 一 个 工 作 表 设 置 为 活 动 的 状 态。

Sub select_sheets()
    '选取多个工作表
    Sheets(Array(Cells(1, 3).Value, Cells(2, 3).Value)).Select
End Sub

在 工 作 表 当 中, 可 以 通 过 使 用 Shift 键 或 Ctrl 键 与 鼠 标 配 合 来 选 取 多 个 工 作 表。

选中所有工作表:

Sub select_all_sheets()
    Sheets.Select
End Sub

工 作 表 的 隐 藏

如 果 不 需 要 显 示 工 作 簿 中 的 某 个 工 作 表, 可 以 将 该 工 作 簿 隐 藏。

在 Excel 中, 在“ 开 始” 选 项 卡 中 的“ 单 元 格” 栏 中 单 击【 格 式】 按 钮, 在 弹 出 的 下 拉 菜 单 中 选 择“ 隐 藏 和 取 消 隐 藏” 菜 单 下 的“ 隐 藏 工 作 表” 子 菜 单, 可 以 将 当 前 选 中 并 激 活 的 工 作 表 隐 藏。

Sub hide_sheets()
    '隐 藏 单 个 工 作 表()
    Sheets(" Sheet2").Visible = 0

    '隐 藏 多 个 工 作 表()
    Sheets(Array(" Sheet2", " Sheet3")).Visible = 0

    '取消隐藏, 值设置为 -1 即可
    Sheets(" Sheet2").Visible = -1
End Sub

工作表的删除

'根据名字
Sheets( StrSheets).Delete

'根据序号
Sheets(2).Delete

工 作 表 的 移 动

有 时 候 根 据 需 要, 可 以 将 工 作 表 在 本 工 作 簿 内 或 工 作 簿 之 间 进 行 移 动。

工作簿内的移动:

Sub move_sheet()
Sheets(Str1).Move before:= Sheets(Str2)
Sheets(Str3).Move after: = Sheets(Str4)
End Sub

实 际 上, 在 工 作 簿 中, 将 鼠 标 放 置 在 要 移 动 的 工 作 表 之 上, 然 后 按 住 鼠 标 左 键 在 工 作 簿 内 拖 动 鼠 标, 也 可 以 将 选 中 的 工 作 簿 移 动 到 所 需 要 的 位 置。

在 工 作 簿 之 间 移 动 工 作 表:

Sub move_sheet_to_new_workbook()
    '会新建一个工作簿,并移动 Sheet32 到新工作簿中
    Sheets("Sheet32").Move
End Sub

Sub move_sheet_to_new_workbook()
'移动到指定工作簿, 只能是已经打开的工作簿
    Sheets("Sheet32").Move before:=Workbooks("test.xlsx").Sheets(1)
End Sub

在 工 作 簿 之 间, 也 可 以 通 过 拖 动 工 作 表 的 方 式 移 动 工 作 表, 方 法 与 在 工 作 簿 内 移 动 工 作 表 的 方 法 相 同。

工作表的复制

与 移 动 工 作 表 一 样, 在 工 作 簿 内 复 制 工 作 表 同 样 也 分 为 将 工 作 表 复 制 到 指 定 的 工 作 表 之 前 和 将 工 作 表 复 制 到 指 定 的 工 作 表 之 后 2 种 情 况。

Sub copy_sheet()
Sheets(Str1).Copy before:= Sheets(Str2)
Sheets(Str3).Copy after:= Sheets(Str4)
End Sub

工作簿之间,工作表的复制类似,代码片段

'将 工 作 表 移 动 到 指 定 的 工 作 簿 当 中
Sheets("Sheet2").Copy before:= Workbooks(StrBooks).Sheets(1)

工 作 表 的 保 护

在 日 常 的 应 用 中, 工 作 表 中 有 许 多 重 要 的 内 容 是 不 允 许 其 他 用 户 进 行 更 改 的, 如 考 试 成 绩、 公 司 账 目 等。 可 以 通 过 保 护 工 作 表 的 方 法 禁 止 其 他 用 户 更 改 工 作 表 中 的 内 容。

在 工 作 表 的 单 元 格 中 输 入 要 保 护 工 作 表 的 名 称 之 后, 单 击 工 作 表 中 的【 保 护 工 作 表】 按 钮, 则 被 指 定 的 工 作 表 将 处 于 被 保 护 的 状 态, 即 不 允 许 向 单 元 格 中 添 加 内 容 或 修 改 单 元 格 中 的 内 容。

Sub protect_sheet()
    '设置保护
    Sheets("SheetVBA").Protect Password:=123456
    '解除保护
    Sheets("SheetVBA").Unprotect Password:=123456
End Sub

7.8   工 作 表 的 应 用

(略)

7.9   举 一 反 三

(略)

© Licensed under CC BY-NC-SA 4.0

兴趣是最好的老师——爱因斯坦

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!