日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

VBA中 各種數(shù)據(jù)類型的使用(自定義數(shù)據(jù)類型Type,數(shù)組,數(shù)據(jù)字典)、讀寫文件...

 F2967527 2022-06-24 發(fā)布于北京

目錄

1.各種數(shù)據(jù)類型

2.VBA定義公共數(shù)組(全局都可以使用)

3.讀寫文件

SJIS 寫入

UTF8 寫入

讀取 SJIS

讀取 UTF-8

4.異常處理

5.忽略錯誤

6.其他常用1

7.其他常用2:讀?。ǘ鄠€)Excel文件

8. ★★★ 各種常用操作總結(jié) ★★★

9.事件相關(guān)處理 (保存,離開單元格等操作時,觸發(fā)處理)

10.定義(調(diào)用)有返回值的函數(shù)

11.使用VBA操作IE瀏覽器

12.Variant   變量類型

13.調(diào)用bat (使用cmd,直接運行程序)

14.調(diào)用Jar,并獲取返回值

核心代碼

具體內(nèi)容

15.循環(huán)(For、While)

For

While

16.Excel-VBA:列號與字母(列名)的相互轉(zhuǎn)換 

17.使用VBA給單元格設(shè)置公式 :( FormulaR1C1 )

18.XXX


---

1.各種數(shù)據(jù)類型

---

  1. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. '*
  3. '*  自定義學(xué)生對象
  4. '*  做成時間:2020/01/20
  5. '*  做成者: sun
  6. '*  跟新日:
  7. '*  更新者:
  8. '*
  9. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  10. Type STUDENT_INFO
  11.     '學(xué)號
  12.     stuNo As String
  13.     stuName As String
  14.     stuAge As String
  15.     stuSexCode As String
  16. End Type
  17. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  18. '*
  19. '*  定義各種數(shù)據(jù)類型,處理學(xué)生對象情報
  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.     ' 全部學(xué)生信息 以字符串形式保存
  33.     Dim allStudentInfo As String
  34.     allStudentInfo = "1001,張三,30,1、1002,李四,31,1、1003,XiaoHong,29,2"
  35.     ' 全部學(xué)生信息 以數(shù)組形式保存【數(shù)組使用】
  36.     Dim studentInfoList() As String
  37.     studentInfoList = Split(allStudentInfo, "、")
  38.     ' 全部學(xué)生姓名信息 以key-學(xué)號  value-姓名 的Map形式保存
  39.     Dim studentDataList As Object '【數(shù)據(jù)字典使用-定義】
  40.     Set studentDataList = CreateObject("Scripting.Dictionary")
  41.     ' UBound 返回數(shù)組的上界 ,★★★不是數(shù)組的大小★★★比如數(shù)組大小時4,那么上屆是3
  42.     For i = 0 To UBound(studentInfoList)
  43.         ' 循環(huán)設(shè)定每個學(xué)生的信息
  44.         Dim stuObject As STUDENT_INFO '【自定義數(shù)據(jù)類型使用】
  45.         stuObject = setStudentInfo(studentInfoList(i))
  46.         ' 以學(xué)號作為Key,存儲上面設(shè)定好的學(xué)生的信息
  47.         ' studentDataList.Add stuObject.stuNo, stuObject  '不好用,無法保存自定義對象
  48.         studentDataList.Add stuObject.stuNo, stuObject.stuName '【數(shù)據(jù)字典使用 - 設(shè)定值】
  49.     Next
  50.     ' 顯示學(xué)號是「1002」小明同學(xué)的信息
  51.     If studentDataList.exists("1002") Then '【數(shù)據(jù)字典使用 - 取值】
  52.         MsgBox studentDataList.Item("1002") '【數(shù)據(jù)字典使用 - 取值】
  53.     End If
  54. End Sub
  55. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  56. '*
  57. '*  設(shè)定單個學(xué)生對象情報
  58. '*  做成時間:2020/01/20
  59. '*  做成者: sun
  60. '*  跟新日:
  61. '*  更新者:
  62. '*
  63. '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  64. Public Function setStudentInfo(studentInfo As String) As STUDENT_INFO
  65.     ' 單個學(xué)生的信息
  66.     Dim infos() As String
  67.     infos = Split(studentInfo, ",")
  68.     ' 使用上面定義的學(xué)生對象
  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.     ' 設(shè)定返回值
  75.     setStudentInfo = stuObject
  76. End Function

----

2.VBA定義公共數(shù)組(全局都可以使用)

  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

擴展

「プロシージャの外では無効です」錯誤發(fā)生原因
只寫了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標(biāo)準(zhǔn)のADODB.Streamオブジェクトを作成する
  4. Set Stream = CreateObject("ADODB.Stream")
  5. ' ストリームの文字コードをUTF8に設(shè)定する
  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は新規(guī)作成 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標(biāo)準(zhǔn)のADODB.Streamオブジェクトを作成する
  5. Set Stream = CreateObject("ADODB.Stream")
  6. ' ストリームの文字コードをUTF8に設(shè)定する
  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. 重新開始,恢復(fù);取回,重新占用

---

6.其他常用1

根據(jù)一覽,自動生成Sheet頁_sun0322-CSDN博客

7.其他常用2:讀取(多個)Excel文件

Excel VBA 循環(huán)讀取一個目錄下面多個文件的內(nèi)容,放到另外一個文件中_sun0322-CSDN博客_vba循環(huán)讀取文件夾下的文件

8. ★★★ 各種常用操作總結(jié) ★★★

  1. ' 有時即使光標(biāo)到了A1,因為滾動條的原因,顯示效果并不是在最上面,此時要使用下面語句
  2. ActiveWindow.SmallScroll Down:=-2000
  3. ' 對公式進行計算
  4. ActiveSheet.Calculate
  5. ’多個Excel直接發(fā)生切換時,使用下面的語句(參數(shù)是,要切換到的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. '關(guān)閉打開Excel (不保存)
  13. workbook2.Close savechanges:=False
  14. '【sheet】復(fù)制
  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. ’【單元格】復(fù)制,粘貼
  27. Range("A1:C20").Select
  28. Selection.copy
  29. Range("E1").Select
  30. ActiveSheet.Paste
  31. ’【單元格】復(fù)制,粘貼 【公式 ? 值】
  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.事件相關(guān)處理 (保存,離開單元格等操作時,觸發(fā)處理)

指定單元格里面的,內(nèi)容發(fā)生變化,觸發(fā)事件,調(diào)用VBA代碼。_sun0322的博客-CSDN博客_單元格變化觸發(fā)vba

--

10.定義(調(diào)用)有返回值的函數(shù)

---

  1. ' 定義有返回值的函數(shù)
  2. public Function checkValue() As Integer
  3. If XXX then
  4. ' 設(shè)定函數(shù)的返回值 ’×?。簊et checkValue = 1
  5. checkValue = 1
  6. Exit Function
  7. End If
  8. checkValue = 0
  9. End Function
  10. ' 調(diào)用函數(shù)
  11. flg = checkValue
  12. If flg <> 0 Then
  13. 。。。
  14. End If

---

11.使用VBA操作IE瀏覽器

VBS操作IE ---(【當(dāng)不使用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.調(diào)用bat (使用cmd,直接運行程序)

VBA調(diào)用bat,doc 命令行 窗口關(guān)閉之后,VBA代碼 再繼續(xù)執(zhí)行_sun0322的博客-CSDN博客_vba執(zhí)行bat命令

---

14.調(diào)用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関數(shù)の最後で、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

具體內(nèi)容

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

===

15.循環(huán)(For、While)

For

  1. For i =12 To 150
  2. ' 第一次是,【5行,12列】中的數(shù)據(jù)
  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:列號與字母(列名)的相互轉(zhuǎn)換 

核心代碼

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

其它代碼

  1. '列號轉(zhuǎn)字母(列名)
  2. Function Num2Name(ByVal ColumnNum As Long) As String
  3. On Error Resume Next
  4. Num2Name = "" '超出范圍返回空,如調(diào)用Num2Name(100000)
  5. Num2Name = Replace(Cells(1, ColumnNum).Address(0, 0), "1", "")
  6. 'Cell.Address用來返回單元格的地址,參數(shù)(0,0)返回相對地址A1,參數(shù)(1,1)返回絕對地址$A$1
  7. End Function
  8. '字母(列名)轉(zhuǎn)列號
  9. Function Name2Num(ByVal ColumnName As String) As Long
  10. On Error Resume Next
  11. Name2Num = -1 '超出范圍返回0,如調(diào)用Name2Num("AAAA") ,EXCEL沒有那么多列
  12. Name2Num = Range("A1:" & ColumnName & "1").Cells.Count
  13. End Function

17.使用VBA給單元格設(shè)置公式 :( 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/標(biāo)準(zhǔn)"
  4. ActiveCell.FormulaR1C1 = XXXX ' 設(shè)置公式的時候,錄制宏,從宏中取得公式即可
  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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多