vba新建指定名称工作表(VBA自动创建工作表)

Excel每次新建工作表要从一个空表格开始,然后分别设置表格参数,然后输入数据。

感觉有点麻烦,如果是初学者,可能根本找不到在哪里设置单元格格式。

本节介绍一种方法,制作一个全功能建表格式,选择相应的格式,然后一键完成。

vba新建指定名称工作表(VBA自动创建工作表)(1)

上图为可选择的功能项,可以看到,有表的行数、列数、颜色、字体、字号等等格式。

另外标题和边框可以选择或者不选。

选择完成后单击新建按钮就可以看到下图完成的新表了。

是不是很简单。

当然,数据还是要自己录入,不过后续有时间,也可以完成数据录入的功能。

vba新建指定名称工作表(VBA自动创建工作表)(2)

下图为换了一种格式的新建表。

如果是这样简单的二维表创建,那么使用这样的方法,在很短的时间内可以完成很多个表新建,实际上完全可以增加一行代码一次新建多个相同的表。

本示例就不展示出来了。

vba新建指定名称工作表(VBA自动创建工作表)(3)

重点看一下代码实现方法

图中的控件使用了解代码创建,如下代码所示:

Private Sub setListLabelAndText()'添加Label和ComboBoxr控件 i = 0 For Each x In xArr Set xobj = Me.Controls.Add("Forms.Label.1") With xobj .Height = 28 .Top = i * .Height Me.Label1.Top Me.Label1.Height 10 .Left = 120 .Width = 60 .Caption = x End With Set tobj = Me.Controls.Add("Forms.ComboBox.1", x) With tobj .Height = xobj.Height - 4 .Top = xobj.Top - 2 .Left = xobj.Left xobj.Width 10 .Width = 280 .BorderStyle = 1 .BorderColor = RGB(211, 211, 211) If i = 6 Then .List = fArr '字体 Else .List = lArr End If .Value = 1 .Style = 2 End With If VBA.InStr(1, x, "颜色") <> 0 Then ComChangeC(i).inic tobj End If i = i 1 Next x For Each t In tArr Set xobj = Me.Controls.Add("Forms.Label.1") With xobj .Height = 28 .Top = i * .Height Me.Label1.Top Me.Label1.Height 10 .Left = 120 .Width = 60 .Caption = t End With Set tobj = Me.Controls.Add("Forms.TextBox.1", t) With tobj .Height = xobj.Height - 4 .Top = xobj.Top - 2 .Left = xobj.Left xobj.Width 10 .Width = 230 .BorderStyle = 1 .BorderColor = RGB(211, 211, 211) .Value = "新建工作表标题名称" End With i = i 1 Next t i = 1 For Each o In oArr Set oobj = Me.Controls.Add("Forms.CheckBox.1", o) With oobj .Height = tobj.Height .Top = tobj.Top (tobj.Height 2) * i .Left = tobj.Left .Width = 80 .Caption = o .Value = True End With Clk(i).inic oobj i = i 1 Next o Set xobj = Nothing Set tobj = Nothing Set oobj = Nothing End Sub

vba新建指定名称工作表(VBA自动创建工作表)(4)

本例中还新建了两个类模块,一个是ComboBox的Change事件,另一个是CheckBox的Click事件。

由于是动态新建的控件,事件也要动态引入。

ComboBox类模块代码:

Option Explicit Public WithEvents cli As MSForms.ComboBox Public Sub inic(bt As MSForms.ComboBox) Set cli = bt End Sub Private Sub cli_Change() ActiveSheet.Range("A1").Interior.ColorIndex = cli.Value Dim cx cx = ActiveSheet.Range("A1").Interior.Color cli.BackColor = cx End Sub

CheckBox类模块代码:

Option Explicit Public WithEvents cli As MSForms.CheckBox Public Sub inic(bt As MSForms.CheckBox) Set cli = bt End Sub Private Sub cli_Click() Select Case cli.Caption Case oArr(0) '表头 If cli.Value Then SetCombTrueOrFalse tArr(0), True Else SetCombTrueOrFalse tArr(0), False End If Case oArr(1) '标题 If cli.Value Then SetCombTrueOrFalse xArr(4), True Else SetCombTrueOrFalse xArr(4), False End If End Select End Sub Private Sub SetCombTrueOrFalse(xStr As Variant, xBoolean As Boolean) For Each xobj In cli.Parent.Controls If xobj.Name = xStr Then xobj.Value = "" xobj.Enabled = xBoolean Exit For End If Next xobj End Sub

Form窗体代码还是比较多,也就是一些控件属性设置,不贴出来了。

最重要的一段代码为按钮代码:

Private Sub CommandButton1_Click() '新建工作表 For Each xobj In Me.Controls If TypeName(xobj) = "ComboBox" Then If VBA.Len(xobj) = 0 Then MsgBox "信息不能为空值!", vbInformation, "提示": Exit Sub For i = 0 To UBound(xArr) If xArr(i) = xobj.Name Then If VBA.Len(xobj) <> 0 And i <> 6 Then yArr(i) = VBA.CInt(xobj.Value) ElseIf VBA.Len(xobj) <> 0 And i = 6 Then yArr(i) = VBA.CStr(xobj.Value) Else yArr(i) = 0 End If End If Next i End If If TypeName(xobj) = "TextBox" Then For i = i To UBound(tArr) i If tArr(i - i) = xobj.Name Then ReDim Preserve yArr(i) yArr(i) = xobj.Value End If Next i End If Next xobj MsgBox Join(yArr) Dim s As Worksheet, r As Range Set s = ThisWorkbook.Worksheets.Add(before:=Sheets(1)) s.UsedRange.Clear Set r = s.Range(s.Cells(1, 1), s.Cells(yArr(1), VBA.CInt(yArr(0)))) With r .Interior.ColorIndex = yArr(2) .Font.ColorIndex = yArr(3) .RowHeight = yArr(5) .Font.Name = yArr(6) .Font.Size = yArr(7) End With If VBA.Len(yArr(4)) <> 0 Then '如果有边框 r.Borders.LineStyle = 1 r.Borders.ColorIndex = yArr(4) Else r.Borders.LineStyle = 0 End If If VBA.Len(yArr(8)) <> 0 Then '如果有标题 s.Rows(1).Insert shift:=xlUp s.Range("A1").Resize(1, yArr(0)).Merge With s.Range("A1") .VerticalAlignment = xlCenter .HorizontalAlignment = xlCenter .Value = yArr(8) End With End If End Sub

严格来说,每一段代码都十分重要,没有哪一段也不能完全实现过程,重点并不是代码如何进行排列,问题是要对整个流程进行一个清晰的认识。

当对整个流程完全了解之后,用这些字母来创建一个过程,那么就把一个实用的功能变成了事实,编程就是一个创建世界的过程,只不过把每一个时间片段分开来研究,编码之后变成真实的再现罢了。

欢迎关注、收藏

---END---

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页