C'est la vie

生きてる事が 時には辛くて

0%

Excel VBA里的一些常用代码和经验分享

破解加密过的Excel文件(.xls)

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
Private Sub VBAPassword() '你要解保护的Excel文件路径(把要解除的excel保存为2003-97 xls)
Filename = Application.GetOpenFilename("Excel文件(*.xls & *.xla & *.xlt),*.xls;*.xla;*.xlt", , "VBA解除")
If Dir(Filename) = "" Then
MsgBox "没找到相关文件,清重新设置。"
Exit Sub
Else
FileCopy Filename, Filename & ".bak" '备份文件。
End If
Dim GetData As String * 5
Open Filename For Binary As #1
Dim CMGs As Long
Dim DPBo As Long
For i = 1 To LOF(1)
Get #1, i, GetData
If GetData = "CMG=""" Then CMGs = i
If GetData = "[Host" Then DPBo = i - 2: Exit For
Next
If CMGs = 0 Then
MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"
Exit Sub
End If

Dim St As String * 2
Dim s20 As String * 1
'取得一个0D0A十六进制字串
Get #1, CMGs - 2, St
'取得一个20十六制字串
Get #1, DPBo + 16, s20
'替换加密部份机码
For i = CMGs To DPBo Step 2
Put #1, i, St
Next
'加入不配对符号
If (DPBo - CMGs) Mod 2 <> 0 Then
Put #1, DPBo + 1, s20
End If
MsgBox "文件解密成功......", 32, "提示"
Close #1
End Sub

代码是在网上随便找的,具体出处记不清了,随便找找就能找到了。可能是这个:如何解除Excel VBA工程密码

具体使用方法就是:

1、将你要解除的Excel文件关闭,另存为2003版格式(.xls)

2、在本文件里按Alt+F11,然后点击运行,打开第一步另存为2003版格式的Excel表格即可。

获取保存在onedrive里的文件的路径

onedrive是微软的一个很好用的同步网盘,一般会把工作相关的文件保存在这上面,与office办公套件(Word、Excel、PowerPoint)和Microsoft 365会员等配合,可以启用这些软件的自动保存功能,就是每次编辑完之后都会自动保存,这样就不用担心突然断电导致文档没保存了,不过这种情况下,文件其实是保存在网上的,如果用VBA的命令ThisWorkbook.Path去获取文件地址,会得到一个类似https://d.docs.live.net/abcdefghijklmn/测试文件夹的网络地址,而不是正常的E:\Onedrive\测试文件夹本地路径(这里以onedrive文件夹是放在E:下的)

由于平时用的Excel文件里的有些VBA程序在运行时会用所在文件的路径,用上面的网络地址的话会出现问题,所以写了一个简单的获取本地路径的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub 获取文件本地路径()
'先获取一下返回的文件地址
mypath = ThisWorkbook.Path

'判断一下是否是网络地址,如果是网络地址就将网络地址的部分替换掉,同时还要把原来地址里的/改为\
If InStr(mypath, "https://d.docs.live.net/") Then
'这里的Split(ThisWorkbook.Path, "/")方法是用 "/"符号为分隔符号,将前面的ThisWorkbook.Path里的地址分成若干个元素,并取出第3个元素,其中第0个元素是https: 第1个是空 第2个是d.docs.live.net 第3个是abcdefghijklmn 第4个是测试文件夹
'Environ("OneDrive")是为了得到onedrive所在文件夹的路径,这里是E:\Onedrive
'得到第3个元素abcdefghijklmn之后用onedrive所在文件夹的路径替换掉,再把地址里的/改为\,这样就得到了正常的本地路径
mypath = Replace(mypath, "https://d.docs.live.net/" & Split(ThisWorkbook.Path, "/")(3), Environ("OneDrive"))
mypath = Replace(mypath, "/", "\")
End If

'输出原来的结果,结果为 https://d.docs.live.net/abcdefghijklmn/测试文件夹
Debug.Print ThisWorkbook.Path

'输出转换后的结果,E:\Onedrive\测试文件夹
Debug.Print mypath

End Sub

有些Excel文件打开后无法运行VBA,因为VBE6EXT.OLB不能被加载

具体现象就不描述了,反正就是VBA无法运行,如果打开【开发工具】(或者按Alt+F11也可以打开),选【Visual Basic】打开VBA界面,之后选【工具】-【引用】,一般会发现这里面提示有些错误,大概意思就是找不到VBE6EXT.OLB文件的路径,里面列出来的路径一般是WPS的,打开这个路径之后也的确找不到VBE6EXT.OLB文件,所以应该就是WPS导致的问题

具体解决办法如下,网上也有一些相关的内容,但是没找到我当时看的那个文章,这里就不放链接了:

1、快捷键 Win+R 进入运行

2、运行输入框 输入Regedit.exe (不区分大小写)回车

3、修改 HKEY_CLASSES_ROOT\TypeLib{0002E157-0000-0000-C000-000000000046}\5.3\0\win32 的数据值为自己的 VBE6EXT.OLB的路径,我这里的路径为 C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB

4、重启Office

VBA与selenium爬虫

可以参考这个视频【VBA如何系列】如何在VBA中使用Selenium爬动态网页

视频里的步骤如下:

1
2
3
4
5
6
1、去 https://github.com/florentbr/SeleniumBasic/releases 下载selenium for VBA
2、安装对应浏览器的驱动 https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/install_drivers/
下载的要和浏览器版本相匹配
3、把下载出来的driver文件放到第一步selenium的安装路径里 C:\Users\lenovo\AppData\Local\SeleniumBasic
4、下载ms.net 3.5 这个可能大多数电脑都已经装过了,我跳过了
5、在vbab编辑界面中选【工具】-【引用】,选择 Selenium Type Library

还有一篇文章也可以参考:vba中使用Selenium

其他一些命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'这样可以显示excel状态栏
Application.DisplayStatusBar = true
'可以在状态栏里输出一些东西
Application.StatusBar = "输出的内容"


'在运行计算程序之前先把屏幕刷新关了,等计算结束再打开,可以加快计算速度
Excel.Application.ScreenUpdating = False '关闭
Excel.Application.ScreenUpdating = True '打开


'控制自动重算的命令(是在【文件】-【选项】-【公式】-【工作簿计算】里,有时候也会影响计算速度,需要关闭自动重算之后再运行代码可能会快一点
Application.Calculation = xlAutomatic '对应【工作簿计算】里自动重算选项
Application.Calculation = xlManual '对应【工作簿计算】里手动重算选项


'一个经常会出错的点
'单元格作为参数传入函数后其实是二维数组
'需要用transpose函数转成一维数组后再用
XX_arr = Excel.Application.WorksheetFunction.Transpose(XX_range)