在今年的国考职位表出炉后,我去浏览了一下,发现计算机专业可以报考的职位还是不少的


以中央党群机关职位表为例(部分无关字段已隐藏)
那么问题来了,到底哪个专业在国考中可报考的职位范围是最广的呢?(这里我们暂且不考虑每个职位的招考人数和职位表中各专业的包含关系)即

如何获得职位与专业的一对多的关系呢?

首先想到的是对L列以“、”为分隔符进行“数据”-“分列”,但是由于L列的各个单元格中顿号个数不一致,少的没有,多的可能有7个,在L列右侧新建列的话,不知道建多列才合适,即使这样分列成功了也不好统计各专业在各职位中的分布情况。
后来百度中发现,在VBA中有一个Split的函数,貌似就是对应Excel中的“数据”-“分列”,用法:

Split函数:返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
Split(expression[, delimiter[, limit[, compare]]])
Split函数语法有如下命名参数:
expression:必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(“”),Split则返回一个空数组,即没有元素和数据的数组。
delimiter:可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(” “)作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的 expression字符串。
limit :可选的。要返回的子字符串数,–1表示返回所有的子字符串。
compare:可选的。数字值,表示判别子字符串时使用的比较方式。关于其值,请参阅“设置值”部分。
设置值
compare参数的设置值如下:
|常数|值|描述|
|vbUseCompareOption | –1 | 用Option Compare语句中的设置值执行比较。
|vbBinaryCompare | 0 | 执行二进制比较。
|vbTextCompare | 1 | 执行文字比较。
|vbDatabaseCompare | 2 | 仅用于Microsoft Access。基于您的数据库的信息执行比较。

ExcelHome原文链接
原文中还针对含有limit参数的情况进行了讨论,在此我们不涉及。

所以对于图中的情况,我们只需要一句:

arr = Split(Sheets("中央党群机关").Range("l" & i), "、")  

其中用数组arr存储Split的结果,i代表原始sheet中的行号

  • 当然这中间还涉及到如何表示重命名过的sheet的问题,原来的sheet1、sheet2直接引用就可以了,现在的sheet的名称为”中央党群机关”,百度了一下才知道可以写成Sheets(“名称”),当然后来也看到了这个

想是写成sheet1的话也应该没问题吧。
下面的问题就是如何在VBA使用数组,并为单元格或单元格区域赋值的问题。
以单元格L2为例,这里我们把“法学、侦查学”分隔成了数组“法学”“侦查学”,那么如何把这个数组的值赋给sheet2中的单元格B2和B3呢?
这里涉及到数组的转置、UBound和单元格的Resize,直接上代码:

Sheet2.Range("b" & j).Resize(UBound(arr) + 1, 1) = Application.WorksheetFunction.Transpose(arr)  

其中用j来记录每一个Spilt的数组结果赋值到sheet2的B列时的起始行位置。
Application.WorksheetFunction.Transpose(arr)是数组转置,Application.WorksheetFunction这个现在对我还处于不明觉厉的状态,但是反正我知道这个可以把“法学”“侦查学”变成
“法学”
“侦查学”
UBound是求数组下标的最大值。
Sheet2.Range(“b” & 2 ).Resize(UBound(arr) + 1, 1)就是把B2格变成了以B2为起始的2行1列的区域,正好用来接收arr转置后的赋值。
最终的代码:

Sub a()
Dim i, j As Integer
j = 2  '用j来记录每一个Spilt的数组结果赋值到sheet2的B列时的起始行位置
For i = 2 To 252   'i代表原始Sheets("中央党群机关")中的行号
arr = Split(Sheets("中央党群机关").Range("l" & i), "、") '分列
Sheet2.Range("b" & j).Resize(UBound(arr) + 1, 1) = Application.WorksheetFunction.Transpose(arr)    '将“专业”一列中的分列结果赋值给sheet2的B列
Sheet2.Range("a" & j).Resize(UBound(arr) + 1, 1) = Sheets("中央党群机关").Range("i" & i)'将“职位代码”一列中的分列结果赋值给sheet2的A列
Sheet2.Range("c" & j).Resize(UBound(arr) + 1, 1) = Sheets("中央党群机关").Range("b" & i)'将“部门名称”一列中的分列结果赋值给sheet2的C列
Sheet2.Range("d" & j).Resize(UBound(arr) + 1, 1) = Sheets("中央党群机关").Range("d" & i)'将“单位性质”一列中的分列结果赋值给sheet2的D列
j = j + UBound(arr) + 1 '将j以上一个分列出的数组大小为步长向下移动
Next i
End Sub

这样就在sheet2中获得了每个专业对应每个部门的情况。

其实“职位代码”可能就类似于职位表中的主键了,接下来可以多写几个类似于Sheet2.Range("a" & j).Resize(UBound(arr) + 1, 1) = Sheets("中央党群机关").Range("i" & i)的语句,把Sheets(“中央党群机关”)中关心的列对应过来,也可以把Sheets(“中央党群机关”)和sheet2导入数据库做个join,就可以进行各种统计了。

使用VBA在Excel中分列相关推荐

  1. 利用VBA将excel中链接转换为图片形式存放在指定的单元格中

    利用VBA将excel中链接转换为图片形式存放在指定的单元格中 VBA代码如下 Private Declare Function URLDownloadToFile Lib "urlmon& ...

  2. VBA把excel中的图表复制到PPT中

    可以使用 VBA 将 Excel 中的图表复制到 PowerPoint 中,只需执行以下几步:1. 在 Excel 工作簿中打开图表:2. 按住 "Ctrl" 键,并选择图表:3. ...

  3. VBA在Excel中的应用(一):改变符合条件单元格的背景颜色

    Jiahua Jin VBA在Excel中的应用(一):改变符合条件单元格的背景颜色 在使用excel处理数据的时候,为了能更清晰的标示出满足特定条件的单元格,对单元格添加背景色是不错的选择.手工处理 ...

  4. 通过VBA在excel中实现股票历史数据查询和K线趋势图绘制(完整的excel原件可以在我的资源中下载)

    原始文件下载地址:股票历史数据和K线图趋势线的绘制-VB文档类资源-CSDN下载 文章目录 前言 一.目标 二.方法 三.界面和使用说明 四.代码说明 1.查询历史数据 2.绘制K线图和趋势线 3.清 ...

  5. 1.VBA实现EXCEL中Sheet1的 甲列 相同数值的行对应的乙列的数的和作为Sheet2中丙列中与Sheet1中甲列 相同的行对应的丁列的值...

    今天有一同学,喊我帮忙处理EXCEL中数据的问题,题目表述太含糊,简单说,分3步工作: 1)找出SHEET1的"甲列"中相同的行, 2)把相同的行对应的"乙列" ...

  6. 调试经验——使用VBA在Excel中打开Word文档(Open Word file in Excel with VBA)

    VBA的一个强项是可以跨应用操作,特别是在office各程序内部.以下代码实现了在Excel中打开Word文档. 代码: Sub openWord() '在Excel中打开Word文档 ' 'Dim ...

  7. Python VS VBA 读取Excel中的文本框组件

    作者:小小明 Python读取Excel的文本框 基本需求 今天看到了一个很奇怪的问题,要读取Excel文件的文本框中的文本,例如这种: 本以为openxlpy可以读取,但查看openxlpy官方文档 ...

  8. 使用VBA对Excel中的单元格按色阶赋颜色

    Excel中对单元格赋值,可以通过Cells(row, column).Interior.Color这个属性赋值.但这是一个十进制数,范围是0-16777215. 属于long长整形. 通常对颜色赋值 ...

  9. VBA将excel中的多个工作表sheet合成一个工作表,多个工作簿的多个工作表合并为一个工作簿

    1 将excel中的多个工作表sheet合成一个工作表 工作表合成前: 工作表合成后: **第一步:**在文件中新建一个工作表sheet,用来存放合成后的数据,如图所示: 第二步:点击"开发 ...

最新文章

  1. Linux is执行程序命令,linux命令执行过程详解
  2. This version of CLI is only compatible with Angular versions
  3. [BUUCTF-pwn]——ciscn_2019_s_4
  4. Word 2010 制作文档结构之图标自动编号设置
  5. 所需依赖_注意细节,阿里架构师一文详解SpringDI的四种依赖注入方式
  6. c语言递归算法实验报告,递归算法实验报告.docx
  7. matepad适配鸿蒙,消息称华为 MatePad2 搭载骁龙888 4G 华为鸿蒙OS计划适配高通平台...
  8. Setup the FD.io Repository - Centos 7
  9. 关于子元素连续数字和英文内容溢出父元素的问题
  10. css3如何链如外部字体,微信小程序引入外部字体总结(针对安卓加载缓慢问题)...
  11. windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
  12. Oracle用户权限分配的具体方法
  13. new一个对象的完整过程
  14. 基于Android studio的WIFI搜索显示与WIFI打开
  15. H5直播之MSE(Media Source Extensions)
  16. 9 摄像头视频实时传输
  17. cs224u GloVe词向量方法
  18. 【西语】【3】Tu papa es pirata, o por que eres un tesoro 你爸爸是海盗吗,不然为什么你是个宝藏
  19. 生产环境LVM卷ext4文件系统故障修复处理
  20. Tomcat 服务器的部署

热门文章

  1. 基于胡诌的物理光照模型
  2. 【紫光同创logos2 FPGA PCIe软件栈设计】
  3. 我给公司用了这款工具,领导直接给我涨了两千工资
  4. math@多项式@求和式乘法@代数学基本定理
  5. anaconda注册账号以及实现虚拟环境的复制
  6. 《软件开发原则》之“给中国软件工程师的寄语”
  7. 达内2018前端设计相关最新
  8. C# 静态类(static class)
  9. HHVM jit过程
  10. mysql数据处理软件_详说 Navicat for MySQL 数据处理工具