需要对爬虫爬取的excel做处理,但自己手动处理确实太慢,突然想到了excel中还有个东西叫宏,就打算学一学

求助ai得到代码

发现宏是通过编辑代码来进行编辑的,所以也先直接求助ai

请为我编写我需要的宏的代码。我目标的工作的整个流程如下:
1.我会选中一块横向长度为1,竖向长度变化的区域。这块区域左侧是一系列数字。
2.执行宏
宏的作用如下:
1.将我选中的区域合并
2.将合并区域的内容设置为左侧一系列数字的和
如果你对此还有什么问题,请指出,如果没有问题,请为我编写代码

ai回复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub MergeAndSum()
Dim selectedRange As Range
Dim sumValue As Double

' 检查是否选择了单元格
If Selection.Cells.Count = 1 Then
MsgBox "请先选择一个区域!", vbExclamation
Exit Sub
End If

' 获取当前选择的区域
Set selectedRange = Selection

' 检查选择的区域是否有效
If selectedRange.Columns.Count <> 1 Then
MsgBox "请选择一个横向长度为1的区域!", vbExclamation
Exit Sub
End If

' 初始化总和值
sumValue = 0

' 遍历选择的区域,计算总和
For Each cell In selectedRange
If IsNumeric(cell.Value) Then
sumValue = sumValue + cell.Value
End If
Next cell

' 合并选择的区域
selectedRange.Merge

' 设置合并区域的内容为总和值
selectedRange.Value = sumValue
End Sub

注意:wps运行的是js宏,要以上代码是vba宏,若要参考,请使用excel

尝试运行了一下,果然不行,于是又开始修修改改,不过没想到只改了一次就行了。

最终代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub MergeAndSumLeft()
Dim selectedRange As Range
Dim sumValue As Double

' 检查是否选择了单元格
If Selection.Cells.Count = 1 Then
MsgBox "请先选择一个区域!", vbExclamation
Exit Sub
End If

' 获取当前选择的区域
Set selectedRange = Selection

' 检查选择的区域是否有效
If selectedRange.Columns.Count <> 1 Then
MsgBox "请选择一个横向长度为1的区域!", vbExclamation
Exit Sub
End If

' 初始化总和值
sumValue = 0

' 遍历选择的区域,计算总和
For Each cell In selectedRange
If IsNumeric(cell.Offset(0, -1).Value) Then
sumValue = sumValue + cell.Offset(0, -1).Value
End If
Next cell

' 合并选择的区域
selectedRange.Merge

' 设置合并区域的内容为左侧一系列数字的和
selectedRange.Value = sumValue
End Sub

给宏绑定快捷键

每运行一次宏都要在数个位置点来点去,很麻烦,因此想着给宏绑定一下快捷键。

参照链接:

在Excel中如何使用快捷键运行宏-百度经验 (baidu.com)

将宏设置到全局

上面那种方法设置的宏只能在输入了相关代码的文件中才可用,但我需要处理的是一系列的文件,因此需要将宏设置到全局。

参考这篇:如何使用Excel自定义函数并且全局使用_excel自定义函数怎么共用_coderyeah的博客-CSDN博客

主要过程即为在一个xlsx文件中编辑宏后,保存为xlam格式(c:/用户/主用户/AppData/Roaming/Microsoft/AddIns 目录下,系统默认保存地点就是这里)。之后在“开发者工具”→ “excel加载项” 中勾选对应栏。

学习

代码基础

不同类型的变量的声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
' sheet页
Dim ws As Worksheet
' 设置要操作的工作表
Set ws = ActiveSheet

' 数字
Dim i As Long
i = 1

' 区域,一个或多个连续的单元格
Dim rng As Range
' 定义Ai到A5的区域为rng
Set rng = ws.Range("A" & i & ":A" & 5)

IF

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
If 条件 Then
' 如果条件为真时执行的代码
ElseIf 条件2 Then
' 如果条件2为真时执行的代码
Else
' 如果以上条件都不为真时执行的代码
End If

' 例子
Sub ExampleIfStatement()
Dim num As Integer
num = 10

' 简单的If语句
If num > 5 Then
MsgBox "数字大于5"
End If

' 带有Else的If语句
If num > 15 Then
MsgBox "数字大于15"
Else
MsgBox "数字不大于15"
End If

' 多个条件的If语句
If num > 15 Then
MsgBox "数字大于15"
ElseIf num > 10 Then
MsgBox "数字大于10,但不大于15"
Else
MsgBox "数字不大于10"
End If
End Sub

For

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
' For...Next 循环:
' 用于指定循环次数,通常用于处理数字的范围。它的基本结构如下:

For [变量] = 初始值 To 终止值
循环代码
Next [变量]

示例:

Sub ForLoopExample()
Dim total As Integer
total = 0

For i = 1 To 10
total = total + i
Next i

MsgBox "总和为:" & total
End Sub

''-------------------------------------------------------------------''
For Each...Next 循环:
用于循环遍历集合、数组或范围中的元素,而不需要指定循环次数。

For Each [元素] In 集合
' 循环代码
Next [元素]

示例:

Sub ForEachLoopExample()
Dim arr() As Integer
arr = Array(1, 2, 3, 4, 5)

For Each num In arr
MsgBox "元素的值为:" & num
Next num
End Sub

获取对象

获取单元格

1
2
3
4
' 通过行与列获取单元格
Set cell1 = ws.Cells(x, y)
' 通过已有单元格偏移获取单元格
Set cell2 = cell1.Offset(1, 1) ' 向下偏移1行,向右偏移1列,偏移量可为负数

获取一列

1
2
3
4
5
6
7
8
9
10
11
Set selectedRange = Selection ' 获取选择的列
' 遍历选定列的每个单元格
lastRow = selectedRange.Cells(selectedRange.Rows.Count, 1).End(xlUp).Row
For Each cell In selectedRange
If IsEmpty(cell) Then
cell.value = cell.Offset(-1, 0).value '设置单元格的值
End If
If cell.Row = lastRow Then
Exit For
End If
Next cell

获取当前正在操作的工作表作为对象

1
2
3
4
5
6
7
8
' 检查是否选择了工作表
If ActiveSheet Is Nothing Then
MsgBox "请先选择一个工作表!", vbExclamation
Exit Sub
End If

' 设置要操作的工作表
Set ws = ActiveSheet

获取第n列最后一行的行号

1
2
' 获取工作表中第n列最后一行的行号
lastRow = ws.Cells(ws.Rows.Count, n).End(xlUp).Row

excel操作

行列的插入与删除

1
2
3
4
5
6
7
8
' 插入新列在第n列之前
Columns(n).Insert Shift:=xlToRight
' 在第n行前插入一行
ws.Rows(n).Insert Shift:=xlShiftDown
' 删除第n行
ws.Rows(n).Delete
' 删除第n列
ws.Columns(n).Delete

合并与解散单元格

1
2
3
4
5
' 设置合并区域,Ax为左上角,By为右下角
Set mergeRange = ws.Range("A" & x & ":B" & y)
mergeRange.Merge
' 解除合并
mergedRange.UnMerge

常用宏示例

解开所有合并的单元格,然后删除页面中的空行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub DeleteBlankRows()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim rng As Range
' 检查是否选择了工作表
If ActiveSheet Is Nothing Then
MsgBox "请先选择一个工作表!", vbExclamation
Exit Sub
End If

' 设置要操作的工作表
Set ws = ActiveSheet

' 取消合并所有单元格
On Error Resume Next ' 忽略错误,以防某些单元格没有合并
Set mergedRange = ws.Cells
mergedRange.UnMerge
On Error GoTo 0 ' 恢复错误处理

' 获取工作表中最后一行的行号
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' 循环遍历每一行,从最后一行向上查找空行并删除
For i = lastRow To 1 Step -1
If Application.WorksheetFunction.CountA(ws.Rows(i)) = 0 Then
' 如果行中没有非空单元格,则删除该行
ws.Rows(i).Delete
End If
Next i
End Sub

进阶示例

以下为一个vba宏代码的示例。作用的场景是一个第三列为数字,第四列为多个合并了的单元格的表格。作用是在第三列与第四列之间插入一个新列,新列的布局同原本的第四列,但内容是相邻的第三列数字的和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Sub test()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim cell As Range
Dim mergeRange As Range
Dim sumRange As Range
Dim cellHeight As Long
Dim value As Long

' 检查是否选择了工作表
If ActiveSheet Is Nothing Then
MsgBox "请先选择一个工作表!", vbExclamation
Exit Sub
End If

' 设置要操作的工作表
Set ws = ActiveSheet

' 获取工作表中最后一行的行号
lastRow = ws.Cells(ws.Rows.Count, 4).End(xlUp).Row

' 插入新列在第四列之前
Columns(4).Insert Shift:=xlToRight
i = 1
For Each cell In ws.Range("E1:E" & lastRow)
If Not IsEmpty(cell) Then
' 如果第四列中有数据
If cell.MergeCells Then
' 如果单元格是合并单元格,获取合并单元格的长度
cellHeight = i + cell.MergeArea.Rows.Count - 1
' 合并新的单元格
Set mergeRange = ws.Range("D" & i & ":D" & cellHeight)
mergeRange.Merge
Set sumRange = ws.Range("C" & i & ":C" & cellHeight)
value = WorksheetFunction.Sum(sumRange)
mergeRange.value = value
i = cellHeight + 1
Else
Set mergeRange = Range("D" & i)
Set sumRange = Range("C" & i)
mergeRange.value = sumRange.value
i = i + 1
End If
End If
Next cell
End Sub