分享

VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件...

 F2967527 2022-06-24 发布于北京

目录

1.各种数据类型

2.VBA定义公共数组(全局都可以使用)

3.读写文件

SJIS 写入

UTF8 写入

读取 SJIS

读取 UTF-8

4.异常处理

5.忽略错误

6.其他常用1

7.其他常用2:读取(多个)Excel文件

8. ★★★ 各种常用操作总结 ★★★

9.事件相关处理 (保存,离开单元格等操作时,触发处理)

10.定义(调用)有返回值的函数

11.使用VBA操作IE浏览器

12.Variant   变量类型

13.调用bat (使用cmd,直接运行程序)

14.调用Jar,并获取返回值

核心代码

具体内容

15.循环(For、While)

For

While

16.Excel-VBA:列号与字母(列名)的相互转换 

17.使用VBA给单元格设置公式 :( FormulaR1C1 )

18.XXX


---

1.各种数据类型

---

  1. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. '*
  3. '*  自定义学生对象
  4. '*  做成时间:2020/01/20
  5. '*  做成者: sun
  6. '*  跟新日:
  7. '*  更新者:
  8. '*
  9. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  10. Type STUDENT_INFO
  11.     '学号
  12.     stuNo As String
  13.     stuName As String
  14.     stuAge As String
  15.     stuSexCode As String
  16. End Type
  17. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  18. '*
  19. '*  定义各种数据类型,处理学生对象情报
  20. '*  做成时间:2020/01/20
  21. '*  做成者: sun
  22. '*  跟新日:
  23. '*  更新者:
  24. '*
  25. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  26. Sub getStudentInfo()
  27.     ' 从Excel的Sheet页中取得情报 例子
  28.     ' Dim sheet As Worksheet
  29.     ' Set sheet = Worksheets("testSheetName")
  30.     ' cellValue = sheet.Cells(2, 3) '2C 单元格 "1001,张三,30,1、1002,李四,31,1、1003,XiaoHong,29,2"
  31.     ' MsgBox cellValue
  32.     ' 全部学生信息 以字符串形式保存
  33.     Dim allStudentInfo As String
  34.     allStudentInfo = "1001,张三,30,1、1002,李四,31,1、1003,XiaoHong,29,2"
  35.     ' 全部学生信息 以数组形式保存【数组使用】
  36.     Dim studentInfoList() As String
  37.     studentInfoList = Split(allStudentInfo, "、")
  38.     ' 全部学生姓名信息 以key-学号  value-姓名 的Map形式保存
  39.     Dim studentDataList As Object '【数据字典使用-定义】
  40.     Set studentDataList = CreateObject("Scripting.Dictionary")
  41.     ' UBound 返回数组的上界 ,★★★不是数组的大小★★★比如数组大小时4,那么上届是3
  42.     For i = 0 To UBound(studentInfoList)
  43.         ' 循环设定每个学生的信息
  44.         Dim stuObject As STUDENT_INFO '【自定义数据类型使用】
  45.         stuObject = setStudentInfo(studentInfoList(i))
  46.         ' 以学号作为Key,存储上面设定好的学生的信息
  47.         ' studentDataList.Add stuObject.stuNo, stuObject  '不好用,无法保存自定义对象
  48.         studentDataList.Add stuObject.stuNo, stuObject.stuName '【数据字典使用 - 设定值】
  49.     Next
  50.     ' 显示学号是「1002」小明同学的信息
  51.     If studentDataList.exists("1002") Then '【数据字典使用 - 取值】
  52.         MsgBox studentDataList.Item("1002") '【数据字典使用 - 取值】
  53.     End If
  54. End Sub
  55. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  56. '*
  57. '*  设定单个学生对象情报
  58. '*  做成时间:2020/01/20
  59. '*  做成者: sun
  60. '*  跟新日:
  61. '*  更新者:
  62. '*
  63. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  64. Public Function setStudentInfo(studentInfo As String) As STUDENT_INFO
  65.     ' 单个学生的信息
  66.     Dim infos() As String
  67.     infos = Split(studentInfo, ",")
  68.     ' 使用上面定义的学生对象
  69.     Dim stuObject As STUDENT_INFO
  70.     stuObject.stuNo = infos(0)
  71.     stuObject.stuName = infos(1)
  72.     stuObject.stuAge = infos(2)
  73.     stuObject.stuSexCode = infos(3)
  74.     ' 设定返回值
  75.     setStudentInfo = stuObject
  76. End Function

----

2.VBA定义公共数组(全局都可以使用)

  1. public sqlList
  2. public Function sql_init()
  3. ActiveWorkbook.sheets("sql").Activate
  4. ActiveWorkbook.sheets("sql").Select
  5. var1 = ActiveSheet.Range("C2").value
  6. var2 = ActiveSheet.Range("C3").value
  7. var3 = ActiveSheet.Range("C4").value
  8. sqlList= Array(var1, var2, var3)
  9. End Function

扩展

「プロシージャの外では無効です」错误发生原因
只写了End,而没有写 End Function

----

3.读写文件

ファイルの操作(Shift-JIS/UTF8対応)[ExcelのVBA]

SJIS 写入

  1. Private Sub CommandButton2_Click()
  2. Dim fileNo As Integer ' ファイル番号
  3. ' ファイルを開く為のファイル番号を取得
  4. fileNo = FreeFile
  5. ' 指定されたファイルを開く(ない場合は作成する)
  6. Open "Sjisの書き込みテスト.txt" For Output As #fileNo
  7. ' 一行毎に文字列を書き込む
  8. Print #fileNo, "エクセル講座"
  9. Print #fileNo, "http://www./excel/excel.html"
  10. Close #fileNo
  11. End Sub

UTF8 写入

  1. Private Sub CommandButton4_Click()
  2. Dim Stream As Object
  3. ' VB標準のADODB.Streamオブジェクトを作成する
  4. Set Stream = CreateObject("ADODB.Stream")
  5. ' ストリームの文字コードをUTF8に設定する
  6. Stream.Charset = "UTF-8"
  7. ' ファイルのタイプ(1:バイナリ 2:テキスト)
  8. Stream.Type = 2
  9. ' ストリームを開く
  10. Stream.Open
  11. ' ストリームの保存形式をテキスト形式にする
  12. Stream.WriteText "エクセル講座" & vbCrLf & "http://www./excel/excel.html"
  13. ' ストリームに名前を付けて保存する(1は新規作成 2は上書き保存)
  14. Stream.SaveToFile ("utf8の書き込みテスト.txt"), 2
  15. ' ストリームを閉じる
  16. Stream.Close
  17. Set Stream = Nothing
  18. End Sub

--

读取 SJIS

  1. Option Explicit
  2. Private Sub CommandButton1_Click()
  3. Dim fileNo As Integer ' ファイル番号
  4. Dim buffer As String ' 一時的に文字列を格納
  5. ' ファイルを開く為のファイル番号を取得
  6. fileNo = FreeFile
  7. ' 指定されたファイルを開く
  8. Open "C:\excel_vba_22_sjis.txt" For Input As #fileNo
  9. ' ファイルがEOF(ファイルの終端)になるまでループをする
  10. Do Until EOF(fileNo)
  11. ' ファイルから一行づつbufferに読み込む
  12. Line Input #fileNo, buffer
  13. ' 読み込んだ一行をイミディエイトに出力
  14. Debug.Print buffer
  15. Loop
  16. Close #fileNo
  17. End Sub

读取 UTF-8

  1. Private Sub CommandButton3_Click()
  2. Dim buffer As String ' 一時的に文字列を格納
  3. Dim Stream As Object
  4. ' VB標準のADODB.Streamオブジェクトを作成する
  5. Set Stream = CreateObject("ADODB.Stream")
  6. ' ストリームの文字コードをUTF8に設定する
  7. Stream.Charset = "UTF-8"
  8. ' ファイルのタイプ(1:バイナリ 2:テキスト)
  9. Stream.Type = 2
  10. ' ストリームを開く
  11. Stream.Open
  12. ' ストリームにファイルを読み込む
  13. Stream.LoadFromFile ("C:\excel_vba_22_utf8.txt")
  14. ' ファイルの中身をbufferへ代入
  15. buffer = Stream.ReadText
  16. ' ストリームを閉じる
  17. Stream.Close
  18. ' イミディエイトへ出力
  19. Debug.Print buffer
  20. Set Stream = Nothing
  21. End Sub

--

4.异常处理

  1. Function
  2. On Error GoTo err_handle
  3. 。。。
  4. Exit Function
  5. err_handle:
  6. MsgBox "Error!"
  7. End Function

---

5.忽略错误

  1. Function
  2. On Error resume next
  3. 。。。
  4. End Function

resume [rɪˈzjuːm]  n. 摘要;简历   v. 重新开始,恢复;取回,重新占用

---

6.其他常用1

根据一览,自动生成Sheet页_sun0322-CSDN博客

7.其他常用2:读取(多个)Excel文件

Excel VBA 循环读取一个目录下面多个文件的内容,放到另外一个文件中_sun0322-CSDN博客_vba循环读取文件夹下的文件

8. ★★★ 各种常用操作总结 ★★★

  1. ' 有时即使光标到了A1,因为滚动条的原因,显示效果并不是在最上面,此时要使用下面语句
  2. ActiveWindow.SmallScroll Down:=-2000
  3. ' 对公式进行计算
  4. ActiveSheet.Calculate
  5. ’多个Excel直接发生切换时,使用下面的语句(参数是,要切换到的Excel的名字,不含路径)
  6. ' (对于不是通过代码打开的 Excel文件)
  7. Windows(operateFileName).Activate
  8. ' 对于代码打开的Excel,直接使用下面语句即可切换
  9. Set workbook2 = Workbooks.Open("pathAndName", UpdateLinks:=0)
  10. workbook2.Activate
  11. Sheets("xxx").Select
  12. '关闭打开Excel (不保存)
  13. workbook2.Close savechanges:=False
  14. '【sheet】复制
  15. workbook2.Activate
  16. Sheets("copySheet").Select
  17. Sheets("copySheet").Copy After:workbook1.Sheets(10)
  18. '【sheet】重命名
  19. workbook1.Activate
  20. Sheets("copySheet (2)").Select
  21. Sheets("copySheet (2)").Name = copySheet_比較用
  22. '【sheet】删除
  23. Sheets("copySheet_比較用").select
  24. Application.DisplayAlerts = False
  25. ActiveWindow.SelectedSheets.Delete
  26. ’【单元格】复制,粘贴
  27. Range("A1:C20").Select
  28. Selection.copy
  29. Range("E1").Select
  30. ActiveSheet.Paste
  31. ’【单元格】复制,粘贴 【公式 ⇒ 值】
  32. Rang("A1:C20").Select
  33. Selection.copy
  34. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
  35. ’【单元格】删除指定行 (例:删除11到20行)
  36. Rows("11:20").Select
  37. Selection.Delete Shift:=xlUp
  38. ' goto A1 ' 遍历所有Sheet页 ' 保存
  39. Dim sh As Worksheet
  40. For Each sh In ActiveWorkbook.sheets
  41. sh.Activate
  42. sh.Range("A1").Activate
  43. Next
  44. ActiveWorkbook.Sheets(1).Activate
  45. ActiveWorkbook.Save

===

9.事件相关处理 (保存,离开单元格等操作时,触发处理)

指定单元格里面的,内容发生变化,触发事件,调用VBA代码。_sun0322的博客-CSDN博客_单元格变化触发vba

--

10.定义(调用)有返回值的函数

---

  1. ' 定义有返回值的函数
  2. public Function checkValue() As Integer
  3. If XXX then
  4. ' 设定函数的返回值 ’× :set checkValue = 1
  5. checkValue = 1
  6. Exit Function
  7. End If
  8. checkValue = 0
  9. End Function
  10. ' 调用函数
  11. flg = checkValue
  12. If flg <> 0 Then
  13. 。。。
  14. End If

---

11.使用VBA操作IE浏览器

VBS操作IE ---(【当不使用IE时】可以使用Chrome插件,自定义JS插件操作浏览器)_sun0322的博客-CSDN博客_vbs 浏览器

12.Variant   变量类型

  1. Private Sub CommandButton1_Click()
  2. 'Declare 【Variant】 variable
  3. Dim areaA As Variant
  4. 'Set 【Variant variable】Value '可以使用F3中定义的变量
  5. areaA = Range("D6:F9")
  6. 'Use the 【Variant】 variable
  7. var1 = areaA(2, 2)
  8. var2 = areaA(4, 3)
  9. MsgBox "var1:" & var1 & Chr(10) & "var2:" & var2
  10. End Sub

--- Variant  [ˈveriənt] 变种; 变体; 变形;  

 ---

13.调用bat (使用cmd,直接运行程序)

VBA调用bat,doc 命令行 窗口关闭之后,VBA代码 再继续执行_sun0322的博客-CSDN博客_vba执行bat命令

---

14.调用Jar,并获取返回值

核心代码

  1. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  2. 。。。
  3. cmdStr = "java -jar c:\xxx\xxx\xx\tool.jar param1 param2"
  4. Set WshShell = CreateObject("WScript.Shell")
  5. Set oExec = WshShell.Exec(cmdStr)
  6. Dim exitCode
  7. exitCode = oExec.exitCode
  8. ' Java ソース中に、正常終了の場合、main関数の最後で、System.exit(666);
  9. ' Java ソース中に、異常終了の場合、System.exit(1);
  10. do While exitCode = 0
  11. ' 遅延確認したいと、返却値ずっと[0]です。
  12. Sleep 3000
  13. exitCode = oExec.exitCode
  14. Loop
  15. Set oStdOut = oExec.StdOut

具体内容

https://blog.csdn.net/sxzlc/article/details/124742355

===

15.循环(For、While)

For

  1. For i =12 To 150
  2. ' 第一次是,【5行,12列】中的数据
  3. cellValue = Cells(5, i).Value
  4. ' 空值的时候,退出
  5. IF cellValue = Empty Then
  6. Exit For
  7. End IF
  8. Next

While

  1. i = 2
  2. cellValue = Cells(5, i).Value
  3. Do While cellValue <> Empty
  4. i = i + 1
  5. cellValue = Cells(5, i).Value
  6. Loop

===

16.Excel-VBA:列号与字母(列名)的相互转换 

核心代码

addrA1 = Replace(Cells(i, j).Address(0, 0), "1", "")

其它代码

  1. '列号转字母(列名)
  2. Function Num2Name(ByVal ColumnNum As Long) As String
  3. On Error Resume Next
  4. Num2Name = "" '超出范围返回空,如调用Num2Name(100000)
  5. Num2Name = Replace(Cells(1, ColumnNum).Address(0, 0), "1", "")
  6. 'Cell.Address用来返回单元格的地址,参数(0,0)返回相对地址A1,参数(1,1)返回绝对地址$A$1
  7. End Function
  8. '字母(列名)转列号
  9. Function Name2Num(ByVal ColumnName As String) As Long
  10. On Error Resume Next
  11. Name2Num = -1 '超出范围返回0,如调用Name2Num("AAAA") ,EXCEL没有那么多列
  12. Name2Num = Range("A1:" & ColumnName & "1").Cells.Count
  13. End Function

17.使用VBA给单元格设置公式 :( FormulaR1C1 )

・简单例子

  1. ' C1单元格为"=$A$2+$E$3"
  2. Range("C1").FormulaR1C1 = "=R2C1+R3C5"
  3. ' R2C1表示的是【第2行,第1列】的单元格即A2单元格

===

・具体例子

  1. ' one cell set formula
  2. Range("B2").Select
  3. Selection.NumberFormatLocal = "G/標準"
  4. ActiveCell.FormulaR1C1 = XXXX ' 设置公式的时候,录制宏,从宏中取得公式即可
  5. 'set all columns cell formula
  6. Range("B2").Select
  7. Selection.AutoFill Destinaion:=Range("B2:Z2"), Type:xlFillDefault
  8. 'set all rows cell formula
  9. Range("B2:Z2").Select
  10. Selection.AutoFill Destinaion:=Range("B2:Z100"), Type:xlFillDefault
  11. ActivateSheet.Calculate

===

获取单元格的公式,下面代码第三行

  1. a = Range("B1").Value
  2. b = Range("B1").Text
  3. c = Range("B1").Formula

===

18.XXX

xxx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多