恩皮西硬核数值表(一)目录
知乎:胖子策划恩皮西
一般情况下一个项目设计数值表也是从目录开始做起,但是在真正做表之前一般会对系统结构和项目定位先做清楚,但是为了方便看表格,我还是先说一下目录。
目录的存在主要是为了自己方便,也是升级了几个版本,最原始,只是表格加上链接,让我快速的找到对应的表格。是下面这个样子的。
但是很快,当表格数量扩张的时候,它就不够方便了,于是自己做了一个目录。就变成下面这个样子了。
这个目录分为几块,主要功能就一个,快速找到对应的表。。以及一些功能按钮。我逐一介绍,如果涉及到其他部分的功能,会在后续的文章中讲解。
一:顶部功能区
就是这一部分。
1.1左边三个按钮
是为了查看表格汇总使用的,第一个按钮用于打开三个汇总sheet。分别为
在项目后期他们的用处就很小了。
第一个表格基本就是罗列了这里面的所有sheet。
你可以看到我甚至做了欢迎界面
如果你够好奇的话,我把欢迎界面也给大家看下
这是一个毫无卵用的页面,我用了2个页面,通过代码控制,可以让2个界面互相切换,可以让“她”动起来。然而这玩意不仅毫无卵用,还很浪费性能,影响表格打开速度,后面就被我干掉了。这是个插曲。
接下来说字段管理表,这个稍微有点用处,它把真个表里的每个字段都展示出来,可以检查一些字段命名错误或者表格格式错误。表格格式我稍后讲到,因为没有一个规范的表格格式,是没法做出目录的。
这里可以看到,我给每个字段设计了一个唯一识别号,是表格名称(不是sheet名称)加上字段名称实现的,这个可以帮我们快速找到指定的字段,后期其他工具对应指定字段的查找也是有用的。
最后一个表格关系表,就没什么用了。就不介绍了。原本是像做一个网状的表格引用关系的可视化图,后来没有时间去实现,对于项目本身也没有什么用处。
1.2启动右键功能
因为右键的功能是基于excel的,而不是基于表格的,所以在更换电脑使用表格时,会没法使用右键的功能。所以增加了这个按钮。右键我通常会增加一些使用频率很高的功能。
可以看到,这里有工具箱,信息,编辑文案,显示路径,文案配色,识别号跳转等功能更,这些功能我在后面会介绍。
1.3更新客户端svn
不管你在什么项目组,总会有一个版本管理工具,可能是svn,可能是git,你总要反复更新,使用频率很高,这里做成一个按钮,方便使用。功能很简单。代码非常简单,但是你要安装svn的时候安装命令行工具才能使用,在安装的时候有一个选项,没有的话重装一下就好了
代码如下。
Sub 更新SVN客户端() code = "cmd.exe /c svn update " & "D:\SVN\Galaxy\client" & "&& pause" Call Shell(code) End Sub
二.中央功能功能区
中央功能区的关键功能只有一个,找到核心表格,这块代码稍微难写一点,可能是我没有找到好写的方法,好在只用写一次,对效率要求也不高,代码不好就算了。
左边三个区域,总表,规划,查看器,规划表,都是手动设置的连接到指定的sheet的。点击就打开,代码也非常简单。
Sub 查看器() 开关某页BYstring ("飞船查看器") 开关某页BYstring ("飞船查看器2") 开关某页BYstring ("怪物查看器") 开关某页BYstring ("英雄查看器") End Sub Function 开关某页BYstring(i As String) If Workbooks(ThisWorkbook.name).Sheets(i).Visible = xlSheetVisible Then Workbooks(ThisWorkbook.name).Sheets(i).Visible = xlSheetHidden Else Workbooks(ThisWorkbook.name).Sheets(i).Visible = xlSheetVisible Workbooks(ThisWorkbook.name).Sheets(i).Select End If End Function
基本就是显示出来。右边的区域就稍微复杂一点,首先,把表格分类为系统。在中间区域把所有的系统显示出来。然后实现,点击,在右边把该系统的所有表格显示出来。
这些代码稍微有些复杂。
在实现这个功能之前,我们需要对表格有一定的规范要求。你可以制定自己的规范标准,我在这里说下我是如何制定的。
我的每个数据表大致是这样的。
1. 设置返回按钮,功能为隐藏该sheet
2. 设置到处按钮,功能为到处数据成制定文件,这里是csv到指定的文件夹给程序使用,它同时包含了提交功能,会自动提交到svn,这部分在导出部分再说。
3. 提供说明信息按钮,点击后跳转到一个说明sheet对这个表格进行说明,稍后展示,主要是说明这个表格的规范,枚举等。
4. 表格名称,它固定的在B1单元格
5. 系统名称,它固定在D1单元格
6. 表格类型,它固定在F1单元格
7. 预留行4,第四行为字段类型,在后面会用到,说明字段的内容。主要有,功能,文案(做多语言时需要),美术(改动频率较低),数值(改动频率较高)
8. 预留行5,这是一个外键,和格式说明,如果这个字段来自其他表格,这里要说明,如
这里可以看到,这个字段应该填写4个技能id,前三个来自主动技能ID,最后一个来自被动技能ID,这里填写的数据应该在对应的表格对应的字段找到,不然你就填错了。
9. 预留行6,对于外键的中文说明。基本上是对预留行5的中文解释
10. 预留行7,这是字段的标准名称,它是被程序识别的名称,也是从这一行起,后面才是到处的数据内容。
11. 预留行8,这里是字段的中文名称,主要是帮助理解。
12. 预留行9,这里是字段的类型,程序识别用,自己也会识别,有可能会存在和程序商议的特殊字符格式。
13. 后续的才是表格的数据内容。
关于规范3,我们这个例子是英雄表,英雄表的说明是这样的
这里束缚了某些字段能填的值和意义。这里必须记录,不然会完全忘记,例如种族,我们能填写0-4,但是含义很容易忘记,如果及时的更新在说明表里,就可以任何时候查看。
基于上面的表格格式,我们可以遍历整个数据表,找出所有的系统和所有的表格。
先看刷新目录,它的功能是删掉前面的系统标签,然后遍历整个表,重新生成所有的系统标签。下面是刷新目录按钮的代码。
Sub 自动化目录() num = 1 Dim 系统字典 Set 系统字典 = CreateObject("Scripting.Dictionary") Dim 系统 As Worksheet For Each 系统 In ActiveWorkbook.Sheets If 系统字典.exists(系统.Range("D1").Value) Then ElseIf 系统.Range("D1").Value = "" Then Else 系统字典.Add 系统.Range("D1").Value, num num = num + 1 End If Next '清除原有按钮 For Each s In ActiveWorkbook.Sheets("目录和说明").Shapes If 系统字典.exists(s.name) Then s.Delete Else 's.Delete End If Next num2 = 1 按钮行数 = 7 '这段代码有毒 For Each a In 系统字典 If (a = "") Then Else ' '位置X,位置Y,宽,高 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 250 + 120 * Int((num2 - 1) / 按钮行数), 140 + 32 * ((num2 - 1) Mod 按钮行数), 100, 25) _ .Select 'Selection.OnAction = "'打开系统""" & (a) & """'" Selection.ShapeRange.ShapeStyle = msoShapeStylePreset13 Selection.ShapeRange(1).OnAction = "自动化分级目录" Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = a With Selection.ShapeRange(1).TextFrame2.TextRange.Font .NameComplexScript = "微软雅黑" .NameFarEast = "微软雅黑" .name = "微软雅黑" End With Selection.ShapeRange(1).name = a End If 'message = message & a & vbLf num2 = num2 + 1 Next End Sub
这样就能够生成一个中间的系统列表标签了。如下
很古老的代码了,我后续的项目也在沿用,代码都不需要修改。刷新目录按钮给后续的系统页签增加了OnAction = "自动化分级目录"功能,这段代码我也贴出来,它是为了实现点击系统页签展示页面页签存在的。
Sub 自动化分级目录() '************获取系统名称******************************** c = Application.Caller ActiveSheet.Shapes(c).Select 系统名 = Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text '******************************************************** '**************搜索表格********************************** Dim 表格字典 Set 表格字典 = CreateObject("Scripting.Dictionary") Dim 表格总字典 Set 表格总字典 = CreateObject("Scripting.Dictionary") Dim 表格管理区域 As Range Set 表格管理区域 = ActiveWorkbook.Sheets("表格管理表").Range("A10:E500") For Each 表格 In ActiveWorkbook.Sheets If 表格.Cells(1, 4).Value = 系统名 Then 表格字典.Add 表格.name, 表格.Cells(1, 4).Value Else End If If 表格总字典.exists(表格.name) Then Else 表格总字典.Add 表格.name, 表格.Cells(1, 4) End If Next num2 = 1 按钮行数 = 15 '*******************清除原有按钮************************* For Each s In ActiveWorkbook.Sheets("目录和说明").Shapes If 表格总字典.exists(s.name) Then s.Delete Else 's.Delete End If Next '******************************************************** '********************************************************* '这段代码有毒 ' ActiveSheet.Shapes.AddShape(msoShapeRectangle, 780, 100, 100, 23) _ ' .Select ' 'Selection.OnAction = "'打开系统""" & (a) & """'" ' ' ' Selection.ShapeRange.ShapeStyle = msoShapeStylePreset16 ' Selection.ShapeRange(1).OnAction = "打开系统" ' Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "打开全部" ' Selection.ShapeRange(1).Name = 系统名 ActiveSheet.Range("o6").Value = 系统名 Dim MyT As Long MyT = timeGetTime For Each a In 表格字典 If (a = "") Then Else '位置X,位置Y,宽,高 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 650 + 180 * Sin(num2 * 3.165 / 20 + 3.14 / 5), 250 - 200 * Cos(num2 * 3.14 / 20 + 3.14 / 5), 120, 25) _ .Select 'Selection.OnAction = "'打开系统""" & (a) & """'" Selection.ShapeRange(1).IncrementRotation -50 + num2 * 8 Selection.ShapeRange.ShapeStyle = msoShapeStylePreset17 Selection.ShapeRange(1).OnAction = "打开表格" Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = a Selection.ShapeRange(1).name = a With Selection.ShapeRange(1).TextFrame2.TextRange.Font .NameComplexScript = "微软雅黑" .NameFarEast = "微软雅黑" .name = "微软雅黑" End With End If 'message = message & a & vbLf num2 = num2 + 1 'Do 'DoEvents 'Loop Until timeGetTime - MyT >= num2 ' 等于 5000/1000 = 5 秒 Next ActiveSheet.Range("A1").Select End Sub
这样就能够实现中右部分的功能了。如下:
代码里有一段被我注释了这段代码有毒的代码,那段代码在逻辑上似乎是正确的,但是会导致excel无法保存。我研究很久也没弄清楚是为什么,假装它是一个excel存在的关于图片的bug,然后我采用了另一种方法实现,不过有兴趣的可以研究一下,然后找到原因给我留言。
三:底部功能区
这部分主要是储存和设置一些文件路径,给svn和导出使用的,增加了一个方便更改的按钮。主要是其他同事在使用表格的时候,本机的路径和你的不一样,就无法正确使用到处和svn相关功能,所以增加了这部分。
好了到这里基本介绍完了全部的目录相关的功能。