世博游戏主管怎样修改带娱乐的Excel电脑制表格步骤带图

&p&没有过时呀。有个小伙伴一直问我考勤系统脚本的代码。我在这里分享出来。&/p&&p&写这个脚本的背景是CTO和HR商量了下,整个信息中心和业务部门分开做考勤规则。&/p&&p&我们的考勤系统只是记录打卡,但不会判断迟到、漏打卡、加班等等的规则。&/p&&p&之前也是一个程序员帮HR写的程序,此次复杂度加倍。CTO问各位研发总监有木有人要开发下。&/p&&p&无人回应。&/p&&p&做数据的我,弱弱的举了小爪,说我可以帮忙写下。&/p&&p&花了半天就写好了,还设想了各种遇到的情况。HR惊叹于我的速度,说上个程序员花了两周...我汗颜。&/p&&p&HR们,如果还在为考勤烦恼,以下可以下载下来&/p&&p&百度网盘:链接:&a href=&///?target=http%3A///s/1pLuRwoj& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1pLuRwo&/span&&span class=&invisible&&j&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:w47g&/p&&p&以下截图,我的代码都详细写好了注释。大家可以按照注释修改&/p&&img data-rawheight=&660& src=&/v2-4b366ac449a1a77a5f23d636ce70b512_b.png& data-rawwidth=&1355& class=&origin_image zh-lightbox-thumb& width=&1355& data-original=&/v2-4b366ac449a1a77a5f23d636ce70b512_r.png&&&p&&br&&/p&&img data-rawheight=&711& src=&/v2-d5e8daefd355d90e209eb6f7ff4a9e2b_b.png& data-rawwidth=&719& class=&origin_image zh-lightbox-thumb& width=&719& data-original=&/v2-d5e8daefd355d90e209eb6f7ff4a9e2b_r.png&&&p&&br&&/p&&img data-rawheight=&732& src=&/v2-67db90bc3e95ef74b74e61b365e8c904_b.png& data-rawwidth=&723& class=&origin_image zh-lightbox-thumb& width=&723& data-original=&/v2-67db90bc3e95ef74b74e61b365e8c904_r.png&&&p&代码如下:&/p&&p&Sub Organize_Attendance()&/p&&p&On Error Resume Next&/p&&p&Application.ScreenUpdating = False&/p&&p&Dim Cus_FirstDay As Date, Cus_Lastday As Date, abcd As Date, Cus_Days, St2_Row, Arr_Pointer, Arr_Pointer2&/p&&p&Dim Sht, St1, St2, St3&/p&&p&Dim Arr(0 To 31000, 1 To 14), Date1, Date2, Date3, Record, Date4, Name&/p&&p&&br&&/p&&p&'整理表页名称,用于判断是否缺失&/p&&p&txt = &&&/p&&p&a = 0&/p&&p&b = 0&/p&&p&c = 0&/p&&p&For Each Sht In Sheets&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &控制表格& Then a = 1&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &出勤记录& Then b = 1&/p&&p&
If &a href=&///?target=http%3A//sht.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sht.Name&i class=&icon-external&&&/i&&/a& = &输出表格& Then c = 1&/p&&p&Next&/p&&p&&br&&/p&&p&'查找是否有“控制表格”和“出勤记录”两张表&/p&&p&If a && 1 And b = 1 Then&/p&&p&
txt = &没有找到控制表格表页&&/p&&p&ElseIf a = 1 And b && 1 Then&/p&&p&
txt = &没有找到出勤记录表页&&/p&&p&ElseIf a && 1 And b && 1 Then&/p&&p&
txt = &没有找到控制表格、出勤记录表页&&/p&&p&End If&/p&&p&&br&&/p&&p&If txt && && Then&/p&&p&
MsgBox (txt)&/p&&p&
Exit Sub&/p&&p&End If&/p&&p&&br&&/p&&p&'如果有输出表格,则进行清空,如果没有新建一个&/p&&p&If c = 1 Then&/p&&p&
Sheets(&输出表格&).Cells.Delete&/p&&p&Else&/p&&p&
Sheets.Add&/p&&p&&a href=&///?target=http%3A//activesheet.name/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ActiveSheet.Name&i class=&icon-external&&&/i&&/a& = &输出表格&&/p&&p&End If&/p&&p&&br&&/p&&p&Set St1 = Sheets(&控制表格&)&/p&&p&Set St2 = Sheets(&出勤记录&)&/p&&p&Set St3 = Sheets(&输出表格&)&/p&&p&&br&&/p&&p&'定义表头内容&/p&&p&Arr(0, 1) = &工号&&/p&&p&Arr(0, 2) = &姓名&&/p&&p&Arr(0, 3) = &单位名称&&/p&&p&Arr(0, 4) = &考勤日期&&/p&&p&Arr(0, 5) = &班次&&/p&&p&Arr(0, 6) = &上班&&/p&&p&Arr(0, 7) = &下班&&/p&&p&Arr(0, 8) = &是否跨天&&/p&&p&Arr(0, 9) = &在司时间&&/p&&p&Arr(0, 10) = &是否足够9小时&&/p&&p&Arr(0, 11) = &考勤是否合理&&/p&&p&Arr(0, 12) = &是否缺勤&&/p&&p&Arr(0, 13) = &备注&&/p&&p&&br&&/p&&p&'定义节假日、倒休等特殊日期字典&/p&&p&Set Date1 = CreateObject(&Scripting.Dictionary&)&/p&&p&Set Date2 = CreateObject(&Scripting.Dictionary&)&/p&&p&Set Date3 = CreateObject(&Scripting.Dictionary&)&/p&&p&For Each Rng In St1.Range(&H2:H& & St1.Range(&H65536&).End(xlUp).Row)&/p&&p&
Date1.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&For Each Rng In St1.Range(&I2:I& & St1.Range(&I65536&).End(xlUp).Row)&/p&&p&
Date2.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&For Each Rng In St1.Range(&J2:J& & St1.Range(&J65536&).End(xlUp).Row)&/p&&p&
Date3.Add Rng.Value, Rng.Value&/p&&p&Next&/p&&p&&br&&/p&&p&'记录出勤记录行数&/p&&p&St2_Row = St2.Range(&A65536&).End(xlUp).Row&/p&&p&&br&&/p&&p&'定义月份第一天,当月天数&/p&&p&'Cus_FirstDay = DateSerial(St1.[b2].Value, St1.[b3].Value, 1)&/p&&p&'Cus_Lastday = DateSerial(St1.[b2].Value, St1.[b3].Value + 1, 0)&/p&&p&&br&&/p&&p&For i = 2 To St2_Row&/p&&p&
abcd = St2.Cells(i, 4).Value&/p&&p&
If Cus_FirstDay = #12:00:00 AM# Or Cus_FirstDay & abcd Then&/p&&p&
Cus_FirstDay = abcd&/p&&p&
End If&/p&&p&
If Cus_Lastday = #12:00:00 AM# Or Cus_Lastday & abcd Then&/p&&p&
Cus_Lastday = abcd&/p&&p&
End If&/p&&p&Next&/p&&p&Cus_Days = DateDiff(&d&, Cus_FirstDay, Cus_Lastday) + 1&/p&&p&&br&&/p&&p&'定义当月班次数组&/p&&p&ReDim Date4(1 To Cus_Days, 1 To 2)&/p&&p&For i = 1 To Cus_Days&/p&&p&
a = DateAdd(&d&, i - 1, Cus_FirstDay)&/p&&p&
Date4(i, 1) = a&/p&&p&
If Date1.Exists(a) Then&/p&&p&
Date4(i, 2) = &三倍节假日&&/p&&p&
ElseIf Date2.Exists(a) Then&/p&&p&
Date4(i, 2) = &周末&&/p&&p&
ElseIf Date3.Exists(a) Then&/p&&p&
Date4(i, 2) = &工作日&&/p&&p&
ElseIf WorksheetFunction.Weekday(a, 2) = 6 Then&/p&&p&
Date4(i, 2) = &周六&&/p&&p&
ElseIf WorksheetFunction.Weekday(a, 2) = 7 Then&/p&&p&
Date4(i, 2) = &周日&&/p&&p&
Else&/p&&p&
Date4(i, 2) = &工作日&&/p&&p&
End If&/p&&p&Next&/p&&p&&br&&/p&&p&'定义员工工号字典&/p&&p&Set Name = CreateObject(&Scripting.Dictionary&)&/p&&p&&br&&/p&&p&'定义当前员工第一行指针&/p&&p&Arr_Pointer = -Cus_Days&/p&&p&&br&&/p&&p&'开始按照出勤记录每行循环处理数据,记录工号、姓名、公司、班次、日期、上下班时间、是否跨天的数据&/p&&p&For i = 2 To St2_Row&/p&&p&
'将出勤记录当前行转换为数组&/p&&p&
Record = WorksheetFunction.Transpose(WorksheetFunction.Transpose(St2.Range(&A& & i & &:E& & i).Value))&/p&&p&
'检测是否是录入过该员工&/p&&p&
If Not Name.Exists(Record(1)) Then&/p&&p&
'如果是第一次录入,增加工号字典,更改第一行指针,在数组内添加该员工一整月天数的前5列数据&/p&&p&
Name.Add Record(1), Record(1)&/p&&p&
Arr_Pointer = Arr_Pointer + Cus_Days&/p&&p&
For n = 1 To Cus_Days&/p&&p&
Arr(Arr_Pointer + n, 1) = Record(1)&/p&&p&
Arr(Arr_Pointer + n, 2) = Record(2)&/p&&p&
Arr(Arr_Pointer + n, 3) = Record(3)&/p&&p&
Arr(Arr_Pointer + n, 4) = Date4(n, 1)&/p&&p&
Arr(Arr_Pointer + n, 5) = Date4(n, 2)&/p&&p&
Next&/p&&p&
End If&/p&&p&&br&&/p&&p&
'判断时间属性,填入数组&/p&&p&
Arr_Pointer2 = Arr_Pointer + Day(St2.Cells(i, 4).Value)&/p&&p&
If St2.Cells(i, 5).Value &= TimeValue(&13:00:00&) Then '如果打卡时间超过13点&/p&&p&
If Arr(Arr_Pointer2, 7) = && Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 7) & St2.Cells(i, 5).Value Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组的记录小于单元格,则将单元格写入数组(下班打卡取较大数据)&/p&&p&
End If&/p&&p&
ElseIf St2.Cells(i, 5).Value & TimeValue(&6:00:00&) Then '如果打卡时间早于6点&/p&&p&
If Day(Record(4)) = 1 Then&/p&&p&
Arr(Arr_Pointer2, 13) = &上个月末最后一天有加班&&/p&&p&
Else&/p&&p&
Arr_Pointer2 = Arr_Pointer2 - 1 '指针时间提前一天&/p&&p&
If Arr(Arr_Pointer2, 7) = && Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 7) &= TimeValue(&13:00:00&) Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里的记录是前一天晚上的记录,则将单元格写入数组(凌晨打卡要晚于前一天晚上)&/p&&p&
ElseIf St2.Cells(i, 5).Value & Arr(Arr_Pointer2, 7) Then&/p&&p&
Arr(Arr_Pointer2, 7) = St2.Cells(i, 5).Value '如果数组里的记录是凌晨的,并且小于单元格,则将单元格写入数组(下班打卡取较大数据)&/p&&p&
End If&/p&&p&
Arr(Arr_Pointer2, 8) = &是&&/p&&p&
End If&/p&&p&
Else '如果打卡时间介于6点到13点&/p&&p&
If Arr(Arr_Pointer2, 6) = && Then&/p&&p&
Arr(Arr_Pointer2, 6) = St2.Cells(i, 5).Value '如果数组里还没有记录,则将单元格写入数组&/p&&p&
ElseIf Arr(Arr_Pointer2, 6) & St2.Cells(i, 5).Value Then&/p&&p&
Arr(Arr_Pointer2, 6) = St2.Cells(i, 5).Value '如果数组的记录大于单元格,则将单元格写入数组(上班打卡取较小数据)&/p&&p&
End If&/p&&p&
End If&/p&&p&Next&/p&&p&&br&&/p&&p&For i = 1 To Arr_Pointer + Cus_Days&/p&&p&
'备注周末or节假日&/p&&p&'
If Arr(i, 5) = &周末& Or Arr(i, 5) = &三倍节假日& Then&/p&&p&'
If Arr(i, 6) = && And Arr(i, 7) = && Then Arr(i, 13) = Arr(i, 13) & & 周末or节假日 &&/p&&p&'
End If&/p&&p&
'如果上下班都有时间,则填充在司时间&/p&&p&
If Arr(i, 6) && && And Arr(i, 7) && && Then&/p&&p&
If Arr(i, 8) = &是& Then&/p&&p&
Arr(i, 9) = Arr(i, 7) + 1 - Arr(i, 6)&/p&&p&
Else&/p&&p&
Arr(i, 9) = Arr(i, 7) - Arr(i, 6)&/p&&p&
End If&/p&&p&
Arr(i, 9) = Application.WorksheetFunction.RoundDown(Arr(i, 9) * 24, 2)&/p&&p&
If Arr(i, 9) &= 9 Then Arr(i, 10) = &是&&/p&&p&
End If&/p&&p&
'判断是否缺上下班打卡记录&/p&&p&
If Arr(i, 5) = &工作日& Then&/p&&p&
'判断总部考勤是否合理&/p&&p&
If Arr(i, 3) = &总部& Then&/p&&p&
If Arr(i, 6) = && And Arr(i, 7) = && Then&/p&&p&
Arr(i, 12) = &缺勤&&/p&&p&
ElseIf Arr(i, 6) = && Or Arr(i, 7) = && Then&/p&&p&
Arr(i, 12) = &漏打卡&&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&08:30:00&) And (Arr(i, 7) &= TimeValue(&17:30:00&) Or Arr(i, 7) &= TimeValue(&06:00:00&)) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&09:00:00&) And (Arr(i, 7) &= TimeValue(&18:00:00&) Or Arr(i, 7) &= TimeValue(&06:00:00&)) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
Else&/p&&p&
Arr(i, 11) = &迟到or早退&&/p&&p&
End If&/p&&p&
End If&/p&&p&
'判断金佰达考勤是否合理&/p&&p&
If Arr(i, 3) = &金佰达& Then&/p&&p&
'如果上下班都没打卡,前一天下班时间又不是晚于凌晨两点的,是缺勤&/p&&p&
If Arr(i, 6) = && And Arr(i, 7) = && Then&/p&&p&
If Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&06:00:00&) And Arr(i - 1, 7) &= TimeValue(&02:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
Else&/p&&p&
Arr(i, 12) = &缺勤&&/p&&p&
End If&/p&&p&
'如果上下班有一次没打卡,前一天下班时间又不是晚于凌晨两点的,是漏打一次卡&/p&&p&
ElseIf Arr(i, 6) = && Or Arr(i, 7) = && Then&/p&&p&
If Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&06:00:00&) And Arr(i - 1, 7) &= TimeValue(&02:00:00&) Then&/p&&p&
Else&/p&&p&
Arr(i, 12) = &漏打卡&&/p&&p&
End If&/p&&p&
'打卡时间早于8点半、晚于17点半是合理的&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&08:30:00&) And Arr(i, 7) &= TimeValue(&17:30:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'打卡时间早于8点半、并且下班跨天是合理的&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&08:30:00&) And Arr(i, 8) = &是& Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'打卡时间早于9点、在司时间大于9小时是合理的&/p&&p&
ElseIf Arr(i, 6) &= TimeValue(&09:00:00&) And Arr(i, 9) &= 9 Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'(同一个人)头一天晚上打卡时间介于2点到6点之间的是合理的&/p&&p&
ElseIf Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&06:00:00&) And Arr(i - 1, 7) &= TimeValue(&02:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'(同一个人)头一天晚上打卡时间介于0点到2点之间,第二天早晨早于13点,晚上晚于18点是合理的&/p&&p&
ElseIf Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) && && And Arr(i - 1, 7) & TimeValue(&02:00:00&) And _&/p&&p&
Arr(i, 6) &= TimeValue(&13:00:00&) And Arr(i, 7) &= TimeValue(&18:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'(同一个人)头一天晚上打卡时间晚于20点,第二天早晨早于9点20,晚上晚于18点是合理的&/p&&p&
ElseIf Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&20:00:00&) And _&/p&&p&
Arr(i, 6) &= TimeValue(&09:20:00&) And Arr(i, 7) &= TimeValue(&18:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
'(同一个人)头一天晚上打卡时间晚于22点,第二天早晨早于10点,晚上晚于18点是合理的&/p&&p&
ElseIf Arr(i - 1, 1) = Arr(i, 1) And Arr(i - 1, 7) &= TimeValue(&22:00:00&) And _&/p&&p&
Arr(i, 6) &= TimeValue(&10:00:00&) And Arr(i, 7) &= TimeValue(&18:00:00&) Then&/p&&p&
Arr(i, 11) = &合理&&/p&&p&
Else&/p&&p&
Arr(i, 11) = &迟到or早退&&/p&&p&
End If&/p&&p&
End If&/p&&p&
End If&/p&&p&&br&&/p&&p&Next&/p&&p&&br&&/p&&p&'设置输出表的格式&/p&&p&St3.Columns(&A:A&).NumberFormatLocal = &@&&/p&&p&St3.Columns(&D:D&).NumberFormatLocal = &[$-F800]dddd, mmmm dd, yyyy&&/p&&p&St3.Columns(&F:G&).NumberFormatLocal = &[$-F400]h:mm:ss AM/PM&&/p&&p&St3.Columns(&I:I&).Style = &Comma&&/p&&p&St3.Columns(&B:M&).ColumnWidth = 12&/p&&p&&br&&/p&&p&'结果数组输出到表格内&/p&&p&St3.Range(&A1:N& & Arr_Pointer + Cus_Days) = Arr()&/p&&p&&br&&/p&&p&'清除无打卡记录的休息日行&/p&&p&'St3.Columns(&N:N&).SpecialCells(xlCellTypeConstants, 23).EntireRow.Delete&/p&&p&&br&&/p&&p&Application.ScreenUpdating = True&/p&&p&&a href=&///?target=http%3A//st3.select/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&St3.Select&i class=&icon-external&&&/i&&/a&&/p&&p&St3.Range(&a2&).Select&/p&&p&ActiveWindow.FreezePanes = True&/p&&p&&br&&/p&&p&&br&&/p&&p&End Sub&/p&
没有过时呀。有个小伙伴一直问我考勤系统脚本的代码。我在这里分享出来。写这个脚本的背景是CTO和HR商量了下,整个信息中心和业务部门分开做考勤规则。我们的考勤系统只是记录打卡,但不会判断迟到、漏打卡、加班等等的规则。之前也是一个程序员帮HR写的程…
&img src=&/v2-f367b015c9f60cd4f36611_b.jpg& data-rawwidth=&950& data-rawheight=&570& class=&origin_image zh-lightbox-thumb& width=&950& data-original=&/v2-f367b015c9f60cd4f36611_r.jpg&&&p&上一篇偶然写了个a href=&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3D%26idx%3D1%26sn%3D7e9c0b3daab16f5f58bcec1%26chksm%3D8bb32fdfbcc4a6c94b1bf46bc2ff51b69e246f9e08cc1943aefb012%26scene%3D21%23wechat_redirect& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&mp./s?&/span&&span class=&invisible&&__biz=MzA5OTM1NDQwOA==&mid=&idx=1&sn=7e9c0b3daab16f5f58bcec1&chksm=8bb32fdfbcc4a6c94b1bf46bc2ff51b69e246f9e08cc1943aefb012&scene=21#wechat_redirect&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&& Excel 图表中的射线绘制技术,很受大家喜欢,错过的可以点链接查看。我想可以写几个这样的系列帖子,总结一些高级图表的高级技术。今天来说说 Excel 图表里超高级的鼠标悬停交互技术。&/p&&p&&br&&/p&&p&图表上的鼠标悬停交互技术,可以实现一种高级的选择器和交互手段,当用户把鼠标悬停在图表的某个元素、数据点上时,我们可以利用图表事件捕获到,并用这个结果去驱动一个动态图表,实现动态图表和交互效果。&/p&&p&&br&&/p&&p&在《经济学人的动态图表与交互设计》课程的第6章,鼠标滑过折线图的动态图表,就是一种悬停技术应用的形式。用户把鼠标在股市折线图上滑过,则动态显示当前数据点日期的相关数据,并图表中进行突出显示。这种滑过即选取的交互方式,非常轻盈,无需选择或者点击鼠标,体现的是一种数据灵动之美。&/p&&p&&br&&/p&&img src=&/v2-d36b87e825b8cd6dde8eb58f92985a7b_b.jpg& data-rawwidth=&1068& data-rawheight=&505& data-thumbnail=&/v2-d36b87e825b8cd6dde8eb58f92985a7b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1068& data-original=&/v2-d36b87e825b8cd6dde8eb58f92985a7b_r.gif&&&p&&br&&/p&&p&悬停技术是利用了Excel图表的 mouse_move 事件,实现过程比较复杂,我是在 J-walk 的《VBA编程宝典》这本书里学到的技术方法,运用到自己的图表形式,弄出各种各样的交互形式和效果。以下是书中的简单示例步骤,难度较大,高能预警。&/p&&p&&br&&/p&&img src=&/v2-8fead9bb58ed543e6b57310_b.jpg& data-rawwidth=&4032& data-rawheight=&3024& class=&origin_image zh-lightbox-thumb& width=&4032& data-original=&/v2-8fead9bb58ed543e6b57310_r.jpg&&&p&&br&&/p&&img src=&/v2-a5cce7dbf38a0c1630dfc5e_b.jpg& data-rawwidth=&4032& data-rawheight=&3024& class=&origin_image zh-lightbox-thumb& width=&4032& data-original=&/v2-a5cce7dbf38a0c1630dfc5e_r.jpg&&&p&&br&&/p&&p&vba新手不一定需要弄懂这些代码,老实说我也不是都弄懂了,我们能够依葫芦画瓢做出来就可以了。如果看不懂这两页纸又希望学会这个技术,可以参加经2季课程,学习第6章的视频讲解。PS:这个课程的难度较高,参加的话需要有一定基础和思想准备哦。&/p&&p&&br&&/p&&p&第7章也是这个技术的应用形式,是滑过折线图驱动一个动态仪表盘图表。&/p&&p&&br&&/p&&img src=&/v2-4cc71dd76e9bd17b0bdf63_b.jpg& data-rawwidth=&1016& data-rawheight=&455& data-thumbnail=&/v2-4cc71dd76e9bd17b0bdf63_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&/v2-4cc71dd76e9bd17b0bdf63_r.gif&&&p&&br&&/p&&p&利用这种悬停技术,可以做出类似切片钻取的交互操作。当然,在新一代的商业智能软件里,比如Tableau、PowerBI,基于同一个 cube 的多个图表之间,都是可以相互切片钻取的了,这就是软件越来越强大的地方。&/p&&p&&br&&/p&&p&不过,在适当的代价之内,在传统的 Excel 里做些这样的动态图表,还是不错的。下面贴几个 Excel 制作的鼠标滑过动态图表的应用范例,以供参考。&/p&&p&&br&&/p&&p&这是最近仿微信分析图表的一个图,鼠标滑过折线图突出显示数据点的动态图表,悬停时,小圆点、竖线、数据标签同时突出显示。&/p&&img src=&/v2-f367b015c9f60cd4f36611_b.jpg& data-rawwidth=&950& data-rawheight=&570& data-thumbnail=&/v2-f367b015c9f60cd4f36611_b.jpg& class=&origin_image zh-lightbox-thumb& width=&950& data-original=&/v2-f367b015c9f60cd4f36611_r.gif&&&p&这个例子里,上方还有鼠标滑过单元格的选项卡选择形式,这是一种单元格悬停交互技术,经2季课程里面也有详细介绍,我最喜欢的Excel技巧之一。&/p&&p&&br&&/p&&p&这是之前的一个范例,背后的浅色柱形图,既用来捕获鼠标,又用来突出显示当前选择对象,一举两得。&/p&&img src=&/v2-bf9c584e19e99bef00b458_b.jpg& data-rawwidth=&857& data-rawheight=&514& data-thumbnail=&/v2-bf9c584e19e99bef00b458_b.jpg& class=&origin_image zh-lightbox-thumb& width=&857& data-original=&/v2-bf9c584e19e99bef00b458_r.gif&&&p&&br&&/p&&p&这是以前仿NY的一个动态图表,鼠标滑过的小有多平板折线面积图,所有小图表上的小黑点、竖线、年份、标签一起同步流动,很有意思。这个之前有写过&u&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3D1033ceabd1eb160f13ec2%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&教程帖子&i class=&icon-external&&&/i&&/a&&/u&,范例文件链接也还在,可以下载。【提示:本帖下载资源在这个链接里】&/p&&img src=&/v2-4ddadeccc6_b.jpg& data-rawwidth=&1235& data-rawheight=&410& data-thumbnail=&/v2-4ddadeccc6_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1235& data-original=&/v2-4ddadeccc6_r.gif&&&p&&br&&/p&&p&将悬停技术和前面的射线技术结合起来,则可以制作下面的动态图表,鼠标悬停突出显示的射线地图。这个比较复杂,暂时没空写贴讲解,有兴趣的朋友可以自行研究。&/p&&img src=&/v2-fd3a46d682e_b.jpg& data-rawwidth=&818& data-rawheight=&870& data-thumbnail=&/v2-fd3a46d682e_b.jpg& class=&origin_image zh-lightbox-thumb& width=&818& data-original=&/v2-fd3a46d682e_r.gif&&&p&&br&&/p&&p&&br&&/p&&p&看了这些鼠标滑过的动态图表范例,是不是觉得这种交互形式很好很强大?是的,一旦学会了这种技术,你可以 DIY 出很多新颖的动态图表交互形式。也不需要记住方法步骤代码,有一个范例文件用来依葫芦画瓢就可以了。&/p&&p&&br&&/p&&p&经2季课程,《经济学人的动态图表与交互设计》,是 用 Excel DIY 出经济学人交互风格的动态表,用到宏,难度略高,但与效果确实众不同,BIGGER高,有兴趣点击【阅读原文】学习。&/p&&p&&br&&/p&&p&&b&Excel
可视化&/b&&/p&&p&尽在 Excel 图表之道,点击&a href=&/?target=http%3A///provider/1536580/index.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阅读原文&i class=&icon-external&&&/i&&/a&立即学习&/p&&img src=&/v2-d5d4caad86f_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-d5d4caad86f_r.png&&&p&&/p&&p&&/p&
上一篇偶然写了个a href=""& Excel 图表中的射线绘制技术,很受大家喜欢,错过的可以点链接查看。我想可以写几个这样的系列帖子,总结一些高级图表的高级技术。今天来说说 Excel 图表里超高级的鼠标悬停交互技术。 图表上的鼠标悬停交…
&img src=&/v2-d1a16a6b633bf6c53e5af_b.jpg& data-rawwidth=&640& data-rawheight=&427& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-d1a16a6b633bf6c53e5af_r.jpg&&&p&
前一期为大家介绍了如何激活工作簿,今天为大家介绍如何创建新的工作簿。&br&&/p&&p&
在VBE宏编辑器里面创建新的工作簿,需要使用Add方法,新建一个xlsm工作簿,插入一个新的模块,输入如下代码,即可创建一个新的工作簿。&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&CreateWorkbook&/span&&span class=&p&&()&/span&
&span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Add&/span&
&span class=&n&&MsgBox&/span& &span class=&n&&ActiveWorkbook&/span&&span class=&p&&.&/span&&span class=&n&&Name&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&
详细演示如下:&/p&&img src=&/v2-939aa216eae2fbd156ef6_b.jpg& data-rawwidth=&1089& data-rawheight=&745& data-thumbnail=&/v2-939aa216eae2fbd156ef6_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1089& data-original=&/v2-939aa216eae2fbd156ef6_r.gif&&&p&&br&&/p&&p&
通过如上代码的演示,在复制完代码到模块1后,按下键盘上的&b&F5键&/b&即可执行CreateWorkbook过程,该宏执行完毕后,Excel自动将该工作簿命名为【&b&工作簿N&/b&】,其中N是下一个可用的数字,并且新的工作簿会成为活动工作簿,也就是被激活了。&/p&&p&
虽然通过前面的代码可以快速创建一个新的工作簿,但如果想对该工作簿进行多项操作就没那么方便了,只能通过&b&ActiveWorkbook&/b&进行操作。有没有办法在创建工作簿后就设置文件名等信息呢?可以把创建工作簿赋值给一个&b&对象变量&/b&,这样使用对象变量就可以很容易地操作新工作簿了。&br&&/p&&p&&b&代码如下&/b&:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&AddWorkbook&/span&&span class=&p&&()&/span&
&span class=&k&&Set&/span& &span class=&n&&nBook&/span& &span class=&o&&=&/span& &span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Add&/span&
&span class=&k&&With&/span& &span class=&n&&nBook&/span&
&span class=&p&&.&/span&&span class=&n&&Title&/span& &span class=&o&&=&/span& &span class=&s&&&SUT事务所&&/span&
&span class=&p&&.&/span&&span class=&n&&Subject&/span& &span class=&o&&=&/span& &span class=&s&&&微信公众号:SaveUTime&&/span&
&span class=&p&&.&/span&&span class=&n&&SaveAs&/span& &span class=&n&&Filename&/span&&span class=&p&&:&/span&&span class=&o&&=&/span&&span class=&s&&&SUT.xlsx&&/span&
&span class=&k&&End&/span& &span class=&k&&With&/span&
&span class=&n&&MsgBox&/span& &span class=&n&&nBook&/span&&span class=&p&&.&/span&&span class=&n&&FullName&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&
其实上面的代码很好理解,把创建的工作簿对象赋值给&b&nBook&/b&,然后再设置工作簿对象的标题、主题和文件名,详细的演示如下:&/p&&img src=&/v2-68f266d59d20f03c61f6ee46b7f91cad_b.jpg& data-rawwidth=&1089& data-rawheight=&745& data-thumbnail=&/v2-68f266d59d20f03c61f6ee46b7f91cad_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1089& data-original=&/v2-68f266d59d20f03c61f6ee46b7f91cad_r.gif&&&p&&br&&/p&&p&
使用上面的代码,不仅可以设置工作簿名称,还可以设置该工作簿的属性,默认情况下,文件会根据【&b&文件&/b&】→【&b&Excel选项&/b&】→【&b&保存&/b&】中的【&b&默认本地文件位置&/b&】进行保存。&/p&&img src=&/v2-9f25189caa6a9_b.jpg& data-rawwidth=&836& data-rawheight=&678& class=&origin_image zh-lightbox-thumb& width=&836& data-original=&/v2-9f25189caa6a9_r.jpg&&&p&
为了更加直观的演示,在每一个宏的最后都加上了&b&MsgBox&/b&,用来显示工作簿名称以及工作簿&b&全路径&/b&。&/p&&p&
其实工作表的创建也是使用Add方法,只不过比工作簿多了增加的工作表显示位置,具体的使用方法在我的视频教程中都有讲解。当然,大家也可以参考工作簿的创建自行研究工作表的创建哦。&br&
今天的介绍就到这里了,更多VBA初学者教程,请关注下期图文教程。本文&b&素材&/b&可以在公众号回复“&b&&/b&”得到哦~后期文章附带的素材,大家都可以通过在公众号回复&b&该文档发送的日期&/b&得到,欢迎下载学习^_^Written by Steven in ^_^&/p&&p&&br&&/p&&p&&b&微信公众号:SaveUTime&/b&&/p&&p&&b&SUT学习交流群:,入群审核人:Steven&/b&&/p&&p&&b&关注公众号,提高效率,节约您的时间!&/b&&/p&
前一期为大家介绍了如何激活工作簿,今天为大家介绍如何创建新的工作簿。 在VBE宏编辑器里面创建新的工作簿,需要使用Add方法,新建一个xlsm工作簿,插入一个新的模块,输入如下代码,即可创建一个新的工作簿。Sub CreateWorkbook()
Workbooks.Add
&img src=&/v2-f2ba45e0ae1_b.jpg& data-rawwidth=&768& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&768& data-original=&/v2-f2ba45e0ae1_r.jpg&&&p&
前一期为大家介绍了如何创建新的工作簿,今天为大家介绍如何打开工作簿。&br&
在&b&VBE宏编辑器&/b&里面打开工作簿,需要使用&b&Open&/b&方法,新建一个&b&xlsm工作簿&/b&,插入一个新的模块,输入如下代码,即可打开一个工作簿。&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&OpenWorkbook&/span&&span class=&p&&()&/span&
&span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Open&/span& &span class=&p&&(&/span&&span class=&s&&&C:\Users\Steven\Desktop\Test1.xlsx&&/span&&span class=&p&&)&/span& &span class=&c&&'打开指定工作簿&/span&
&span class=&n&&MsgBox&/span& &span class=&n&&ActiveWorkbook&/span&&span class=&p&&.&/span&&span class=&n&&Name&/span& &span class=&c&&'显示打开工作簿名称&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&&b&详细演示&/b&如下:&/p&&img src=&/v2-6b5b41ba34eb3f15eff6d_b.jpg& data-rawwidth=&1078& data-rawheight=&765& data-thumbnail=&/v2-6b5b41ba34eb3f15eff6d_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-6b5b41ba34eb3f15eff6d_r.gif&&&p&
通过如上代码的演示,在复制完代码到模块1后,按下键盘上的&b&F5键&/b&即可执行OpenWorkbook过程,该宏执行完毕后,Excel自动打开名称为Test1.xlsx的工作簿,并且打开的工作簿会成为活动工作簿,也就是被激活了。&/p&&p&虽然通过前面的代码可以快速打开工作簿,但如果想对打开的工作簿进行多项操作就没那么方便了,只能通过&b&ActiveWorkbook&/b&进行操作。有没有办法在打开工作簿后很方便的操作工作簿呢?其实可以把打开的工作簿赋值给一个&b&对象变量&/b&,这样使用对象变量就可以很容易地操作工作簿了。&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&OpenWB&/span&&span class=&p&&()&/span&
&span class=&k&&Dim&/span& &span class=&n&&wBook&/span& &span class=&ow&&As&/span& &span class=&n&&Workbook&/span& &span class=&c&&'定义工作簿变量&/span&
&span class=&k&&Set&/span& &span class=&n&&wBook&/span& &span class=&o&&=&/span& &span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Open&/span&&span class=&p&&(&/span&&span class=&s&&&C:\Users\Steven\Desktop\Test2.xlsx&&/span&&span class=&p&&,&/span& &span class=&n&&Password&/span&&span class=&p&&:&/span&&span class=&o&&=&/span&&span class=&s&&&123456&&/span&&span class=&p&&)&/span& &span class=&c&&'打开带打开密码的指定工作簿&/span&
&span class=&n&&wBook&/span&&span class=&p&&.&/span&&span class=&n&&Sheets&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&).&/span&&span class=&n&&Range&/span&&span class=&p&&(&/span&&span class=&s&&&A1&&/span&&span class=&p&&)&/span& &span class=&o&&=&/span& &span class=&s&&&SUT事务所&&/span& &span class=&c&&'设置打开的工作簿中的第一个工作表A1单元格值&/span&
&span class=&n&&wBook&/span&&span class=&p&&.&/span&&span class=&n&&Save&/span& &span class=&c&&'保存工作簿&/span&
&span class=&n&&wBook&/span&&span class=&p&&.&/span&&span class=&n&&Close&/span& &span class=&c&&'关闭工作簿&/span&
&span class=&k&&Set&/span& &span class=&n&&wBook&/span& &span class=&o&&=&/span& &span class=&k&&Nothing&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&
其实上面的代码很好理解,先定义一个工作簿变量,再把打开的工作簿对象赋值给&b&wBook&/b&,然后再设置打开的工作簿中第一个工作表的A1内容,最后保存、关闭和清空对象。&b&详细的演示&/b&如下:&/p&&img src=&/v2-d3d314d8d8bdb1ab7243_b.jpg& data-rawwidth=&1078& data-rawheight=&765& data-thumbnail=&/v2-d3d314d8d8bdb1ab7243_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-d3d314d8d8bdb1ab7243_r.gif&&&p&
因为工作簿Test2.xlsx有&b&打开密码&/b&,密码为123456,在打开工作簿的时候,需要把密码一并带上,否则运行宏代码的时候,还会提示输入密码对话框。&/p&&img src=&/v2-8ba774e36faac_b.png& data-rawwidth=&358& data-rawheight=&220& class=&content_image& width=&358&&&p&
有些时候,需要同时打开多个指定的工作簿,可以通过如下的代码即可批量打开,代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&OpenWorkbooks&/span&&span class=&p&&()&/span&
&span class=&k&&On&/span& &span class=&k&&Error&/span& &span class=&k&&Resume&/span& &span class=&k&&Next&/span&
&span class=&k&&Dim&/span& &span class=&n&&SelectFiles&/span& &span class=&ow&&As&/span& &span class=&kt&&Variant&/span&
&span class=&c&&'显示打开文件对话框&/span&
&span class=&n&&SelectFiles&/span& &span class=&o&&=&/span& &span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&GetOpenFilename&/span&&span class=&p&&(&/span&&span class=&s&&&Excel 文件 (*.xl*),&&/span& &span class=&o&&&&/span& &span class=&s&&&*.xl*&&/span&&span class=&p&&,&/span& &span class=&p&&,&/span& &span class=&s&&&打开&&/span&&span class=&p&&,&/span& &span class=&p&&,&/span& &span class=&k&&True&/span&&span class=&p&&)&/span&
&span class=&c&&'未选择&/span&
&span class=&k&&If&/span& &span class=&n&&TypeName&/span&&span class=&p&&(&/span&&span class=&n&&SelectFiles&/span&&span class=&p&&)&/span& &span class=&o&&=&/span& &span class=&s&&&Boolean&&/span& &span class=&k&&Then&/span&
&span class=&k&&Exit&/span& &span class=&k&&Sub&/span&
&span class=&nf&&End&/span& &span class=&k&&If&/span&
&span class=&c&&'打开所选工作簿&/span&
&span class=&k&&For&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&1&/span& &span class=&k&&To&/span& &span class=&n&&UBound&/span&&span class=&p&&(&/span&&span class=&n&&SelectFiles&/span&&span class=&p&&)&/span&
&span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Open&/span& &span class=&n&&SelectFiles&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&)&/span&
&span class=&c&&'可以把多个工作簿合并到一个工作簿&/span&
&span class=&c&&'......&/span&
&span class=&k&&Next&/span& &span class=&n&&i&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&
上面的VBA代码先用Application.&b&GetOpenFilename&/b&方法显示“打开”文件对话框,然后打开所选择的一个或多个Excel工作簿文件。&b&详细的演示&/b&如下:&/p&&img src=&/v2-aa4612130edab4e592be5_b.jpg& data-rawwidth=&1078& data-rawheight=&765& data-thumbnail=&/v2-aa4612130edab4e592be5_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-aa4612130edab4e592be5_r.gif&&&p&
看过如上的动态图,可能有的小伙伴就要说了,如果我需要&b&选择的工作簿有很多&/b&,而且都不连续,难道需要按住&b&Ctrl键&/b&一个一个选择吗?能不能把需要打开的工作簿文件&b&放入一个文件夹&/b&,然后批量打开,然后进行处理呢?当然是可以的,具体代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Sub&/span& &span class=&nf&&OpenWBs&/span&&span class=&p&&()&/span&
&span class=&k&&Dim&/span& &span class=&n&&wb&/span& &span class=&ow&&As&/span& &span class=&n&&Workbook&/span& &span class=&c&&'定义变量 wb 为 工作簿&/span&
&span class=&k&&Dim&/span& &span class=&n&&Path$&/span&&span class=&p&&,&/span& &span class=&n&&File$&/span& &span class=&c&&'定义变量 Path$,File$&/span&
&span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&DisplayAlerts&/span& &span class=&o&&=&/span& &span class=&k&&False&/span& &span class=&c&&'关闭警告信息显示&/span&
&span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&ScreenUpdating&/span& &span class=&o&&=&/span& &span class=&k&&False&/span& &span class=&c&&'关闭屏幕刷新(可以提高运行速度)&/span&
&span class=&k&&With&/span& &span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&FileDialog&/span&&span class=&p&&(&/span&&span class=&n&&msoFileDialogFolderPicker&/span&&span class=&p&&)&/span& &span class=&c&&'工作于 应用程序的FileDialog(msoFileDialogFolderPicker)&/span&
&span class=&p&&.&/span&&span class=&n&&Show&/span& &span class=&c&&'&With对象&的Show&/span&
&span class=&k&&If&/span& &span class=&p&&.&/span&&span class=&n&&SelectedItems&/span&&span class=&p&&.&/span&&span class=&n&&Count&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span& &span class=&k&&Then&/span&
&span class=&k&&Exit&/span& &span class=&k&&Sub&/span& &span class=&err&&'未选择文件夹&/span&
&span class=&k&&End&/span& &span class=&k&&If&/span&
&span class=&n&&Path&/span& &span class=&o&&=&/span& &span class=&p&&.&/span&&span class=&n&&SelectedItems&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&c&&'路径=&With对象&的SelectedItems(1)&/span&
&span class=&n&&File&/span& &span class=&o&&=&/span& &span class=&n&&Dir&/span&&span class=&p&&(&/span&&span class=&n&&Path&/span& &span class=&o&&&&/span& &span class=&s&&&\*.xl*&&/span&&span class=&p&&)&/span& &span class=&c&&'File=&查找文件或目录&(路径 & &\*.xl*&)&/span&
&span class=&k&&Do&/span& &span class=&k&&While&/span& &span class=&n&&File&/span& &span class=&o&&&&&/span& &span class=&s&&&&&/span& &span class=&c&&'执行循环操作 当条件 File 不等于 空值&/span&
&span class=&n&&Workbooks&/span&&span class=&p&&.&/span&&span class=&n&&Open&/span& &span class=&p&&(&/span&&span class=&n&&Path&/span& &span class=&o&&&&/span& &span class=&s&&&\&&/span& &span class=&o&&&&/span& &span class=&n&&File&/span&&span class=&p&&)&/span& &span class=&c&&'设定wb= 工作簿集合的Open(路径 & &\& & File)&/span&
&span class=&n&&File&/span& &span class=&o&&=&/span& &span class=&n&&Dir&/span& &span class=&c&&'File=下一个文件&/span&
&span class=&k&&Loop&/span& &span class=&c&&'循环执行&/span&
&span class=&k&&End&/span& &span class=&k&&With&/span& &span class=&c&&'With语句结束&/span&
&span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&ScreenUpdating&/span& &span class=&o&&=&/span& &span class=&k&&True&/span& &span class=&c&&'开启屏幕刷新&/span&
&span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&DisplayAlerts&/span& &span class=&o&&=&/span& &span class=&k&&True&/span& &span class=&c&&'开启警告信息显示&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&&b&详细演示&/b&如下:&/p&&img src=&/v2-cb3e98d6e2a205ef61fc5_b.jpg& data-rawwidth=&1078& data-rawheight=&765& data-thumbnail=&/v2-cb3e98d6e2a205ef61fc5_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/v2-cb3e98d6e2a205ef61fc5_r.gif&&&p&
如上动态图为大家演示了,如何批量打开指定目录Test中的所有工作簿文件,其实在Do While循环中可以加入自己的代码,把打开的工作簿中的工作表全部汇总到一个工作簿中,具体如何实现就当作业吧。&br&
今天的介绍就到这里了,更多VBA初学者教程,请关注下期图文教程。本文&b&素材&/b&可以在公众号回复“&b&&/b&”得到哦~后期文章附带的素材,大家都可以通过在公众号回复&b&该文档发送的日期&/b&得到,欢迎下载学习^_^Written by Steven in ^_^&/p&&p&&br&&/p&&p&&b&微信公众号:SaveUTime&/b&&/p&&p&&b&SUT学习交流群:,入群审核人:Steven&/b&&/p&&p&&b&关注公众号,提高效率,节约您的时间!&/b&&/p&
前一期为大家介绍了如何创建新的工作簿,今天为大家介绍如何打开工作簿。 在VBE宏编辑器里面打开工作簿,需要使用Open方法,新建一个xlsm工作簿,插入一个新的模块,输入如下代码,即可打开一个工作簿。Sub OpenWorkbook()
Workbooks.Open ("C:\Users\Stev…
&img src=&/v2-85c2e9dc19f62a8ed51b71aa0a329e1a_b.jpg& data-rawwidth=&640& data-rawheight=&427& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-85c2e9dc19f62a8ed51b71aa0a329e1a_r.jpg&&&p&
Written by Steven in ^_^今天就是端午节啦,大家记得吃粽子哦,祝各位爱学习的小伙伴端午节快乐^_^&/p&&img src=&/v2-072bded9d8ecfa574ab2ad_b.jpg& data-rawwidth=&500& data-rawheight=&280& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/v2-072bded9d8ecfa574ab2ad_r.jpg&&&p&
从这一篇图文教程开始,大框架就按照顺序为大家介绍&b&VBA初学者教程&/b&。如果遇到好的案例,我会进行相应的插播哦。&/p&&p&
今天首先为大家介绍&b&第一章VBA入门知识&/b&中的&b&激活工作簿&/b&。日常工作中,可能会同时打开多个Excel工作簿,多个工作簿协同工作。下图是打开的两个工作簿&b&MyBook1.xlsx&/b&和&b&MyBook2.xlsx&/b&:&/p&&img src=&/v2-47d83ac9dabc0ed9de67ff_b.jpg& data-rawwidth=&948& data-rawheight=&656& class=&origin_image zh-lightbox-thumb& width=&948& data-original=&/v2-47d83ac9dabc0ed9de67ff_r.jpg&&&p&
为了能够更加直观的演示工作簿激活,我们可以通过&b&录制宏&/b&加以演示:&/p&&img src=&/v2-ee182883cbdb284515ebc67e_b.jpg& data-rawwidth=&953& data-rawheight=&666& data-thumbnail=&/v2-ee182883cbdb284515ebc67e_b.jpg& class=&origin_image zh-lightbox-thumb& width=&953& data-original=&/v2-ee182883cbdb284515ebc67e_r.gif&&&p&
通过如上动态图可以看到,鼠标点选不同的工作簿,就会有该工作簿被激活,转换为相应的代码就是Windows(&b&工作簿名称&/b&).Activate。如果后期使用VBA在多文档操作中,可以使用该段代码激活不同的工作簿。&/p&&p&
其实每个工作簿在创建的时候就包含了至少两个Microsoft Excel对象,一个是&b&ThisWorkbook&/b&,其余的是类似&b&SheetN&/b&(N为不小于0的正整数),请见下图:&/p&&img src=&/v2-dd9aff0bdd636b79c688d2faa4c4cfad_b.jpg& data-rawwidth=&894& data-rawheight=&616& class=&origin_image zh-lightbox-thumb& width=&894& data-original=&/v2-dd9aff0bdd636b79c688d2faa4c4cfad_r.jpg&&&p&
其实每一个工作簿中的Excel对象&b&ThisWorkbook&/b&都包含了响应工作簿被激活的&b&Activate&/b&事件,以工作簿MyBook1.xlsx为例进行演示:&/p&&img src=&/v2-bfddbb32dc6aad8d726b_b.jpg& data-rawwidth=&953& data-rawheight=&666& data-thumbnail=&/v2-bfddbb32dc6aad8d726b_b.jpg& class=&origin_image zh-lightbox-thumb& width=&953& data-original=&/v2-bfddbb32dc6aad8d726b_r.gif&&&p&
通过如上动态图可以看到,编写完MyBook1.xlsx工作簿中的Activate事件后,再次单击MyBook1.xlsx工作簿后,就会弹出我们设置的MsgBox对话框。&/p&&p&
今天的介绍就到这里了,更多VBA初学者教程,请关注下期图文教程。本文&b&素材&/b&可以在公众号回复“&b&&/b&”得到哦~后期文章附带的素材,大家都可以通过在公众号回复&b&该文档发送的日期&/b&得到,欢迎下载学习^_^Written by Steven in ^_^&/p&&p&&br&&/p&&p&&b&微信公众号:SaveUTime&/b&&/p&&p&&b&SUT学习交流群:,入群审核人:Steven&/b&&/p&&p&&b&关注公众号,提高效率,节约您的时间!&/b&&/p&
Written by Steven in ^_^今天就是端午节啦,大家记得吃粽子哦,祝各位爱学习的小伙伴端午节快乐^_^ 从这一篇图文教程开始,大框架就按照顺序为大家介绍VBA初学者教程。如果遇到好的案例,我会进行相应的插播哦。 今天首先为大家介绍第一章VBA入门…
&p&可参考问题&a href=&/question//answer/& class=&internal&&做分析用什么工具?不想再用Excel了!&/a&&/p&&p&做数据分析,即使被伤得深,还是要推荐excel,关于excel的仪表盘制作&a href=&/question/& class=&internal&&如何制作图表非常精美的 Excel 文档?&/a&熟练数据透视表、VBA程序开发,具有常规的审美。类似下图,不光光是图表,还有内部的业务逻辑,这是一张完整报表中所需要的。&/p&&img src=&/v2-6af26cddfb15916bed27_b.png& data-rawwidth=&1587& data-rawheight=&971& class=&origin_image zh-lightbox-thumb& width=&1587& data-original=&/v2-6af26cddfb15916bed27_r.png&&&p&&br&&/p&&img src=&/v2-319b5612be6fac431c5125dab3902b7a_b.png& data-rawwidth=&1075& data-rawheight=&969& class=&origin_image zh-lightbox-thumb& width=&1075& data-original=&/v2-319b5612be6fac431c5125dab3902b7a_r.png&&&p&要不,就用专业的报表工具或者BI工具来做dashboard,类似描述中帆软的工具或者一些开源工具。好处就在于用起来简单,数据透视、图表制作这些功能封装好的。整个过程就是连数据,设计模板,web展示。图表是内设好的或者开发对接Hcharts/Echarts/D3图标库,一般内置的图表以及够用了,解决分析问题才是主要的。&/p&&p&&b&内置图表&/b&&/p&&img src=&/v2-c5ecd2bd4a54b0cd59fa_b.png& data-rawwidth=&1497& data-rawheight=&699& class=&origin_image zh-lightbox-thumb& width=&1497& data-original=&/v2-c5ecd2bd4a54b0cd59fa_r.png&&&p&dashboard分析仪表盘&/p&&img src=&/v2-02ae49f3b4b879e72c4c9_b.jpg& data-rawwidth=&2130& data-rawheight=&961& class=&origin_image zh-lightbox-thumb& width=&2130& data-original=&/v2-02ae49f3b4b879e72c4c9_r.jpg&&&p&动图(gif)点开有惊喜&/p&&p&&br&&/p&&img src=&/v2-221b3d3520bad88072dbd5d_b.jpg& data-rawwidth=&600& data-rawheight=&289& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-221b3d3520bad88072dbd5d_r.jpg&&&p&最后,可以用一些数据分析工具,例如R/Python,自带的图表也十分绚丽。 R主要是ggplot2,ggplot2是关于R里面的一个用来绘制统计图形包,制作流程如下:&/p&&p&&br&&/p&&img src=&/v2-b02a4073cf57aedf93ad_b.jpg& data-rawwidth=&366& data-rawheight=&714& class=&content_image& width=&366&&&p&&br&&/p&&p&&b&R语言可视化成品图&/b&&/p&&p&&br&&/p&&img src=&/v2-bfdadbc2d8f9101292be_b.jpg& data-rawwidth=&567& data-rawheight=&1304& class=&origin_image zh-lightbox-thumb& width=&567& data-original=&/v2-bfdadbc2d8f9101292be_r.jpg&&&p&&/p&
可参考问题做数据分析,即使被伤得深,还是要推荐excel,关于excel的仪表盘制作熟练数据透视表、VBA程序开发,具有常规的审美。类似下图,不光光是图表,还有内部的业务逻辑,这是…
&img src=&/v2-59edb51aa13a721dbd563af_b.jpg& data-rawwidth=&640& data-rawheight=&427& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-59edb51aa13a721dbd563af_r.jpg&&&p&
一直关注和学习SUT事务所推送的文章的小伙伴一定还记得前期为大家分享了一篇类似的文章&b&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzI3NDAyODE5OA%3D%3D%26mid%3D%26idx%3D1%26sn%3De7c829f74f43c7ac5e6f6%26chksm%3Deb1be517517fcb142ece0e794fa538e4a9d9cfcbb491b%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Excel VBA】- 合并相同属性区域&i class=&icon-external&&&/i&&/a&&/b&。建议未学习的小伙伴先学习一下,和今天的文章加以对比,充分掌握合并相同属性和单元格内容。&br&&/p&&p&
昨天同事正在整理营业部所属分公司信息,需要对相同城市的单元格内容进行批量合并,因为数据比较机密,所以我&b&模拟了一份类似的需求&/b&,数据截图如下:&/p&&p&&br&&/p&&img src=&/v2-14e275cb7ab6fc45cbebf_b.png& data-rawwidth=&629& data-rawheight=&303& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&/v2-14e275cb7ab6fc45cbebf_r.png&&&p&&br&&/p&&p&
该同事的需求转换而来就是对上图中的F列进行相同单元格合并,得到如下图所示的&b&效果&/b&:&br&&/p&&img src=&/v2-f605c4e11ec305e37e04fd7_b.png& data-rawwidth=&628& data-rawheight=&290& class=&origin_image zh-lightbox-thumb& width=&628& data-original=&/v2-f605c4e11ec305e37e04fd7_r.png&&&p&&br&&/p&&p&
为了更加直观的展现,对相同单元格数据进行合并后,数据一下子简明了许多。那究竟该如何对批量数据进行合并相同单元格呢?今天为大家介绍&b&2种方法&/b&,可以很方便的解决此类问题。&br&&/p&&p&&br&&/p&&h2&&b&方法一 数据透视表&/b&&/h2&&p&
对于需要把相同单元格内容进行合并,第一反应就可以通过数据透视表来实现,具体方法请见如下&b&动态图&/b&:&br&&/p&&img src=&/v2-694eabd431e0d004c761ff_b.jpg& data-rawwidth=&1111& data-rawheight=&732& data-thumbnail=&/v2-694eabd431e0d004c761ff_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1111& data-original=&/v2-694eabd431e0d004c761ff_r.gif&&&p&&br&&/p&&p&
通过&b&数据透视表&/b&的方法还算简单,但有几点需要&b&注意&/b&:&/p&&p&
A 设置数据透视表【&b&选项&/b&】,勾选【&b&合并并居中排列带标签的单元格&/b&】;&br&&/p&&img src=&/v2-eacf02ebcfaf_b.png& data-rawwidth=&1112& data-rawheight=&729& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&/v2-eacf02ebcfaf_r.png&&&p&&br&&/p&&p&
B 依次选择【&b&设计&/b&】→【&b&分类汇总&/b&】→【&b&不显示分类汇总&/b&】;&br&&/p&&img src=&/v2-d6c2c7f218dfe9e63a66_b.png& data-rawwidth=&1112& data-rawheight=&729& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&/v2-d6c2c7f218dfe9e63a66_r.png&&&p&&br&&/p&&p&
C 依次选择【&b&设计&/b&】→【&b&报表布局&/b&】→【&b&以表格形式显示&/b&】;&/p&&p&&br&&/p&&img src=&/v2-7b3f79f549c86b5df5b214_b.png& data-rawwidth=&1112& data-rawheight=&729& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&/v2-7b3f79f549c86b5df5b214_r.png&&&p&&br&&/p&&h2&&b&方法二 VBA代码&/b&&/h2&&p&
需要批量操作的,怎么能少了VBA呢,VBA就是&b&为了效率而生&/b&,代码如下:&br&&/p&&div class=&highlight&&&pre&&code class=&language-vb.net&&&span&&/span&&span class=&k&&Option&/span& &span class=&n&&Explicit&/span&
&span class=&k&&Sub&/span& &span class=&err&&合并相同单元格内容()&/span&
&span class=&k&&Dim&/span& &span class=&n&&iColumn&/span&&span class=&p&&,&/span& &span class=&n&&i&/span& &span class=&ow&&As&/span& &span class=&kt&&Integer&/span&
&span class=&n&&iColumn&/span& &span class=&o&&=&/span& &span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&InputBox&/span&&span class=&p&&(&/span&&span class=&s&&&请输入需要合并数据所在列(数字):&&/span& &span class=&o&&&&/span& &span class=&n&&Chr&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span& &span class=&o&&&&/span& &span class=&n&&Chr&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span& &span class=&o&&&&/span& &span class=&s&&&QQ群:&&/span& &span class=&o&&&&/span& &span class=&n&&Chr&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span& &span class=&o&&&&/span& &span class=&s&&&微信公众号:SaveUTime&&/span&&span class=&p&&,&/span& &span class=&s&&&SUT事务所:Writed by Steven^_^&&/span&&span class=&p&&,&/span& &span class=&n&&Type&/span&&span class=&p&&:&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&k&&If&/span& &span class=&n&&iColumn&/span& &span class=&o&&=&/span& &span class=&k&&False&/span& &span class=&k&&Then&/span& &span class=&k&&Exit&/span& &span class=&k&&Sub&/span&
&span class=&nf&&Application&/span&&span class=&p&&.&/span&&span class=&n&&DisplayAlerts&/span& &span class=&o&&=&/span& &span class=&k&&False&/span&
&span class=&k&&For&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&o&&[&/span&&span class=&n&&A65536&/span&&span class=&o&&]&/span&&span class=&p&&.&/span&&span class=&n&&End&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&).&/span&&span class=&n&&Row&/span& &span class=&k&&To&/span& &span class=&mi&&2&/span& &span class=&k&&Step&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&
&span class=&k&&If&/span& &span class=&n&&Cells&/span&&span class=&p&&(&/span&&span class=&n&&i&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&iColumn&/span&&span class=&p&&)&/span& &span class=&o&&=&/span& &span class=&n&&Cells&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&iColumn&/span&&span class=&p&&)&/span& &span class=&k&&Then&/span&
&span class=&k&&With&/span& &span class=&n&&Range&/span&&span class=&p&&(&/span&&span class=&n&&Cells&/span&&span class=&p&&(&/span&&span class=&n&&i&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&iColumn&/span&&span class=&p&&),&/span& &span class=&n&&Cells&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&iColumn&/span&&span class=&p&&))&/span&
&span class=&p&&.&/span&&span class=&n&&Merge&/span&
&span class=&p&&.&/span&&span class=&n&&VerticalAlignment&/span& &span class=&o&&=&/span& &span class=&n&&xlCenter&/span&
&span class=&k&&End&/span& &span class=&k&&With&/span&
&span class=&k&&End&/span& &span class=&k&&If&/span&
&span class=&k&&Next&/span&
&span class=&n&&Application&/span&&span class=&p&&.&/span&&span class=&n&&DisplayAlerts&/span& &span class=&o&&=&/span& &span class=&k&&True&/span&
&span class=&k&&End&/span& &span class=&k&&Sub&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&
有了代码,只需要打开VBE(宏编辑器),依次选择【&b&插入&/b&】→【&b&模块&/b&】,双击新建的模块1,把代码拷贝到模块1中。可以直接按下键盘上的&b&F5键&/b&或点击&b&绿色运行宏按钮&/b&,如果不希望在VBE中操作,也可在工作表中插入一个&b&按钮&/b&或插入一个&b&图形&/b&,把宏绑定到按钮或图形上即可点击运行。接下来演示一下代码运行效果:&br&&/p&&img src=&/v2-d8ed89e5acd22b75b593ed_b.jpg& data-rawwidth=&1111& data-rawheight=&732& data-thumbnail=&/v2-d8ed89e5acd22b75b593ed_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1111& data-original=&/v2-d8ed89e5acd22b75b593ed_r.gif&&&p&&br&&/p&&p&
鼠标点击图形后,会弹出如下&b&对话框&/b&:&br&&/p&&img src=&/v2-75534cfd86cdcb2e9a47_b.png& data-rawwidth=&300& data-rawheight=&194& class=&content_image& width=&300&&&p&&br&&/p&&p&&b&PS&/b&:上图中的换行通过&b&Chr(10)&/b&来实现,类似在Excel单元格中的&b&强制换行Alt+Enter&/b&快捷键!&/p&&p&
该对话框限制了,只接受数字,如果输入字母或汉字,会提示无效数字。该限制来自于&b&Application.InputBox&/b&的Type属性,从上面代码可以看到,我设置Type属性为1,就限定了输入的内容必须是数字。如果希望了解更多,可以在VBE中选择InputBox后,按下键盘上的&b&F1键&/b&,会打开该方法的相关帮助信息,大致截图如下图所示:&/p&&p&&br&&/p&&img src=&/v2-529aa7916fae93c9f7d22b908a3900a7_b.jpg& data-rawwidth=&884& data-rawheight=&1254& class=&origin_image zh-lightbox-thumb& width=&884& data-original=&/v2-529aa7916fae93c9f7d22b908a3900a7_r.jpg&&&p&&br&&/p&&p&
上图是通过软件&b&FastStone Capture&/b&滚动截图而来,可以通过文章&b&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzI3NDAyODE5OA%3D%3D%26mid%3D%26idx%3D1%26sn%3Dba94cfc3ffcc%26chksm%3Deb1b01d3dc6c88c515bef4cdbaecf52ff5%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【截图软件】- FastStone Capture,一款让您爱不释手的截图、录像软件&i class=&icon-external&&&/i&&/a&&/b&进行温习哦。&br&&/p&&p&
今天的介绍就到这里了,本文&b&素材&/b&可以在公众号回复“&b&&/b&”得到哦~&/p&&p&后期文章附带的素材,大家都可以通过在公众号回复&b&该文档发送的日期&/b&得到,欢迎下载学习^_^Written by Steven in ^_^&/p&&p&&br&&/p&&p&&b&微信公众号:SaveUTime&/b&&/p&&p&&b&SUT学习交流群:,入群审核人:Steven&/b&&/p&&p&&b&关注公众号,提高效率,节约您的时间!&/b&&/p&
一直关注和学习SUT事务所推送的文章的小伙伴一定还记得前期为大家分享了一篇类似的文章。建议未学习的小伙伴先学习一下,和今天的文章加以对比,充分掌握合并相同属性和单元格内容。 昨天同事正在整理营业部所属分公司信息…
&img src=&/v2-fbbe961ee6_b.png& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/v2-fbbe961ee6_r.png&&&p&最近有朋友看到了我们的物流地图,咨询如何在地图上绘制各省间合作关系的图,类似如下效果。&/p&&img src=&/v2-fbbe961ee6_b.png& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/v2-fbbe961ee6_r.png&&&p&&br&&/p&&p&在之前的帖子中,曾有多次用到在地图上绘制连线、射线的形式,来反映各省间迁徙、物流发运等关系,甚至有多个公司主体之间复杂债务关系的图,具体内容见当时的帖子。&/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3D4d89749dd0fba1ccfd1ac06fcea23040%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Excel制作中国迁徙数据地图&i class=&icon-external&&&/i&&/a& &/p&&img src=&/v2-8dea0c54a0cf4f17b5a0c_b.png& data-rawwidth=&922& data-rawheight=&558& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&/v2-8dea0c54a0cf4f17b5a0c_r.png&&&p&&br&&/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3Db3b70a4ee8c5b055e37460%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在地图上分析供应链/销售/物流网络&i class=&icon-external&&&/i&&/a& &/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3D1f615c902e7c917029bf%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在地图上分析供应链物流网络-中国区版&i class=&icon-external&&&/i&&/a& &/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3De8c194e954fde4ac8e4cc1%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Excel物流地图分析模板 - 全球版&i class=&icon-external&&&/i&&/a& &/p&&img src=&/v2-faaba4db539f_b.png& data-rawwidth=&1280& data-rawheight=&1024& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-faaba4db539f_r.png&&&p&&br&&/p&&p&&a href=&/?target=http%3A//mp./s%3F__biz%3DMzA5OTM1NDQwOA%3D%3D%26mid%3Didx%3D1%26sn%3Dca05c03ee%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三角债,理还乱?用“债务关系网络图”,DUANG的一下就清晰了!&i class=&icon-external&&&/i&&/a& &/p&&img src=&/v2-6e4de1c4c87cbd4f98564fa_b.png& data-rawwidth=&1125& data-rawheight=&590& class=&origin_image zh-lightbox-thumb& width=&1125& data-original=&/v2-6e4de1c4c87cbd4f98564fa_r.png&&&p&&br&&/p&&p&以上模型都是 Excel 知识和技巧的全面综合运用,难度较高,不过其中最主要的特征,就是这些连线和射线,今天我们拎出来单独介绍其绘制方法。&/p&&p&&br&&/p&&p&你看到的这些连线、射线,其实是使用带联系的散点图来绘制的,你需要准备好连线起止点的经纬度数据,作为xy数据来绘制散点图。&/p&&p&&br&&/p&&p&我们做个简单模型例子来讲解。如下图,选择某个省份,绘制从该省份到其他省份的射线连接。&/p&&img src=&/v2-bb0c9cc76c508540bdeee3bee73fdc3c_b.png& data-rawwidth=&1920& data-rawheight=&847& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-bb0c9cc76c508540bdeee3bee73fdc3c_r.png&&&p&(射线技术简单模型讲解)&/p&&p&&br&&/p&&p&首先你要找到各省省会城市的经纬度坐标,图中的F~H列是我找到的数据,另外找到一份中国地图图片作图底图。下面开始制作模型。&br&&/p&&p&1、制作起始点的选择器,并根据选择结果提取起始点的经纬度。&/p&&p&B8 设置数据有效性,数据源为F列省名。用户选择后,C8、D8从 F~H 列 vlookup 提取其经纬度。&/p&&p&&br&&/p&&p&2、准备射线散点图的数据源。&/p&&p&射线有34条,那么射线起止点有68个,所以 J、K 列需要准备68行数据。注意J8的公式写法技巧:&/p&&p&
J8:=IF(MOD($I8,2),C$8,INDEX(G$8:G$41,$I8/2))&/p&&p&复制到整个区域,即准备好了散点图的xy数据源,请仔细体会这里的原理。&/p&&p&&br&&/p&&p&3、制作射线图。&/p&&p&以J、K列数据插入带连线的散点图,就得到了射线图。&/p&&p&射线可能需要有省份名称标签,我们先准备一个复选框供选择是否显示标签,选择结果在L6,L列的公式:&/p&&p&
L8:=IF($L$6,IF(MOD($I8,2),&&,INDEX(F$8:F$41,$I8/2)),&&)&/p&&p&复制到底,就在终点数据点上准备了省份名称标签。散点图添加数据标签,指定为L列。勾选复选框,测试正确。&/p&&p&&br&&/p&&p&4、完成射线和地图组合。&/p&&p&把散点图设置透明,放置在地图底图上,调整大小和位置,使各终点基本和地图对齐,完成射线地图。选择起点省份、复选框,测试显示结果正确,完成。&/p&&p&动态演示效果如下图:&/p&&img src=&/v2-5d01cc891472eaf04645b0_b.jpg& data-rawwidth=&1800& data-rawheight=&840& data-thumbnail=&/v2-5d01cc891472eaf04645b0_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1800& data-original=&/v2-5d01cc891472eaf04645b0_r.gif&&&p&&br&&/p&&p&之所以说基本对齐,是因为地图投影关系,你找到的地图底图可能和散点图的终点不能刚好对齐,这也是本做法的缺点之一。&br&&/p&&p&以上是简单模型,解释其技术原理。在前面的例图里,都要复杂一些。&/p&&p&&br&&/p&&p&1、物流地图需要画出箭头,那么每条线段要和下一条分开,在第2步准备数据时,需要在每对起止点数据间留空行,使线条断开。需要在线段上标出数字,那么需要另准备一组散点图了。发运终点有多有少,准备xy数据时需要根据情况来填充了。&/p&&p&&br&&/p&&p&2、债务关系图里,它的xy坐标不是经纬度了,而是我们计算得出的这些公司在圆圈上分布的坐标了。债务关系有双向的,两个公司间可能要画两条线条,数据准备可以分开准备。&/p&&p&&br&&/p&&p&当然,这些都属于复杂、高级的图表了,对 Excel 来说很有难度,目前有其他工具如各种网络图、ggplot等绘制起来会更容易。&/p&&p&&br&&/p&&p&作为日常工作简易使用,像这样采用 Excel 来简易做一下,效果还不错,是可以的,如果是有专业要求的工作还是需要找专业工具来做。&/p&&p&&br&&/p&&p&在微信公众号 iamExcelPro 回复 “射线”,下载范例文件动手练习。&/p&&p&&br&&/p&&p&&b&Excel
可视化&/b&&/p&&p&尽在 Excel 图表之道,点击&a href=&/?target=http%3A///provider/1536580/index.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阅读原文&i class=&icon-external&&&/i&&/a&立即学习&/p&&img src=&/v2-d5d4caad86f_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-d5d4caad86f_r.png&&&p&&/p&&p&&/p&&p&&/p&
最近有朋友看到了我们的物流地图,咨询如何在地图上绘制各省间合作关系的图,类似如下效果。 在之前的帖子中,曾有多次用到在地图上绘制连线、射线的形式,来反映各省间迁徙、物流发运等关系,甚至有多个公司主体之间复杂债务关系的图,具体内容见当时的帖…
&img src=&/v2-c8a0fa7d0b3f52ce1ea889e3b08d3ad7_b.jpg& data-rawwidth=&1701& data-rawheight=&945& class=&origin_image zh-lightbox-thumb& width=&1701& data-original=&/v2-c8a0fa7d0b3f52ce1ea889e3b08d3ad7_r.jpg&&&p&今天讲文本处理函数。&/p&&p&很多写作者会刻意隐藏或弱化自己的喜好以便尽可能争取最多人的关注和支持。我觉得很理解,当然没什么不对。&/p&&p&不过我不打算这么做,我坚信写作者和阅读者是互相筛选的,勉强凑合在一起早晚两生厌,彼此难受。&/p&&p&比如我鼓吹自由主义,反对中医,无论这在今天是否政治正确,它都是我信仰的一部分。&/p&&p&之前对李银河老师有偏见,最近开始路转粉,贴一段她最近发表的文字,是我最近几个月读到的最好的表达之一。&/p&&p&也算是对今天“文本”主题最好的呼应。&/p&&blockquote&&b&将生命从无聊中打捞出来的两个办法&/b&&br&在参透之后,能直接感受生命之空虚。&br&纵然有无穷无尽的热闹虚荣的闹剧在世上轮番上演,纵然人们为之殚精竭虑悲喜交集,只要静夜沉思,还是能够分明见到这一切背后的空虚。&br&真正参透之后,明知无用,真是很难打起精神再做任何事。&br&既然明知一切热闹之后都是沉寂,既然明知一切努力都归于空无,哪里还有事情是冷静的头脑认为还值得一做的呢?&br&写作是用想象的精彩美化平淡无聊空虚的人生。这是一个填补空虚的办法。&br&人在写作中用戏剧化的事件和人生打发时间,就像学画的儿童在歪歪斜斜的线条勾勒出来的空白处胡乱填充颜色,让画面显得光怪陆离或精彩纷呈。侦探故事,爱情故事,各种各样的人生故事,多数是现实中从未发生过也不可能发生的事情,就让它们在小说中发生吧,要不生活真是太无聊了。&br&陷入爱情是将生命从无聊中打捞出来的另外一个办法,也许是最后一个办法。人在恋爱之中是头脑混乱丧失理智的,因此会一时忘却头脑清醒时能够看清的空虚。那时,渴望使得事情弥漫在焦虑纠结的气氛之中,蒙上了一层令人迷醉的迷雾,人或一时陷入如梦如幻如醉如痴的幻境,摆脱了空虚和无聊。可以纵容自己陷入写作和爱情之中,但是要时时记得在深处和远处,生命的背景仍是空无。&br&&br&——— 转载自 @李银河 老师微博&/blockquote&&p&开始正题,从这一章开始,我们将不再大而化之泛泛讲函数与公式,而是进入具体函数的使用上来。&/p&&p&之前提到的函数“六扇门”,今天我们打开第一扇门,叫做“文本处理”。&/p&&h2&1.文本基础知识&/h2&&p&在公式中,引用常量文本字符串要用英文双引号括起来(公式中除参数本身外,所有符号都是英文),否则会被识别为未定义的名称从而报出“#NAME?”错误。&/p&&p&最简单的字符串引用例如: &/p&&blockquote&=“怒马说”&“EXCEL”。&/blockquote&&p&如果字符串本身就有引号怎么办呢?两种处理方式,一种是外围再加两对英文引号,如=“““怒马说”””。一种是使用char函数, =char(34)&“怒马说”&=char(34),最终效果都是输出包含引号的字符串 “怒马说”。&/p&&p&&b&1). 空单元格与空文本&/b&&/p&&p&一个单元格从未被输入任何内容,或者虽然有内容但按下DELETE按键删除了所有内容后都是空单元格。&/p&&p&使用类似 =ISBLANK(F2) 函数可以判断一个单元格是否为空白单元格。空文本是文本的一种,它的值等于“”,引号是英文引号,引号之间没有任何内容,常用来在公式中用来处理公式返回无结果内容或者屏蔽错误。空文本依然是文本,空文本所在的单元格属于文本型单元格。&/p&&ul&&li&使用定位功能选择“空值”时,将只定位空单元格,不包括空文本。(还记得 公式四大神器中的案例吗?没有使用定位功能就是这个原因)&/li&&li&使用& ctrl+F &调出查找界面什么都不输入,查找结果既包括空文本,也包括空单元格。需要注意的是如果通过公式给单元格赋值空文本,需要选择性粘贴成数值以后它才是真正意义上的空文本。&/li&&li&使用筛选操作时,筛选条件为“(空白)”时,筛选结果既包括空文本,也包括空单元格。&/li&&li&假设A1单元格为空文本,则 =A1=&& 和=A1=0 两个公式都返回TRUE,这能否说明空文本等于0呢?不能。公式 =“”=0 返回FALSE。&/li&&li&有时候我们会发现公式会写成 =VLOOKUP(……)&“” 这种形式。套路,全是套路,VLOOKUP查不到对应值会返回0值,通过这种方式,将返回空文本,视觉上比较舒服同时还避免了和真正的0返回值混淆。&/li&&/ul&&p&&b&2). 文本型数字&/b&&/p&&p&文本型数字例如“1”“”,是EXCEL公式的定时炸弹,一不小心就使得计算结果无法预料。目前已知四则运算能够自动将文本型数字转化为纯数字,另外部分函数的参数使用文本型数字不会对计算结果造成影响,如INDEX、CHOOSE、OFFSET、SMALL、LARGE、MOD、TEXT、MID、RIGHT、LEFT、VLOOKUP等。&/p&&p&但最保险的做法我还是会建议你(有先后顺序):&/p&&ul&&li&先对单元格进行格式转换再应用公式。&/li&&li&使用-- 运算将单元格显式转换为数字。&/li&&li&对不了解的函数一定要检查计算结果避免漏算。&/li&&/ul&&p&&b&3). CHAR函数&/b&&/p&&p&CHAR函数不是一个高频函数,但某些场景下很有用,比如刚才提到的 CHAR(34)代表英文引号,另外还有 CHAR(10)代表换行,比如我们需要将单元格合并的时候直接换行,则=A1&CHAR(10)&B1 很方便就可以实现。&/p&&h2&2.文本比较&/h2&&p&文本比较遵循以下原则:&/p&&ul&&li&区分中文字符和英文字符,即全角符号和半角符号。&/li&&li&区分文本型数字与数值,文本始终大于数值,因此 =&1&&2 将返回TRUE。&/li&&li&不区分大小写。=&A&=&a& 将返回TRUE。如果想区分大小写怎么办?使用 EXACT函数。&/li&&/ul&&p&&b&1). EXACT函数&/b&&/p&&p&EXACT函数区分大小写,但不区分格式(颜色,下划线加粗等),支持单个字符串比较,也支持单元格区域整体比较。单元格整体区域比较时,将返回比较结果数组。例如 =EXACT(A1:A3,B1),意思是将B1分别与A1,A2,A3比较,返回的将是类似{TRUE,FALSE,TRUE}这样的数组。=EXACT(A1:A3,B1:B3)这种用法也是可以的,此时将在同一行两两比较,返回的依然是类似{TRUE,FALSE,TRUE}这样的数组。&/p&&p&&b&2). 文本比较举例&/b&&/p&&p&假设有A字符串和B字符串,他们之间比较的情形及注意事项见下表:&/p&&p&&br&&/p&&p&&br&&/p&&img src=&/v2-619f85ece4ddf_b.png& data-rawwidth=&1333& data-rawheight=&684& class=&origin_image zh-lightbox-thumb& width=&1333& data-original=&/v2-619f85ece4ddf_r.png&&&p&&br&&/p&&h2&3.文本合并&/h2&&p&文本合并可以使用“&”符号,也可以使用CONCATENATE函数和PHONETIC函数,他们的具体区别如下:&/p&&p&&br&&/p&&img src=&/v2-95cbb876cf24fdd858f685_b.png& data-rawwidth=&1230& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&1230& data-original=&/v2-95cbb876cf24fdd858f685_r.png&&&p&&br&&/p&&p&&br&&/p&&h2&4.文本分离&/h2&&p&文本分离函数是指从给定字符串中提取特定的内容操作,通常用于字符串截取,中英文分离等。&/p&&p&文本分离函数包括LEFT、RIGHT和MID函数,这几个函数相对简单,LEFT函数和RIGHT函数参数是一样的,比如&/p&&blockquote&LEFT(text,[num_chars])&/blockquote&&p&text指的是待分离字符串,num_chars是一个数字,意思是从text的左边开始截取多少个字符。MID(text,start_num,num_chars),text是待处理字符串,start_num用于指定要提取的第一个字符所在的位置,num_chars指的是截取字符的个数。我们直接基于案例说明。以下没有特别说明,假定给定字符串均位于A1单元格。&/p&&ul&&li&从姓名手机号字符串“怒马”中抽取姓名部分,公式为 =LEFT(A1,LENB(A1)-LEN(A1)),这个地方有一个小技巧,LENB函数是按照字节计数的,汉字占两个字节,英文和数字占一个字节。LEN函数是按照字符个数计数的,汉字和英文、数字均作为一个字符计数。因此LENB-LEN函数恰好就是汉字个数。&/li&&li&从任意数字中(可能包含小数位)提取个位数。这个其实在“四大神器”那一章中实现过,公式是 =MID(A1,LEN(INT(A1)),1)。&/li&&li&从身份证号码提取出生年月(假设为二代身份证,日期信息从第7位开始)并将出生年月用标准日期格式显示。公式为 =TEXT(MID(A1,7,8),“0-00-00”)。&/li&&li&从身份证号码中提取性别信息并显示为&男,女&,公式为 =IF(MOD(MID(A1,17,1),2),&男&,“女”)。这里隐含的规则是身份证号码的第17位如果是奇数则对应男性,偶数对应女性。&/li&&/ul&&h2&5.文本定位&/h2&&p&如果字符串抽取的位置和长度都是明确固定的,直接使用LEFT相关函数就好了。但是有时候做不到这一点(比如分离E-mail地址)我们就需要先针对特定字符在源字符串中进行定位。然后再根据定位位置进行后续处理。EXCEL 文本定位函数有FIND和SEARCH函数。&/p&&p&&b&FIND和SEARCH函数基本语法&/b&&/p&&p&两个函数都是用来定位某个字符或字符串(我们称为“关键字”)在源字符串中的起始位置,结果以数字表示。如果在同一个源字符串中有多个复合要求的待查找字符串,则只返回左侧第一次出现时的位置。如果查找不到则返回“#VALUE!&错误。&/p&&p&FIND函数语法: &/p&&blockquote&FIND(find_text,within_text,[start_num])&/blockquote&&p&其中find_text指的是关键字,within_text指的是源字符串,start_num指的是从源字符串的哪个位置开始检索,可以省略。省略的话从左边第一个字符开始检索,即默认值为1。&/p&&p&SEARCH函数参与和上面一样。假设我们要从字符串“因为没钱支付精神病院的治疗费用,我只能强打起精神装成一个正常人”搜索“精神”一词,则FIND函数应该这么写:&/p&&blockquote&=FIND(&精神&,&因为没钱支付精神病院的治疗费用,我只能强打起精神装成一个正常人&)&/blockquote&&p&SEARCH一样的写法:&/p&&blockquote&=SEARCH(&精神&,&因为没钱支付精神病院的治疗费用,我只能强打起精神装成一个正常人&)&/blockquote&&p&两者返回的结果都是7,如果指定第三个参数大于7的话,则返回第二个“精神”所在的起始位置,懒得数了,自己试试吧。&/p&&p&&b&FIND和SEARCH函数不同点&/b&&/p&&p&FIND和SEARCH函数都支持查找字符在字符串中出现的位置,语法和参数也完全相同,两者的区别是:&/p&&p&FIND函数可以区分英文大小写但是不支持通配符;&/p&&p&SEARCH函数不能区分大小写但是支持通配符。&/p&&p&假设A1单元格内容为“Excel”则=FIND(“e”,A1)返回4,而=SEARCH(“e”,A1)则返回1因为不区分大小写。查找字符第N次出现的位置,比如e在A1单元格内容中第二次出现的位置,=FIND(“@”,SUBSTITUTE(A1,“e”,“@”,2)),其中@可以是任何一个A1中原本没有的字符即可。原理是通过SUBSTITUTE指定将第二个e替换成@,然后再用FIND查找自然就找到了。&/p&&p&&b&一点小扩展&/b&&/p&&p&从右侧开始查找返回特定字符第一次出现的位置。假设要从A1单元格中查找字母e从右边算起第一次出现的位置,使用数组公式 {=MAX((MID(A1,ROW(1:99),1)=“e”)*ROW(1:99))},其中MID函数取出每一个字符进行比对,比对成功的是1,不成功是0,比对结果和ROW相乘返回的是一个比对成功位置数组,此时MAX只是取出最大的那个而已,如果用MIN函数则实现从左侧查找。99只是一个示意数字,只要大于原字符串长度即可。这种办法也适用关键字是字符串的情况,修改相应的MID函数即可。&/p&&h2&6.文本替换&/h2&&p&文本替换函数依然有两个(摔!为什么不能只有一个,写不动了都……),分别是 SUBSTITUTE函数和REPLACE函数。我们分别来说一说。&/p&&p&&b&SUBSTITUTE函数&/b&&/p&&p&函数语法如下:&/p&&blockquote&SUBSTITUTE(text,old_text,new_text,[instance_num])&/blockquote&&p&参数什么意思呢,我们希望针对字符串 text,用新的字符串new_text去替换旧的字符串old_text,还有参数instance_num是可选参数,这个参数厉害了,可以直接指定要替换第几次出现的旧字符串,精准打击!说明三点:&/p&&ul&&li&替换过程隐含查找过程,查找本身是区分大小写的。&/li&&li&new_text为空文本或者逗号之后没有输入相应值则相当于删除旧字符串。&/li&&li&instance_num忽略时,所有旧字符串都将被替换,instance_num指定具体数字时,只有满足要求的那一个才会被替换(注意,是那一个不是从那一个开始)。&/li&&/ul&&p&举几个栗子,体会一下:&/p&&ul&&li&=SUBSTITUTE(&Numashuo Excel 2016&,&excel&,&PPT&)返回&Numashuo Excel 2016&,因为区分大小写,检索不到“excel”,所以不会进行后面的替换。&/li&&li&=SUBSTITUTE(&Numashuo Excel 2016&,&Excel&,&PPT&)返回“Numashuo PPT 2016”,没毛病,本该如此。&/li&&li&=SUBSTITUTE(&Numashuo Excel 2016&,&Excel&,)返回“Numashuo 2016”,没有给出新值字符串,相当

我要回帖

更多关于 e世博主管q 9642359 的文章

 

随机推荐