VBA 常用參數方法

  • 29250
  • 0
  • VBA
  • 2021-11-22

變數.常數常用基本方法

變數

Dim APPLE As Integer

*除了宣告成基本型態外(String/Integer/Boolean/Float)

宣告為 Variant 的變數可以儲存任何類型的資料。

未經宣告的變數預設會是 Variant 萬用類型

 

Option Explicit ' 強迫變數宣告

可以在程式碼的開頭加上

避免沒宣告的情況下使用變數

 

Public MyVar As Integer

如將變數宣告成Public,則可以跨模組Module調用此變數

 

把變數放入儲存格中

Range("A1").Value = APPLE

 

視窗提示視窗

MsgBox "value is " & x

串接字串要用 " & "

 

常數

Const SampleInt As Integer = 10001

執行過程中都是固定值, 不會變動

 

儲存格: Cell

Cells(1, 1).Value = 23

Cells 將第一行第一列的儲存格

Cells配合Range

Range(Cells(1, 1), Cells(4, 2)).Value = 13

 

列(直)

Columns(2).Select

 

行(橫)

Rows(3).Select

 

複製貼上

Selection.Copy ActiveSheet.Paste

 

清除儲存格

Range("A1:A2").ClearContents

 

作業簿間切換

Worksheets("工作表1").Range("A1").Value = "工作表1的A1" Worksheets("工作表2").Range("A1").Value = "工作表2的A1"

 

新增一個新的工作表

Worksheets.Add 或Worksheets.Add(Before:=Worksheets(1)).Name = "aaaa表單"

判斷某頁簽是否存在

'先建立一個檢查頁簽的函式, 方便調用
Function checkSheetName(sheetname)
        '檢查此頁簽是否存在
        isfind = False
        For Each st In Sheets
            If st.Name = sheetname Then
               isfind = True
               Exit For
            End If
        Next
        checkSheetName = isfind
End Function
'調用
sheetname = "第一季"
If checkSheetName(sheetname) = False Then
    MsgBox "工作表:" & sheetname & "不存在"
    'Exit Sub '跳出
End If

更改作業表名稱

Worksheets(1).Name = "新的工作表"

 

計算目前作業表總數

MsgBox Worksheets.Count

指定某個檔案、某個表單,向下至最底行,取得此行數

Windows("A1233777.xlsm").Activate
Sheets("XX123表").Select
或
Workbooks("A1233777.xlsm").Sheets("XX123表").Activate

Range("A3").Select
RowNum = Selection.End(xlDown).Row

 

多個活頁簿間切換

Workbooks("活頁簿1").Worksheets(1).Range("A1").Value = "Hello"

 

開啟活頁簿

Workbooks.Open "C:\VBA\demo.xlsx"

 

加總 Application.WorksheetFunction.SUM公式

Application:表示當前的EXCEL執行的程式。

WorksheetFunction:表示呼叫當前Excel程式裡的公式。後面出現的SUM就是EXCEL裡的預設公式。

Dim Row
Dim Sum
Range("A1").Select
Row = Selection.End(xlDown).Row
取得總行數
Sum = Application.WorksheetFunction.Sum( Range("D2:D" & Row ) )

或是

Worksheets("Sheet1").Activate 
Dim cellfrom
Dim cellfinish
cellfrom= 1
cellfinish= 5
ActiveSheet.Cells(A , 14) = Application.Sum( Range("A" & cellfrom& ":C" & cellfinish) )

 

*補充*

Cells(列,欄)

例如:Cells(1,2)   對應"B1"
亦可寫成Cells(1,”B”) Cells(“1”,”B”)但請注意! 沒有Cells("B1")這種寫法!

*Rows(列)

例如:Rows(“1:3”)   代表第一到第三列

*Columns(欄),"欄"或稱為"行"

例如:Columns(4)    代表第四欄,等同於Columns(“D”)

但如要選取多個欄
在雙引號裡面要用英文字! 
要寫成:Columns(“A:D”)    代表A欄到D欄

*Range( )  萬能~~

單格:
Range(“B1”)

多格:
Range(“A1,B2,C3,D4”)

單欄:
Range(“A:A”)

多欄:
Range("B:B,E:E")

多列:把英文字改成數字
Range("2:5,6:7")

選一個範圍:
Range("A1","B2")   表示 A1~B2 一整區
等同於 Range( "A1:B2" )
等同於 Range( Cells(“A1”) , Cells(“B2”) ) 

 

Cell帶入變數

Cells、Rows跟Columns的優點是可以代入變數

例如:迴圈1~5
For i=1 to 5
  cells(i,2)=i*2
Next

結果則是會回傳 Cell(1,2)、Cell(2,2)、Cell(3,2)、Cell(4,2)、Cell(5,2)

 

帶入公式計算Q欄的總和

 '計算Q欄的總和
 	DataRow = 120 #資料總行數
 	
    Dim SUM_Q
    Range("Q" & DataRow + 1).Select
    ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-1]C:R[-" & DataRow - 1 & "]C)"
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 65535
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    SUM_Q = Range("Q" & DataRow + 1).Value

篩選+刪除

    DataRow = 120 #資料總行數
    '篩選刪除
    ActiveSheet.Range("$A$1:$O$" & DataRow).AutoFilter Field:=5, Criteria1:="=BANANA", Operator:=xlOr, Criteria2:="=APPLE"
    With Range("2:" & DataRow)  #從第2行開始~第幾行
     .SpecialCells(xlCellTypeVisible).Delete  #針對被篩出來的進行刪除
     .EntireRow.Hidden = False
    End With

篩選後確認篩選出的數量

	'篩選出 U欄 Quantity >= 0 排除負值 - 20210114 add
    ActiveSheet.Range("$A$1:$AP$" & DataRow_Detail).AutoFilter Field:=21, Criteria1:="<0", Operator:=xlAnd
    
	'檢查是否篩選出值
    Dim myRange As Range
    
    On Error Resume Next
        Set myRange = Range("A2:A" & DataRow_Detail).SpecialCells(xlVisible)
    On Error GoTo 0
    
    If myRange Is Nothing Then
		MsgBox "no cells"
    Else
        With Range("2:" & DataRow_Detail)
             .SpecialCells(xlCellTypeVisible).Delete
             .EntireRow.Hidden = False
        End With
    End If

 

儲存

Workbooks("demo").Save

 

Excel移動位置並選取

移動到B4,往上,選取到底

Range("B4").End(xlUp).Select

移動到B4,往右,選取到底

Range("B4").End(xlToRight).Select

指定Sheet1工作頁簽,選取 B4 至 B4往右選取到底

Worksheets("Sheet1").Activate
Range("B4", Range("B4").End(xlToRight)).Select


 

另存新檔

'巨集 另存新檔
'
    '取得路徑
    Dim Path As String
    Windows("aaa.xlsm").Activate
    Sheets("mapping table").Select
    Path = Range("D1").Value
    
    Application.DisplayAlerts = False ' 關閉警告訊息
    '另存結果表 
    Workbooks("A.xlsx").SaveAs Path & "B.xlsx"
    '這個前提是,巨集檔必須還開著
    Workbooks("B").Close ' 關閉xls
    Application.DisplayAlerts = True ' 開啟警告訊息

    '第二種寫法
    Path_Result =  Path & "B.xlsx"

    Application.DisplayAlerts = False ' 關閉警告訊息
    '另存結果表
    ActiveWorkbook.SaveAs Filename:=Path_Result, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Application.DisplayAlerts = True ' 開啟警告訊息
'檢查工作表是否存在,不存在則建立工作表
Function checkSheetName(sheetname)
  '檢查活頁是否存在
  isfind = False
  For Each st In Sheets
    If st.Name = sheetname Then
        isfind = True
        Exit For
    End If
  Next
  checkSheetName = isfind
End Function

If checkSheetName(sheetname) = True Then
   Application.DisplayAlerts = False ' 關閉警告訊息
   Sheets(sheetname).Select
   ActiveWindow.SelectedSheets.Delete
   Worksheets.Add(After:=Worksheets(1)).Name = sheetname
   Application.DisplayAlerts = True ' 開啟警告訊息
Else
   Worksheets.Add(After:=Worksheets(1)).Name = sheetname
End If

匯入合併資料

   '----------------------------------------------------
    '匯入合併資料
    '----------------------------------------------------
    Windows("AAAA_Format_Macro.xlsm").Activate
    Sheets("Sheet1").Select

    Range("A1").Select
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=AAAA_MergeExcel;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [AAAA_MergeExcel]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .ListObject.DisplayName = "AAAA_MergeExcel"
        .Refresh BackgroundQuery:=False
    End With

 

匯入樞紐表

'樞紐分析表
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"AAAA_MergeExcel", Version:=6).CreatePivotTable TableDestination:= _
"AAAA_樞紐表!R1C1", TableName:="AAAA_0004", DefaultVersion:=6

Cells(1, 1).Select
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=Range("AAAA_樞紐表!$A$1:$C$18")
'x軸
With ActiveChart.PivotLayout.PivotTable.PivotFields("Txn Type Name")
.Orientation = xlRowField
.Position = 1
End With
'篩選
With ActiveChart.PivotLayout.PivotTable.PivotFields("Trx Cost")
.Orientation = xlPageField
.Position = 1
End With
'y軸
ActiveChart.PivotLayout.PivotTable.AddDataField ActiveChart.PivotLayout. _
PivotTable.PivotFields("Transaction Qty"), "加總 - Transaction Qty", xlSum
ActiveChart.PivotLayout.PivotTable.AddDataField ActiveChart.PivotLayout. _
PivotTable.PivotFields("Trx Value"), "加總 - Trx Value", xlSum
'刪除樞紐圖
ActiveChart.Parent.Delete

 

 


參考資料來源:https://blog.gtwang.org/programming/excel-vba-programming-workbook-worksheet-cell/5/


 


人生美好~別浪費腦容量記程式碼 :- ) 

作者:CYL
出處:http://dotblogs.com.tw/cylcode
資料來源都會特別註明,有興趣都可查詢原出處,本站皆經過整理才分享,如有轉載請顯示出處及作者,感謝。