1.分行函数 弹出一个窗口输入分隔符 只能选择连续的区域(按列选,或单个单元格或单元格区域)
将这些数据按分隔符分开,并复制非本列的数据
分行后本列数据被分,其余列数据保持一致
function SplitRows(){
if(Selection.Columns.Count > 1){
MsgBox("只能同时分一列数据!");
}else{
let x = InputBox("请输入分隔符", "分行");
if(x == "\\n")x = '\n';
if(x){
let anchorPoint = Selection.Address();
let res = anchorPoint.split(':')[0];
res = res.split('$')
let col = res[1];//获取列标
let row = 0;
let max = 0;
if(res.length > 2){
row = parseInt(res[2]);//获取行号
max = Selection.Rows.Count + row;//计算最大行号
}else {
row = 1;
max = Selection.Cells(Selection.Rows.Count,1).End(xlUp).Row + 1;
}
let offset = 0;//处理时会不断插入行,记录插入的行数
for(let i = row;i < max + offset;i++){
let data = Range(col + i).Value2;
if(data && typeof(data)=='string'){//跳过空白单元格
res = data.split(x);
res.filter((item,index,array) => { return item; });
let length = res.length;//分行后的结果数
if(length > 1){//只有结果数大于1需要处理
//console.log(length);
offset = offset + length - 1;
for(let j = 1;j < length;j++){
//console.log(j);
Rows(i).Copy(undefined);
Rows(i + 1).Select();
Selection.Insert(xlShiftUp, undefined);
}
for(let j = 0;j < length;j++)Range(col + (i + j)).Value2 = res[j];
i = i + length - 1;
}
}
}
}else MsgBox("分隔符不能为空!");
}
}
2.合并单元格函数
只能选择连续的区域(按列选,或单个单元格或单元格区域)
将连续的区域合并
//Columns(1).Address().split('$')[2]数字转列码 console.log(Columns('A').Column);列码转数字
//console.log(Range("A1").MergeArea.Address());获取被合并到的单元格
//区域内不能存在合并的单元格 可先拆分并填充内容再处理
function MergeAdjacentContent(){
let anchorPoint = Selection.Address();
let res = anchorPoint.split(':')[0];
res = res.split('$')
let col = Columns(res[1]).Column;//获取列标
let row = 0;
let maxRow = 0;
let maxCol = Selection.Columns.Count + col;
if(res.length > 2){
row = parseInt(res[2]);//获取行号
maxRow = Selection.Rows.Count + row;//计算最大行号
}else {
row = 1;
maxRow = Selection.Cells(Selection.Rows.Count,1).End(xlUp).Row + 1;
}
let map = new Map();
//遍历区域计算分布
for(let j = col;j < maxCol;j++){
let colStr = Columns(j).Address().split('$')[2];
for(let i = row;i < maxRow;i++){
let data = Range(colStr + i).Value2;
if(data){//忽略空白单元格
if(map.has(data)){
map.set(data, Union(map.get(data), Range(colStr + i)));
}else map.set(data, Range(colStr + i));
}else if(Range(colStr + i).MergeCells){//如果是合并的单元格,以左上角的值为准
let cell = Range(colStr + i).MergeArea.Address().split(':')[0];
while(cell.indexOf('$')!=-1)cell = cell.replace('$', '');
data = Range(cell).Value2;
if(data){//忽略空白单元格
if(map.has(data)){
map.set(data, Union(map.get(data), Range(colStr + i)));
}else map.set(data, Range(colStr + i));
}else console.log("空单元格");
}
else console.log("空单元格");
}
}
//Map遍历
for(let [key, value] of map){
value.Select();
//console.log("取值" + key + "的所属区域为" + Selection.Address());
let r = Selection.Address().split(',');
for(let i = 0;i < r.length;i ++){
if(r[i].indexOf(':') != -1)Range(r[i]).Merge();//存在:说明为区域,进行合并
}
}
}
3.展开IP段函数
//输入IP范围 将其展开为一个个IP 格式 xxx.xxx.xxx.xxx/xx x代表数字0-9
//展开格式 xxx.xxx.xxx.xxx
function ExpandIPRange(x){
let res = x.Value2.split('/');
let mask = parseInt(res[1]);//取出掩码
let IPList = res[0].split('.');
for(let i = 0;i < 4;i ++)IPList[i] = parseInt(IPList[i]);//将IP转化为数字
//计算不变点的位置
let pos = Math.floor(mask / 8);
let offset = mask % 8;
let rank = Math.pow(2, 8 - offset);
IPList[pos] = Math.round(Math.floor(IPList[pos] / rank) * rank);
//计算统一的前缀
let prefix = "";
let tmp = "";
let result = "";
if(pos > 0){
prefix = prefix + IPList[0]
for(let i = 1;i < pos; i ++)prefix = prefix + '.' + IPList[i];
}
for(let i = 0;i < rank;i ++){
if(pos > 0)tmp = prefix + '.' + (IPList[pos] + i);
else tmp = prefix + i;//计算可变点的值,并加入前缀
if(pos < 3)//只有可变点后面还有才需要计算
for(let j = pos + 1;j < 4;j ++)
for(let k = 0;k < 255; k ++){
tmp = tmp + '.' + k;
}
result = result + tmp + '\n';
}
return result;
}