公卫人

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3959|回复: 21

[分享] Excel VBA常用代码

[复制链接]
YAR 发表于 2023-1-26 18:49:51 | 显示全部楼层 |阅读模式

注册后推荐绑定QQ,之后方才可以使用下方的“用QQ帐号登录”。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
001.批量创建工作表.txt" v% O* R, h8 K2 }" C0 P

: E9 t5 B2 C6 x, X  uSub NewSht()2 G: @( U; _6 B( p3 n
    Dim shtActive As Worksheet, sht As Worksheet
: i) Y  ~$ j& R, u2 a: {    Dim i As Long, strShtName As String
% H( }& `% @! e( G    On Error Resume Next '当代码出错时继续运行/ R4 G, T& }( @- I. x  D
    Set shtActive = ActiveSheet
7 l/ o) e" p; O3 h5 x0 k    For i = 2 To shtActive.Cells(Rows.Count, 1).End(xlUp).Row8 M5 k' h8 M, P# ?6 ?
    '单元格A1是标题,跳过,从第2行开始遍历工作表名称7 `& V' f) F6 Y& q7 q
        strShtName = shtActive.Cells(i, 1).Value. Q- U' h6 b# q' p& u4 d( W7 ]
        '工作表名强制转换为字符串类型
- f5 V  o; D, x9 E- r/ ]. J        Set sht = Sheets(strShtName)
! i1 Y) g" P+ f  L        '当工作簿不存在工作表Sheets(strShtName)时,这句代码会出错,然后……
8 K- j: }& T& v0 P# }$ f. ^6 r        If Err Then' p% f& j' A4 ^$ j
        '如果代码出错,说明不存在工作表Sheets(t),则新建工作表  |0 J9 e+ M% B0 S+ k+ M7 W
            Worksheets.Add , Sheets(Sheets.Count)1 O: G: u, ^( |
            '新建一个工作表,位置放在所有已存在工作表的后面9 s/ v! O, o6 Y: j0 Q6 ~* q# x3 P
            ActiveSheet.Name = strShtName6 @" U" i/ M" A; G. v5 o6 ?* @
            '新建的工作表必然是活动工作表,为之命名
. E& n' n% N' v2 N+ ~+ a2 o            Err.Clear
" i1 d, Q! _: f) J5 R% ]& P            '清除错误状态0 P; ?  K7 x. L& j: W. h
        End If
4 O* a6 A) R3 B2 N% q3 I" c5 }    Next
- @4 l. c0 x' ?/ g  G    shtActive.Activate! L7 t: H% p: g
    '重新激活原工作表
4 p" V- J# U% OEnd Sub

评分

参与人数 1钢镚 +5 收起 理由
搬砖的水母 + 5 积极发布原创帖子内容,再接再厉!

查看全部评分

 楼主| YAR 发表于 2023-1-26 18:51:56 | 显示全部楼层
002.删除全部工作表
5 _( J* h' h0 M4 t, f% k5 d/ ?' _5 Y: I1 A$ r0 ?6 n6 }9 W
* a) I# m+ c8 U$ @6 J3 K# V. i
Sub DelShet() '删除所有工作表
. t/ t- E7 v, A( P) i+ A3 z$ F    Dim sht As Worksheet4 d8 P6 W7 ?; P2 ^# W9 X
    Application.ScreenUpdating = False '关屏幕刷新2 Y% q  r9 @8 k& D7 |+ {1 T- B
    Application.DisplayAlerts = False '关警告信息  B" ^8 p. ~. U7 r4 X
    On Error Resume Next  h: G. {  Q0 ]
    For Each sht In Worksheets
8 D2 d2 r8 N% _3 F% _6 q; [        sht.Delete '遍历工作表删除
- |: ^' s4 E' F& A7 N' U, J    Next
3 t2 v+ O9 e5 ]  r3 \    Application.ScreenUpdating = True$ Z. G2 A% y/ z# o8 `
    Application.DisplayAlerts = True9 i8 \6 ~. s% f& [; S
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 18:54:10 | 显示全部楼层
003.提取工作表名字/ V+ X0 g- m9 e+ `
: H  K9 H8 p1 h6 t
8 ^3 `' O6 }$ i0 ]0 L+ k' `
Sub GetShtByVba(); z# J1 {4 l" d1 ?6 r3 ]
    Dim sht As Worksheet, k As Long
, {0 v+ ]% r$ x* C/ z9 H& g    Application.ScreenUpdating = False8 A/ g2 V: d5 c
    k = 18 T- `0 J6 p8 x# f1 u
    Range("a:b").Clear '清空数据3 v4 `* C4 f. |4 D  K
    Range("a:a").NumberFormat = "@" '设置文本格式
' S; i7 {2 W0 l6 ^    For Each sht In Worksheets '遍历工作表取表名
$ j, E  I! w) D4 J0 ], ^        k = k + 1
$ T4 I8 B! B9 O* l  t+ A        Cells(k, 1) = sht.Name- @8 {! a+ u: R5 v7 |
    Next
6 B! d& w: |! M' X% ~4 ^# o, e# p    Range("a1:b1") = Array("工作表名", "是否删除")
; W/ _! w' B2 E2 v9 Y    Application.ScreenUpdating = True( A( i& c  G- l, [2 [1 n) w5 @% u
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:01:39 | 显示全部楼层
004.删除指定工作表
. A% w/ g* [7 n* s4 j
. i5 O! w% v+ R4 A9 ]- l7 A% H
+ P9 U- v) G# u( D* _8 E1 g- H4 o5 k: cSub DelShtByVba()7 [- \1 P* k6 Y  C3 d+ V1 D
    Dim sht As Worksheet, i As Long, r
1 M/ s* c! n! L- f8 Z' X    Application.ScreenUpdating = False
$ B4 l( y6 m7 P! Z% p/ @- S# A& H    Application.DisplayAlerts = False# d9 X2 a3 ?) ^" k' O
    On Error Resume Next/ |/ l, r6 g2 y; {
    r = Range("a1").CurrentRegion '数据装入数组r- y0 b. o( j% W7 n/ F
    For i = 2 To UBound(r) '遍历并删除工作表
2 P% Y8 K' a, b        If r(i, 2) = "删除" Then Worksheets(CStr(r(i, 1))).Delete
* N- u& ]2 m# p    Next
9 ]  P' l) M& q* r8 y3 a$ D    Application.ScreenUpdating = True7 M0 ^5 W0 i/ {5 W
    Application.DisplayAlerts = True) c6 }( S9 K/ h/ z; u2 i
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:04:58 | 显示全部楼层
005.生成带超链接的工作表目录- A6 y! N, \6 x; J1 E% Y; X
  A4 d1 o/ }/ F' ~; e) o% g4 X
, r9 D$ l7 a+ P' C5 o8 O
Sub ml()
1 u2 d! `1 b9 ~. D8 j/ `    Dim sht As Worksheet, i&, strShtName$
- e- E% l, H0 i    Columns(1).ClearContents '清空A列数据
) P2 H; ?+ f. ?. K, w, T    Cells(1, 1) = "目录" '第一个单元格写入标题"目录"3 j$ j9 w( M4 T% j" w; q# N
    i = 1  '将i的初值设置为1.
2 N! |6 g' }0 a    For Each sht In Worksheets  '循环当前工作簿的每个工作表
$ E& B. M/ x* F3 S: S        strShtName = sht.Name
; f' B, R/ X9 f5 Q$ y        If strShtName <> ActiveSheet.Name Then* e8 J0 z( [' C9 B  r
       '如果sht的名称不是当前工作表的名称则开始在当前工作表建立超链接9 l) Z+ @; y: a: |- T  g! n3 e! b
            i = i + 1 '累加工作表数量3 m: V; @2 J% d$ D
           ActiveSheet.Hyperlinks.Add anchor:=Cells(i, 1), Address:="", _
6 O. r" u; U) z/ r- r& d            SubAddress:="'" & strShtName & "'!a1", TextToDisplay:=strShtName
+ W9 q$ H* c# M/ c7 \: w           '建超链接, G# v9 m9 s4 `7 n) z4 n. k5 T2 ~, h' k
        End If
. y- f$ i2 z4 x    Next6 Y" o1 K$ G" h/ C: R2 c. W* m. R9 c
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:06:31 | 显示全部楼层
006.在各个分表创建返回总表的命令按钮
7 E3 M. L, W# S" Y5 c& ?, q# g4 J3 P* m: B6 y% o
' O' o/ Z0 W& {
Dim strShtName As String
) F3 a. R) y; X' \) u+ t" F+ ?Sub Mybutton()6 G1 E" o* h7 h: J$ A5 Q4 A- n
    Dim sht As Worksheet, btn As Button- g# m) B* Q* ?  |) z
    On Error Resume Next
& ^# `; x# y$ y. n% u) {    For Each sht In Worksheets
) @5 Y$ A, e" t# s9 z; [" |        With sht
, r" G* h3 }0 i3 a- @4 q5 v            If .Name <> strShtName Then
3 P* C4 t9 k; e# r6 e* x: c- L                .Shapes(strShtName).Delete8 ?8 B% ?5 Z. X9 o
                '删除原有的名称为shtn的按钮,避免重复创建
; o) j" n! }- [5 m9 w. ]0 N9 \                Set btn = .Buttons.Add(0, 0, 60, 30)'使用add方法在工作表中添加一个按钮控件,add方法语法如下:表达式.Add(left,right,width,height)
; d( N: t4 p& M+ o1 @& H& U# S, _% w                '新建按钮,释义见小贴士; L& T( E; M* N/ ~# c
                With btn
2 s3 Z% i2 M" W1 S; R* P                    .Name = strShtName5 u1 D5 e$ H6 K) U$ S
                    '命令按钮命名7 H6 }% u: v) |' T, a
                    .Characters.Text = "返回总表"
+ j3 _% K5 W+ B                    '按钮的文本内容
$ m& i+ K3 U, k- d8 M) u" F( Y                    .OnAction = "LinkTable". e' K. w' L3 M' \: O7 R
                    '指定按钮控件所执行的宏命令
: L+ \+ T6 v- T4 E" Z                End With( L( t$ U1 e% q; T9 U1 g& l- x% T
            End If+ Z1 w; `  A! o  S& E% q# J
        End With! D* l2 X$ q5 b  L
    Next
( F: p6 y1 g' Z    Set btn = Nothing
7 F) p) c' m) d( T; oEnd Sub% W$ Y4 q/ `) g: Q# s

3 p0 Z: c; j# x( x0 uSub LinkTable()# t" w7 ?* m  C
    strShtName = "总表"'指定了返回总表的名字,可以根据实际需要修改为目标表的名称,比如“目录”。
6 Z- _3 T5 [7 h" j/ x    '设置变量strShtName为总表的名称,可以根据实际总表的名称做修改9 X5 C! `7 ^6 K' Q( G2 j9 C
    Worksheets(strShtName).Activate4 c. [  x: N) G- i: C% d7 ^
    [a1].Select! V+ Y  i1 d* k  e! k, v: H& x
End Sub
1 S0 ?; E0 \7 W& ]! _8 P
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:07:57 | 显示全部楼层
007.批量提取工作表的名字
5 J7 q8 H$ @% q' V; X2 w) O8 i- Z2 F7 c( a' ~2 n
2 E2 k( J1 w' |" g/ p( c" |
Sub GetShtName()
# C3 k4 v$ H5 R9 l    Dim sht As Worksheet, i As Long
; \& l' `9 r% x0 A$ T    i = 1 'i初始值为1
; e# v& u+ {. q- x    With Columns(1)2 {5 y" w3 A4 b9 Q
        .ClearContents '清除A列内容
/ r) k7 X7 P8 n        .NumberFormat = "@" '设置单元格格式为文本" J+ m" @# J8 T6 P* ^0 v$ C& x
    End With
) i1 K5 {) o& |0 C  L6 X    Cells(1, 1) = "工作表名称目录"8 k, s, }- f- |
    For Each sht In Worksheets '遍历工作表
% s0 [. n. N0 u2 f        i = i + 1( `' i9 n4 m: y3 v- `$ h# _7 \- a2 j
        Cells(i, 1) = sht.Name '在A列记录工作表名称
* N" U8 J" v+ Z3 h* D/ e    Next
- }8 i) }% Z7 ^% V: k- O. NEnd Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:09:35 | 显示全部楼层
008.批量修改工作表的名字+ b) p) H" z. n  B/ P1 V* v( \( V

0 X  O3 m  g( F0 c0 N* s& `. o
, N! `1 @: z) }& USub ReNameSht()
% O5 y5 U% @  y# n; D# v    Dim strShtName$, sht As Worksheet, i&% x+ }/ w2 }: _7 w4 k
    On Error Resume Next '当程序运行中出现错误时,继续运行0 f3 R) O: b' E4 P- i$ `: o. w& H2 [; h
    For i = 2 To Cells(Rows.Count, 1).End(xlup).Row '遍历当前表格A列的数据  a. D4 D; d! t7 N  D: {
        strShtName = Cells(i, 1).Value '将表格A列的值,赋予变量strShtName
, E% g, W; j( p9 ]5 E4 R6 V2 @( G        Worksheets(strShtName).Name = Cells(i, 2).Value '工作表重命名$ ?+ g& R$ L7 I' F/ t, Z
    Next" }+ ^; c% ?: y5 ^, Z8 C: d/ y
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:11:51 | 显示全部楼层
009.批量取消工作表的隐藏
3 h* N! _! F6 {% Z+ y9 c
  v5 L( j/ m# f9 g8 Q8 h
3 F( o* b8 u3 {/ FSub unShtVisible()
! [3 C$ j; v" J; n# s: `    Dim sht As Worksheet2 Q2 H) m3 J: U7 w
    For Each sht In Worksheets '遍历工作表,设置可见
9 t# w  ]) K- V' S" D3 ~        sht.Visible = xlSheetVisible% J+ l& X* R8 W: L+ C- H' L& ]1 w
    Next$ _8 [' t: u7 p
End Sub
回复

使用道具 举报

 楼主| YAR 发表于 2023-1-26 19:12:58 | 显示全部楼层
010.一键汇总各分表数据成总表【不保留分表格式】
" H8 U: \. |8 j# O+ C
, X0 d; U3 @: E/ G; [7 f& D" J6 K) t
Sub CollectData()
. f% U) ?  Q% b, u9 Q: S    Dim Sht As Worksheet, rng As Range, k&, n&" E$ i% T' _9 z0 R( [" M4 w; B
    Application.ScreenUpdating = False
$ ^6 v& }4 @0 J3 i2 s+ x+ k, ~    '取消屏幕更新
/ W0 G4 ?# \: V) s1 @1 V    n = Val(InputBox("请输入标题的行数", "提醒"))6 ~' F. M0 H7 q9 _/ l
    If n < 0 Then MsgBox "标题行数不能为负数。", 64, "提示": Exit Sub
- F. S9 o8 |9 _" X    '取得用户输入的标题行数,如果为负数,退出程序* U) b8 B7 t$ _/ S
    Cells.ClearContents" `0 g3 d* J7 t4 F- p
    '清空当前表数据
$ h+ X  i( w, o5 t- M. ^2 h  ^' x, D5 y    For Each Sht In Worksheets
1 g3 @" a! t/ O9 T, r8 i4 ?    '遍历工作表
4 C# ?8 F& R/ }; \! `        If Sht.Name <> ActiveSheet.Name Then" K+ G6 q7 M6 }/ x5 Y/ F
        '如果工作表名称不等于当前表名则进行汇总动作……. O  C! j, c. ~2 S! @. l. J
            Set rng = Sht.UsedRange6 o+ ?/ I. k. x5 W
            '定义rng为表格已用区域
; j. `& \, w- z, p            k = k + 1
& H, p/ J1 u  n3 Z6 l0 [% L            '累计K值% T* m; |, u+ K2 Y5 A
            If k = 1 Then. U) e" Z% k! f2 Y
            '如果是首个表格,则K为1,则把标题行一起复制到汇总表
$ d  b/ J; L5 [  h5 b) a                rng.Copy) A9 ]7 V* I" m' \' e% G2 k
                [a1].PasteSpecial Paste:=xlPasteValues '仅粘贴数值
; ?5 q; s3 k5 Q: v% X            Else
$ n5 [1 K# C8 [; }: V                '否则,扣除标题行后再复制黏贴到总表,只黏贴数值" O! A( Z( n7 t0 y
                rng.Offset(n).Copy! P& T* p& m3 y5 i
                Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).PasteSpecial Paste:=xlPasteValues
* i3 C5 c4 g( `9 s+ E, A            End If
4 @; ~/ b: ^& k2 \8 {5 G! f        End If
. f/ {: S1 Y9 J$ ?. ]    Next
: L0 z7 p0 h2 f, ^7 H3 A    [a1].Activate) [0 f  N( I' Y. D  p/ V' s
    Application.ScreenUpdating = True '恢复屏幕刷新
: A( T$ U; d+ w4 OEnd Sub
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|会员|至尊|接种|公卫人 ( 沪ICP备06060850号-3 )

GMT+8, 2024-5-18 22:10 , Processed in 0.066467 second(s), 6 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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