首頁>Club>
5
回覆列表
  • 1 # 至衡科技

    我們平時在工作表單元格的公式中常常使用函式,Excel自帶的常用的函式多達300多個,功能強大,豐富多彩,但是在VBA中不能直接應用,必須在函式名前面加上物件,比如:Application.WorksheetFunction.Sum(arg1,arg2,arg3)。

  • 2 # 悶騷的程式設計師

    我以前總結過我常用的一些,見

    https://github.com/mzlogin/learn-vba-the-hard-way

    主要的實用程式碼片段如下:

    ## 實用程式碼片段

    ### 檔案操作

    #### 引用開啟的工作簿

    使用索引號(從 1 開始)

    ```vbnet

    Workbooks(1)

    ```

    使用工作簿名稱

    ```vbnet

    Workbooks("1.xlsx")

    ```

    #### 建立一個 EXCEL 工作簿物件

    ```vbnet

    Dim wd As Excel.Application

    Dim wb As Workbook

    Set wd = CreateObject("excel.application")

    wd.Visible = True

    Set wb = wd.Workbooks.Open(ThisWorkbook.Path & "/test.xls")

    " ...

    wb.Close

    wd.Quit

    ```

    #### 開啟/儲存/關閉工作簿

    ```vbnet

    Dim wb As Workbook

    wb = Workbooks.Open(ThisWorkbook.Path & "/test.xls")

    " ...

    wb.Save

    wb.Close

    ```

    關閉所有工作簿

    ```vbnet

    Workbooks.close

    ```

    另存為(自動開啟新檔案關閉原始檔)

    ```vbnet

    ThisWorkbook.SaveAs FileName:="D:\1.xls"

    ```

    另存為(保留原始檔不開啟新檔案)

    ```vbnet

    ThisWorkbook.SaveCopyAs FileName:="D:\1.xls"

    ```

    #### 複製檔案

    ```vbnet

    oldfile = ThisWorkBook.Path & "/old.xlsx"

    newfile = ThisWorkBook.Path & "/new.xlsx"

    FileCopy oldfile, newfile

    ```

    #### 複製資料夾

    ```vbnet

    Set fso = CreateObject("Scripting.FileSystemObject")

    fso.copyfolder srcDir, dstDir

    ```

    ```vbnet

    base = ThisWorkBook.Path & "/資料夾/"

    pattern = base & "*.*"

    file = Dir(pattern, vbReadOnly)

    While file <> ""

    Kill base & file

    file = Dir

    Wend

    ```

    #### 建立資料夾

    ```vbnet

    MkDir(directory)

    ```

    #### 判斷資料夾是否存在

    以下為不存在即建立

    ```vbnet

    If Dir(outputDir, 16) = Empty Then

    MkDir (outputDir)

    End If

    ```

    #### 判斷檔案是否存在

    方法 1:

    ```vbnet

    Dim fileSystemObject As Object

    Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

    If fileSystemObject.FileExists(<filepath>) = True Then

    MsgBox "檔案存在"

    End If

    ```

    方法 2:

    ```vbnet

    Dim file As String

    file = Dir("E:\MyPictures\Pic\logo.gif")

    If file <> "" Then

    MsgBox "檔案存在"

    Endif

    ```

    ### 格式操作

    #### 設定邊框與自動篩選

    ```vbnet

    Set Rng = MyWorkSheet.UsedRange

    With Rng

    .Borders.LineStyle = xlContinuous

    .Borders.Weight = xlThin

    .AutoFilter

    End With

    ```

    #### 獲取或者設定單元格背景色

    ```vbnet

    MyWorkSheet.Cells(i, j).Interior.ColorIndex

    ```

    #### 讓某表格選中的單元格變成指定顏色

    在 thisworkbook 中新增如下程式碼段:

    ```vbnet

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    If ActiveSheet.Name = "yoursheet" Then

    ActiveSheet.UsedRange.Interior.ColorIndex = 0

    Target.Interior.ColorIndex = 6

    End If

    End Sub

    ```

    #### 在單元格里回車 / 換行

    設定單元格 Value 裡使用 `Chr(10)` 和 `Chr(13)`,分別表示回車、換行。

    #### 隱藏行

    ```vbnet

    MyWorkSheet.Rows(i).Hidden = True

    ```

    #### 單元格內容為純文字

    ```vbnet

    sheet.Cells(m, n).NumberFormatLocal = "@"

    ```

    #### 設定單元格公式

    ```vbnet

    For Each cel In ActiveSheet.Range("C1:C10")

    cel.Formula = "=SUBSTITUTE(A" & cel.Row() & ", ""."", CHAR(10) & ""."")"

    Next

    ```

    ### 選擇

    #### 引用單元格 / 區域

    ```vbnet

    Range("A1") "表示 A1 單元格

    Range("A2:D1") "表示 A2 到 D1 區域

    Range("A2:D1")(3) "表示該區域裡的第三個單元格

    Range("D" & i) "i 為變數

    Range("D3:F4,G10") "引用多個區域

    Range("2:2") "引用第二行

    Range("2:12") "引用第二行到第十二行

    Range("D:A") "引用第 A 到 D 列

    Rows(2) "引用第二行

    Rows("2:4") "引用第二到四行

    Columns("B")

    Columns("B:D")

    Range(Clee1, Cell2) "左上與右下

    Range(Range1, Range2) "取最大範圍

    ```

    #### 選中單元格 / 區域

    ```vbnet

    Range("1:1").Select "選中第一行

    ```

    #### 獲取當前選中區域

    ```vbnet

    MyWorkSheet.Application.Selection

    ```

    ### 資料結構

    #### Dictionary

    ```vbnet

    Dim dict

    Set dict = CreateObject("Scripting.Dictionary")

    " 新增,各種型別都可以,包括 Dictionary

    dict.Add "hello", "world"

    " 數量

    dict.Count

    dict.Remove("hello")

    " 判斷是否存在

    dict.exists("hello")

    " 取值,需要先判斷存在再取

    dict.Item("hello")

    " 修改、新增

    dict.Item("hello") = "world"

    " 迴圈

    k = dict.Keys

    v = dict.Items

    For i = 0 to dict.count - 1

    key = k(i)

    value = v(i)

    Next

    " 清空

    dict.RemoveAll

    ```

    參考:[Excel vba map/dictionary](http://www.cnblogs.com/zhjh256/p/6428333.html)

    ### 語言基礎

    #### String to Integer、Double

    ```vbnet

    CInt(MyWorkSheet.Cells(1,7))

    CDbl(MyWorkSheet.Cells(1,7))

    ```

    #### 字串分割/獲取陣列長度

    ```vbnet

    Dim arr() As String

    arr() = Split(ws.Cells(a, b).Value, "-")

    alen = UBound(arr) - LBound(arr) + 1

    ```

    #### 字串替換

    ```vbnet

    s1 = Replace(s2, ".", Chr(10) & ".")

    ```

    #### 判斷單元格是否為空

    判斷單元格的 value 是否為 ""。

    #### 退出

    主要使用 Exit 表示式。

    ```

    Exit { Do | For | Function | Property | Select | Sub | Try | While }

    ```

    參見 [Exit Statement (Visual Basic)](

    https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/exit-statement)

    進入

    https://github.com/mzlogin/learn-vba-the-hard-way

    可獲得更好的閱讀體驗。

    另外,我的一個建議是樓主也可以關注下用 Python 代替 VBA 處理 Excel 等文件裡的資料,更加高效和通用,程式設計體驗也更加好。

  • 中秋節和大豐收的關聯?
  • pcc89引數?