Excel VBA命令大全

本例為設置密碼窗口 (1)

If Application.InputBox(“請輸入密碼:”) = 1234 Then

[A1] = 1 ‘密碼正確時執行

Else: MsgBox “密碼錯誤,即將退出!” ‘此行與第2行共同設置密碼

End If

本例為設置密碼窗口 (1)

X = MsgBox(“是否真的要結帳?”, vbYesNo)

If X = vbYes Then

Close

本例為設置工作表密碼

ActiveSheet.Protect Password:=641112 ‘ 保護工作表并設置密碼

ActiveSheet.Unprotect Password:=641112 ‘撤消工作表保護并取消密碼

‘本例關閉除正在運行本例的工作簿以外的其他所有工作簿,并保存其更改內容

For Each w In Workbooks

If w.Name ThisWorkbook.Name Then

w.Close SaveChanges:=True

End If

Next w

‘每次打開工作簿時,本例都最大化 Microsoft Excel 窗口。

Application.WindowState = xlMaximized

‘本例顯示活動工作表的名稱。

MsgBox “The name of the active sheet is ” & ActiveSheet.Name

‘本例保存當前活動工作簿的副本。

ActiveWorkbook.SaveCopyAs “C:\TEMP\XXXX.XLS”

‘下述過程激活工作簿中的第四張工作表。

Sheets(4).Activate

‘下述過程激活工作簿中的第1張工作表。

Worksheets(1).Activate

‘本例通過將 Saved 屬性設為 True 來關閉包含本段代碼的工作簿,并放棄對該

工作簿的任何更改。

ThisWorkbook.Saved = True

ThisWorkbook.Close

‘本例對自動重新計算功能進行設置,使 Microsoft Excel 不對第一張工作表自

動進行重新計算。

Worksheets(1).EnableCalculation = False

‘下述過程打開 C 盤上名為 MyFolder 的文件夾中的 MyBook.xls 工作簿。

Workbooks.Open (“C:\MyFolder\MyBook.xls”)

‘本例顯示活動工作簿中工作表 sheet1 上單元格 A1 中的值。

MsgBox Worksheets(“Sheet1”).Range(“A1”).Value

本例顯示活動工作簿中每個工作表的名稱

For Each ws In Worksheets

MsgBox ws.Name

Next ws

本例向活動工作簿添加新工作表 , 并設置該工作表的名稱?

Set NewSheet = Worksheets.Add

NewSheet.Name = “current Budget”

本例將新建的工作表移到工作簿的末尾

‘Private Sub Workbook_NewSheet(ByVal Sh As Object)

Sh.Move After:=Sheets(Sheets.Count)

End Sub

本例將新建工作表移到工作簿的末尾

‘Private Sub App_WorkbookNewSheet(ByVal Wb As Workbook, _

ByVal Sh As Object)

Sh.Move After:=Wb.Sheets(Wb.Sheets.Count)

End Sub

本例新建一張工作表,然后在第一列中列出活動工作簿中的所有工作表的名稱。

Set NewSheet = Sheets.Add(Type:=xlWorksheet)

For i = 1 To Sheets.Count

NewSheet.Cells(i, 1).Value = Sheets(i).Name

Next i

本例將第十行移到窗口的最上面?

Worksheets(“Sheet1”).Activate

ActiveWindow.ScrollRow = 10

當計算工作簿中的任何工作表時,本例對第一張工作表的 A1:A100 區域進行排序

‘Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

With Worksheets(1)

.Range(“a1:a100”).Sort Key1:=.Range(“a1”)

End With

End Sub

本例顯示工作表 Sheet1 的打印預覽。

Worksheets(“Sheet1”).PrintPreview

本例保存當前活動工作簿?

ActiveWorkbook.Save

本例保存所有打開的工作簿,然后關閉 Microsoft Excel。

For Each w In Application.Workbooks

w.Save

Next w

Application.Quit

下例在活動工作簿的第一張工作表前面添加兩張新的工作表?

Worksheets.Add Count:=2, Before:=Sheets(1)

本例設置 15 秒后運行 my_Procedure 過程,從現在開始計時。

Application.OnTime Now + TimeValue(“00:00:15”), “my_Procedure”

本例設置 my_Procedure 在下午 5 點開始運行。

Application.OnTime TimeValue(“17:00:00”), “my_Procedure”

本例撤消前一個示例對 OnTime 的設置。

Application.OnTime EarliestTime:=TimeValue(“17:00:00”), _

Procedure:=”my_Procedure”, Schedule:=False

每當工作表重新計算時,本例就調整 A 列到 F 列的寬度。

‘Private Sub Worksheet_Calculate()

Columns(“A:F”).AutoFit

End Sub

本例使活動工作簿中的計算僅使用顯示的數字精度。

ActiveWorkbook.PrecisionAsDisplayed = True

本例將工作表 Sheet1 上的 A1:G37 區域剪下,并放入剪貼板。

Worksheets(“Sheet1”).Range(“A1:G37”).Cut

Calculate 方法

計算所有打開的工作簿、工作簿中的一張特定的工作表或者工作表中指定區域的單元

格,如下表所示:

‘要計算 ‘依照本例

所有打開的工作簿 ‘ Application.Calculate (或只是 Calculate

指定工作表 ‘計算指定工作表Sheet1 Worksheets

(“Sheet1”).Calculate

指定區域 ‘Worksheets(1).Rows(2).Calculate

本例對自動重新計算功能進行設置,使 Microsoft Excel 不對第一張工作表自動

進行重新計算。

Worksheets(1).EnableCalculation = False

本例計算 Sheet1 已用區域中 A 列、B 列和 C 列的公式。

Worksheets(“Sheet1”).UsedRange.Columns(“A:C”).Calculate

本例更新當前活動工作簿中的所有鏈接?

ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources

本例設置第一張工作表的滾動區域?

Worksheets(1).ScrollArea = “a1:f10”

本例新建一個工作簿,提示用戶輸入文件名,然后保存該工作簿。

Set NewBook = Workbooks.Add

Do

fName = Application.GetSaveAsFilename

Loop Until fName False

NewBook.SaveAs Filename:=fName

本例打開 Analysis.xls 工作簿,然后運行 Auto_Open 宏。

Workbooks.Open “ANALYSIS.XLS”

ActiveWorkbook.RunAutoMacros xlAutoOpen

本例對活動工作簿運行 Auto_Close 宏,然后關閉該工作簿。

With ActiveWorkbook

.RunAutoMacros xlAutoClose

.Close

End With

在本例中,Microsoft Excel 向用戶顯示活動工作簿的路徑和文件名稱。

‘Sub UseCanonical()

Display the full path to user.

MsgBox ActiveWorkbook.FullNameURLEncoded

End Sub

本例顯示當前工作簿的路徑及文件名(假定尚未保存此工作簿)。

MsgBox ActiveWorkbook.FullName

本例關閉 Book1.xls,并放棄所有對此工作簿的更改。

Workbooks(“BOOK1.XLS”).Close SaveChanges:=False

本例關閉所有打開的工作簿。如果某個打開的工作簿有改變,Microsoft Excel

將顯示詢問是否保存更改的對話框和相應提示。

Workbooks.Close

本例在打印之前對當前活動工作簿的所有工作表重新計算?

‘Private Sub Workbook_BeforePrint(Cancel As Boolean)

For Each wk In Worksheets

wk.Calculate

Next

End Sub

本例對查詢表一中的第一列數據進行匯總,并在數據區域下方顯示第一列數據的總

和。

Set c1 = Sheets(“sheet1”).QueryTables(1).ResultRange.Columns(1)

c1.Name = “Column1”

c1.End(xlDown).Offset(2, 0).Formula = “=sum(Column1)”

本例取消活動工作簿中的所有更改?

ActiveWorkbook.RejectAllChanges

本例在商業問題中使用規劃求解函數,以使總利潤達到最大值。SolverSave 函數

將當前問題保存到活動工作表上的某一區域。

Worksheets(“Sheet1”).Activate

SolverReset

SolverOptions Precision:=0.001

SolverOK SetCell:=Range(“TotalProfit”), _

MaxMinVal:=1, _

ByChange:=Range(“C4:E6”)

SolverAdd CellRef:=Range(“F4:F6”), _

Relation:=1, _

FormulaText:=100

SolverAdd CellRef:=Range(“C4:E6”), _

Relation:=3, _

FormulaText:=0

SolverAdd CellRef:=Range(“C4:E6”), _

Relation:=4

SolverSolve UserFinish:=False

SolverSave SaveArea:=Range(“A33”)

本例隱藏 Chart1、Chart3 和 Chart5。

Charts(Array(“Chart1”, “Chart3”, “Chart5”)).Visible = False

當激活工作表時,本例對 A1:A10 區域進行排序。

‘Private Sub Worksheet_Activate()

Range(“a1:a10”).Sort Key1:=Range(“a1”), Order:=xlAscending

End Sub

本例更改 Microsoft Excel 鏈接。

ActiveWorkbook.ChangeLink “c:\excel\book1.xls”, _

“c:\excel\book2.xls”, xlExcelLinks

本例啟用受保護的工作表上的自動篩選箭頭?

ActiveSheet.EnableAutoFilter = True

ActiveSheet.Protect contents:=True, userInterfaceOnly:=True

本例將活動工作簿設為只讀?

ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly

本例使共享工作簿每三分鐘自動更新一次?

ActiveWorkbook.AutoUpdateFrequency = 3

下述 Sub 過程清除活動工作簿中 Sheet1 上的所有單元格的內容。

‘Sub ClearSheet()

Worksheets(“Sheet1”).Cells.ClearContents

End Sub

本例對所有工作簿都關閉滾動條?

Application.DisplayScrollBars = False

如果具有密碼保護的工作簿的文件屬性沒有加密,則本例設置指定工作簿的密碼加

密選項。

‘Sub SetPasswordOptions()

With ActiveWorkbook

If .PasswordEncryptionProvider “Microsoft RSA SChannel

Cryptographic Provider” Then

.SetPasswordEncryptionOptions _

PasswordEncryptionProvider:=”Microsoft RSA SChannel

Cryptographic Provider”, _

PasswordEncryptionAlgorithm:=”RC4″, _

PasswordEncryptionKeyLength:=56, _

PasswordEncryptionFileProperties:=True

End If

End With

End Sub

在本例中,如果活動工作簿不能進行寫保護,那么 Microsoft Excel 設置字符串

密碼以作為活動工作簿的寫密碼。

‘Sub UseWritePassword()

Dim strPassword As String

strPassword = “secret”

‘ Set password to a string if allowed.

If ActiveWorkbook.WriteReserved = False Then

ActiveWorkbook.WritePassword = strPassword

End If

End Sub

在本例中,Microsoft Excel 打開名為 Password.xls 的工作簿,設置它的密碼

,然后關閉該工作簿。本例假定名為 Password.xls 的文件位于 C:\ 驅動器上。

‘Sub UsePassword()

Dim wkbOne As Workbook

Set wkbOne = Application.Workbooks.Open(“C:\Password.xls”)

wkbOne.Password = “secret”

wkbOne.Close

‘注意 Password 屬性可讀并返回 “********”。

End Sub

本例將 Book1.xls 的當前窗口更改為顯示公式。

Workbooks(“BOOK1.XLS”).Worksheets(“Sheet1”).Activate

ActiveWindow.DisplayFormulas = True

‘本例接受活動工作簿中的所有更改?

ActiveWorkbook.AcceptAllChanges

本例顯示活動工作簿的路徑和名稱

Sub UseCanonical()

MsgBox ‘消息框

[b7] = ActiveWorkbook.FullName ‘當前工作簿

[b8] = ActiveWorkbook.FullNameURLEncoded ‘活動工作簿

End Sub

本例顯示 Microsoft Excel 啟動文件夾的完整路徑。

MsgBox Application.StartupPath

本例顯示活動工作簿中每個工作表的名稱。

For Each ws In Worksheets

MsgBox ws.Name

Next ws

本例關閉除正在運行本例的工作簿以外的其他所有工作簿,并保存其更改內容。

For Each w In Workbooks

If w.Name ThisWorkbook.Name Then

w.Close savechanges:=True

End If

Next w

Activate 事件

激活一個工作簿、工作表、圖表或嵌入圖表時產生此事件。

當激活工作表時,本例對 A1:A10 區域進行排序。

Private Sub Worksheet_Activate()

Range(“a1:a10”).Sort Key1:=Range(“a1”), Order:=xlAscending

End Sub

Calculate 事件

對于 Worksheet 對象,在對工作表進行重新計算之后產生此事件

每當工作表重新計算時,本例就調整 A 列到 F 列的寬度。

Private Sub Worksheet_Calculate()

Columns(“A:F”).AutoFit

End Sub

BeforeDoubleClick 事件

應用于 Worksheet 對象的 Activate 方法。

當雙擊某工作表時產生此事件,此事件先于默認的雙擊操作。

Private Sub expression_BeforeDoubleClick(ByVal Target As Range, Cancel

As Boolean)

expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。

Target 必需。雙擊發生時最靠近鼠標指針的單元格。

Cancel 可選。當事件發生時為 False。如果事件過程將該參數設為 True,則該

過程執行完之后將不進行默認的雙擊操作。

BeforeRightClick 事件

應用于 Worksheet 對象的 Activate 方法。

當用鼠標右鍵單擊某工作表時產生此事件,此事件先于默認的右鍵單擊操作。

Private Sub expression_BeforeRightClick(ByVal Target As Range, Cancel

As Boolean)

expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。

Target 必需。右鍵單擊發生時最靠近鼠標指針的單元格。

Cancel 可選。當事件發生時為 False。如果該事件過程將本參數設為 True,則

該過程執行結束之后不進行默認的右鍵單擊操作。

Change 事件

當用戶更改工作表中的單元格,或外部鏈接引起單元格的更改時產生此事件。

Private Sub Worksheet_Change(ByVal Target As Range)

Target 更改的區域。可以是多個單元格。

說明

重新計算引起的單元格更改不觸發本事件。可使用 Calculate 事件俘獲工作表重新

計算操作。

本例將更改的單元格的顏色設為藍色。

Private Sub Worksheet_Change(ByVal Target as Range)

Target.Font.ColorIndex = 5

End Sub

Deactivate 事件

圖表、工作表或工作簿從活動狀態轉為非活動狀態時產生此事件。

Private Sub object_Deactivate()

object Chart、Workbook 或者 Worksheet。有關對 Chart 對象使用事件的詳細

信息,請參閱 Chart 對象事件的用法。

本例當工作簿轉為非活動狀態時,對所有打開的窗口進行排列。

Private Sub Workbook_Deactivate()

Application.Windows.Arrange xlArrange

End Sub

FollowHyperlink 事件

當單擊工作表上的任意超鏈接時,發生此事件。對于應用程序級或工作簿級的事件,

請參閱 SheetFollowHyperlink 事件。

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

Target Hyperlink 類型,必需。一個代表超鏈接目標位置的 Hyperlink 對象。

本例對在當前活動工作簿中訪問過的所有鏈接保留一個列表或歷史記錄。

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

With UserForm1

.ListBox1.AddItem Target.Address

.Show

End With

End Sub

PivotTableUpdate 事件

發生在工作簿中的數據透視表更新之后。

Private Sub expression_PivotTableUpdate(ByVal Target As PivotTable)

expression 引用在類模塊中帶有事件聲明的 Worksheet 類型對象的變量。

Target 必需。選定的數據透視表。

本例顯示一則消息,說明數據透視表已經更新。本例假定您已在類模塊中聲明了

帶有事件的 Worksheet 類型的對象。

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

MsgBox “The PivotTable connection has been updated.”

End Sub

SelectionChange 事件

當工作表上的選定區域發生改變時,將產生本事件。

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Target 新選定的區域。

本例滾動工作簿窗口,直至選定區域位于窗口的左上角。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

With ActiveWindow

.ScrollRow = Target.Row

.ScrollColumn = Target.Column

End With

End Sub

本例顯示活動工作簿中工作表 sheet1 上單元格 A1 中的值。

MsgBox Worksheets(“Sheet1”).Range(“A1”).Value

本例顯示活動工作簿中每個工作表的名稱。

For Each ws In Worksheets

MsgBox ws.Name

Next ws

本例向活動工作簿添加新工作表,并設置該工作表的名稱。

Set newSheet = Worksheets.Add

newSheet.Name = “current Budget”

本例關閉工作簿 Book1.xls,但不提示用戶保存所作更改。Book1.xls 中的所有

更改都不會保存。

Application.DisplayAlerts = False

Workbooks(“BOOK1.XLS”).Close

Application.DisplayAlerts = True

本例設置保存文件時顯示提示,要求用戶輸入匯總信息。

Application.PromptForSummaryInfo = True

本例顯示 Microsoft Excel 的完整路徑。

Private Sub aa()

MsgBox “The path is ” & Application.Path

End Sub

示例顯示每一個可用加載宏的路徑及文件名。

For Each a In AddIns

MsgBox a.FullName

Next a

ChDir 語句

改變當前的目錄或文件夾。

ChDir path

在 Power Macintosh 中,默認驅動器總是改為在 path 語句中指定的驅動器。完整

路徑指定由卷標名開始,相對路徑由冒號 (:) 開始. ChDir 可以辨認路徑中指定的

別名:

ChDir “MacDrive:Tmp” ‘ 在 Macintosh 中

本例顯示當前路徑分隔符。

MsgBox “The path separator character is ” & _

Application.PathSeparator

Move 方法

將一個指定的文件或文件夾從一個地方移動到另一個地方。

語法

object.Move destination

Move 方法語法有如下幾部分:

部分 描述

object 必需的。始終是一個 File 或 Folder 對象的名字。

destination 必需的。文件或文件夾要移動到的目標。不允許有通配符。

CreateFolder 方法

創建一個文件夾。

語法

object.CreateFolder(foldername)

reateFolder 方法有如下幾部分:

部分 描述

object 必需的。始終是一個 FileSystemObject 的名字。

foldername 必需的。字符串表達式,它標識創建的文件夾。

本例使用 MkDir 語句來創建目錄或文件夾。如果沒有指定驅動器,新目錄或文件

夾將會建在當前驅動器中。

MkDir “MYDIR” ‘ 建立新的目錄或文件夾。

Name 語句示例

本例使用 Name 語句來更改文件的名稱。示例中假設所有使用到的目錄或文件夾都

已存在。 在 Macintosh 中,默認驅動器名稱是 “HD” 并且路徑部分由冒號取代

反斜線隔開。

Dim OldName, NewName

OldName = “OLDFILE”: NewName = “NEWFILE” ‘ 定義文件名。

Name OldName As NewName ‘ 更改文件名。

OldName = “C:\MYDIR\OLDFILE”: NewName = “C:\YOURDIR\NEWFILE”

Name OldName As NewName ‘ 更改文件名,并移動文件。

本例顯示當前默認文件路徑。

MsgBox “The current default file path is ” & _

Application.DefaultFilePath

本例設置替換啟動文件夾。

Application.AltStartupPath = “C:\EXCEL\MACROS”

FolderExists 方法

如果指定的文件夾存在返回 True,不存在返回 False。

語法

object.FolderExists(folderspec)

本例在單元格中啟用編輯。

Application.EditDirectlyInCell = True

程序說明:

幾種用VBA在單元格輸入數據的方法:

Public Sub Writes()

1– 2 方法,最簡單在 “[ ]” 中輸入單元格名稱。

1 [A1] = 100 ‘在 A1 單元格輸入100。

2 [A2:A4] = 10 ‘在 A2:A4 單元格輸入10。

3– 4 方法,采用 Range(” “), ” ” 中輸入單元格名稱。

3 Range(“B1”) = 200 ‘在 B1 單元格輸入200。

4 Range(“C1:C3”) = 300 ‘在 C1:C3 單元格輸入300。

5– 6 方法,采用 Cells(Row,Column),Row是單元格行數,Column是單元格欄數。

5 Cells(1, 4) = 400 ‘在 D1 單元格輸入400。

6 Range(Cells(1, 5), Cells(5, 5)) = 50 ‘在 E1:E 5單元格輸入50。

End Sub

你點選任何單元格,按 Selection 按鈕,則則所點選的單元格均會被輸入文字

“Test”。

Public Sub Selection1()

Selection.Value = “Test” ‘在任何你點選的單元格輸入文字 “Test”。

End Sub

VBALesson2 程序說明:

幾種如何把別的工作表 Sheet4 數據,讀到這個工作表的方法:在被讀取的單元格

前加上工作表名稱 Sheet4。

Public Sub Writes()

1– 2 方法,最簡單在被讀取的 “[ ]” 前加上被讀取的工作表名稱 Sheet4。

1 [A1] = Sheet4.[A1] ‘把Sheet4 A1 單元格的數據,讀到 A1單元格。

2 [A2:A4] = Sheet4.[B1] ”把 Shee4 工作表單元格 B1 數據,讀到 A2:A4

單元格。

3– 4 方法,在被讀取的工作表 Range(” “)的 Range 前加上被讀取的工作表名稱

Sheet4。

3 Range(“B1”) = Sheet4.Range(“B1″) ”把 Shee4工作表單元格 B1 數據,讀

到 B1 單元格。

4 Range(“C1:C3”) = Sheet4.Range(“C1”) ‘把 Shee4 工作表單元格 C1 數據

,讀到 C1:C3 單元格。

5– 6 方法,在被讀取的工作表 Cells(Row,Column),Cells 前加上被讀取工作表

名稱 Sheet4。

5 Cells(1, 4) = Sheet4.Cells(1, 4) ‘把 Shee4 工作表單元格 D1 數據,讀

到 D1 單元格。

6 Range(Cells(1, 5), Cells(5, 5)) = Sheet4.Cells(1, 5) ‘把 Shee4 工

作表單元格 E1 數據,讀到 E1:E 5單元格。

End Sub

你點選任何單元格,按 Selection 按鈕,則所點選的單元格均會被輸入 Shee4 工

作表單元格 F1 數據。

Public Sub Selection1()

Selection.Value = Sheet4.[F1] ‘把 Shee4 工作表單元格 F1 數據,讀到任

何你點選的單元格。

End Sub

VBALesson3 程序說明:

如何利用 Worksheet_SelectionChange 輸入數據的方法。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Target = 100

End Sub

Target 指的是你鼠標所選的單元格,Worksheet_SelectionChange() 事件的參數

可以是一個也可以是好幾個單元格。

Range 是 Excel 特有的變量形態,叫范圍。

Target As Rang 是把 Target 這個參數設定為 Range 變量形態。

Target = 100 是把你點選的單元格輸入數字100。

VBALesson4 程序說明:

如何利用 Worksheet_SelectionChange 在限定的單元格輸入數據的方法。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Row >= 2 And Target.Column = 2 Then

Target = 100

End If

End Sub

If … Then … End If 這是我們學的這一個邏輯判斷語句。

Target.Row >= 2,指的是鼠標選定的單元格的行大于或等于 2。

Target.Column = 2 ,指的是鼠標選定的單元格的欄等于 2。

If Target.Row >= 2 And Target.Column = 2 Then 指的是只有在Target.Row >=

2及Target.Column = 2二個條件成立時。

就是 (Target.Row >= 2) 為True及(Target.Column = 2)為True時,才執行下面的

程序 Target=100,

也就是 B 欄第二行及以下行用鼠標被點選時,才會被輸入100,其它單元格則不被輸

入數據。

VBALesson5 程序說明:

比較 Worksheet_SelectionChange() 與用按鈕 CommandButton1_Click() 來執行

程序二者的方法與寫法有何不同。

Worksheet_SelectionChange()事件

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Row >= 2 And Target.Column = 2 Then

Target = 100

End If

End Sub

按鈕 CommandButton1_Click()

Private Sub CommandButton1_Click()

If ActiveCell.Row >= 2 And ActiveCell.Column >= 3 Then

ActiveCell = 100

End If

End Sub

二者執行方法最大的地方,在于 Worksheet_SelectionChange() 是自動的,你不用

了解他是怎么完成工作的。

按鈕 CommandButton1_Click() 是人工的,比 SelectionChange()多一道手續,

就是要去按那接鈕,程序才會執行。

SelectionChange() 有一個參數 Target 可用;CommandButton1_Click ()沒有。

所以我們要用 ActiveCell 內定函數來取代Target,ActiveCell 與 Target最大的

不同點他只能指定一個單元格。

就是你選取多個單元格也只有最上面的單元格會加上數據;用 Selection 取代

ActiveCell, 用法就跟 Target 一樣了。

VBALesson 6 程序說明:

完整的 If…Then ┅ End 邏輯判斷式。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Row >= 2 And Target.Column = 2 Then

Target = 200

ElseIf Target.Row >= 2 And Target.Column = 3 Then

Target = 300

ElseIf Target.Row >= 2 And Target.Column = 2 Then

Target = 400

Else

Target = 500

End If

End Sub

這是個完整的 If 邏輯判斷式,意思是說,假如 If 後的判斷式條件成立的話,就

執行第二條程序,否則假如 ElseIf 後的判斷式條件成立的話,就執行第四條程序

,否則假如另一個 ElseIf 後的判斷式條件成立的話,就執行第六條程序。

Else 的意思是說,假如以上條件都不成立的話,就執行第八條程序。

他的執行方式是假如 IF 的條件成立的話,就不執行其它ElseIf 及Else 的邏輯判

斷式,假如 If 後的條件不成立的話才會執行 ElseIf 或 Else 邏輯判斷式。第二

個 ElseIf後的條件因為與 IF 後的條件一樣,所以這個判斷式後面的 Target=400

將是永遠無法執行到的程序。

VBALesson 7 程序說明∶我們為什麼要用變數。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim i , j As Integer

Dim k As Range

i = Target.Row

j = Target.Column

Set k = Target

If i >= 2 And j = 2 Then

k = 200

ElseIf i >= 2 And j = 3 Then

k = 300

ElseIf i >= 2 And j = 4 Then

k = 400

Else

k = 500

End If

End Sub

跟VBALesson 6比較,程序是不是明朗多了,在前課重復的用 Target.Row,

Target.Column及Target來寫程序是不是有一點煩。用變量的第一個好處大家馬上感

覺得出來,就是可以簡化程序。

使用變量前,你得先宣告變量。宣告變量的方法是在 “Dim ” 后面寫上變量 ” i

” As 后面接上變量的形態 “Integer”。

Dim i , j As Integer 就是宣告 i 與 j 為整數變量,這是同時宣告二個變量

i 與 j 所以要在二個變量間加個 ” , “號。

Dim k As Range 是宣告 k 為范圍資料形態,Range這是 Excel 特有的資料形態

i = Target.Row是把當前單元格的行數,指定給變量 i。

j = Target.Column 是把當前單元格的欄數,指定給變量 j。

Set k = Target 是把當前的單元格,指定給變量 k。

用像 i 與 j 這樣簡單的變量,在程序的前面你可能還記得 i 或 j 代表著

什厶。程序寫長了,你可能忘記 i 或 j 代表著什厶。所以最好的方法是用比較有

意義的代號,來為變量命名如 iRow 或 iCol 來取代 i 及 j 。

VBALesson 8 程序說明∶體會一下Worksheet_Change()事件。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim iRow, iCol As Integer

iRow = Target.Row

iCol = Target.Column

If iRow >= 2 And iCol = 2 And Target “” Then

Application.EnableEvents = False

Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2

Application.EnableEvents = True

ElseIf iRow >= 2 And iCol = 2 And Target = “” Then

Cells(iRow, iCol + 1) = “”

Else

Cells(iRow, iCol + 1) = “”

End If

End Sub

前幾個教程都是用Worksheet_SelectionChange 事件來舉例子,大家應該能體會他

是怎厶一回事了吧。

這個教程就是要讓你來體會什厶是Worksheet_Chang()事件。因為這二個事件在VBA

都是非常有用的,所以一定要了解。

簡單的說,前者是你鼠標移動到那個單元格,就觸發那個事件的執行。後者是要等到

你點選的單元格,數 有了改變才會觸發事件的執行。二者執行的時機一前一後。

Target “” 是代表限定當前的單元格要是有數 的,才會執行以下三行的程序。

Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2,是你在 B 欄輸入數 時,C

欄將可得到 B 欄二倍的數 。

Target = “” 是限定當前的單元格要是沒有數 的,才會執行以下一行的程序。

Cells(iRow, iCol + 1) = “”,是把 C 欄的數 清成空格。

Application.EnableEvents = False與Application.EnableEvents = True,這是

個成雙的程序,當你用了前者記得在執行其他程序後要寫上後面的程序。它的目的在

抑制事件連鎖執行。簡單的說就是,在 B 字段所觸發的事件,不愿在其它單元格再

觸發另一個Worksheet_Change()事件。

VBALesson 9 程序說明∶體會一下Worksheet_Change()事件連鎖反應。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim iRow As Integer

iRow = Target.Row

Application.EnableEvents = False

Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2)

Application.EnableEvents = True

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Dim iRow As Integer

iRow = Target.Row

‘Application.EnableEvents = False

Cells(iRow, 3) = Cells(iRow, 3) + Cells(iRow, 2)

‘Application.EnableEvents = True

End Sub

這個程序的目的是要在 B2 輸入新的數 時,C2 會將 B2 輸入的新數 加上 C2 原

有的數 呈現在 C2 上。

照上面有加上 Application.EnableEvents = False 程序執行當然沒問題。

現在你在 Application.EnableEvents = False 與 Application.EnableEvents =

True 前加上「 ‘」看看。

程序前加上「 ‘」的目的是要使「 ‘」之后的文字變成說明文字,程序執行時是會跳

過說明文字,不執行說明文字的內容。

程序前加上「 ‘」符號后,文字會變成綠色。

執行第二個程序時,你將發現 C2 不會按你所要求的,呈現結果。

這就是所謂的事件連鎖反應。

請問這個宏該如何寫!

我想運行一個宏,就能在當前工作表B3上填上一條公式;這條公式的結果是所有工作

表上的B4單元格的和.請問這個宏該如何寫.謝謝!

Sub gg()

Dim sh As Worksheet, shname$

For Each sh In Worksheets

shname = sh.Name

ActiveSheet.Range(“b3”).value = ActiveSheet.Range(“b3”).value +

Worksheets(shname).Range(“b4”)

Next

End Sub

VBA中怎樣創建一個名為“table”的新工作表

通過VBA編程,很容易添加新的工作表,但是新表的名字不知怎樣控制,對于新創建

的工作表,由于其名字并非特定,所以就不好使用所創建的新表了。不知各位有何高

見。。。。

Sheets.Add

ActiveSheet.Name = “table”

請教:如何用VBA檢索表1中A列與表2,3,4,5…..中A列相同的行并把后者整行拷

貝到表1檢索到的行中,謝謝!!!!

To yxptwq∶用這程序試看看。

Sub Copy1()

Dim Row_dn1, Row_dnN, i, j, n As Integer

Row_dn1 = Sheet1.Range(“A65536”).End(xlUp).Row

k = 1: n = 1

For Each wSheet In ActiveWorkbook.Worksheets

With wSheet

If .Name “Sheet1” Then

Row_dnN = .Range(“A65536”).End(xlUp).Row

For i = 2 To Row_dn1

For j = 2 To Row_dnN

If .Cells(j, 1) = Sheet1.Cells(i, 1) Then

.Rows(j & “:” & j).Copy Destination:=Sheet1.Rows(Row_dn1 +

n & “:” & Row_dn1 + n)

n = n + 1

End If

Next j

Next i

End If

End With

Next wSheet

End Sub

如果要用VBA程式輸入密碼使用下列程式碼

Sub EnterNewPW()

‘程式說明:利用SendKey輸入VBAProject密碼

‘注意事項:執行本程式需要在Excel視窗,不能在VBE視窗

Application.SendKeys “%{F11}”, True ‘Alt + F11 切換到VBA視窗

Application.SendKeys “%T”, True ‘ALT + T 工具(繁體中文是(T))

Application.SendKeys “e”, True ‘工具(T)-VBproject屬性(E)

Application.SendKeys “^{TAB}”, True ‘TAB 鍵(切換到PAge2 保護頁面)

Application.SendKeys “{+}”, True ‘選取Checkbox方塊(鎖定專案以供檢

視)

‘({+} 選取, {-} 取消選取)

Application.SendKeys “{TAB}”, True ‘TAB 鍵(跳到第一次輸入密碼

Textbox

myPW = “chijanzen” ‘假設密碼 chijanzen

Application.SendKeys myPW, True ‘輸入密碼

Application.SendKeys “{TAB}”, True ‘TAB 鍵(跳到第二次輸入密碼

Textbox

Application.SendKeys myPW, True ‘輸入密碼

Application.SendKeys “{ENTER}”, True ‘按確定鈕(預設值)

Application.SendKeys “%{F11}”, True ‘返回Excel視窗

End Sub

冒泡排序法:

冒泡排序法之所以成為“冒泡排序”是因為值較小的或是較輕的元素浮到作為繼續排

序的一組數的頂部。

Sub Macro1()

Dim i As Integer

Dim j As Integer

Dim t as integer

Static number(1 To 10) As Integer

For i = 1 To 10

number(i) = inputbox“輸入要排序的數:”

Next i

For i = 10To 2 Step -1

For j = 1 To i – 1

‘下面進行位置交換

If number(j) > number(j + 1) Then

t = number(j + 1)

number(j + 1) = number(j)

number(j) = t

End If

Next j

Next i

For i = 1 To 20

Print number(i)

Next i

End sub

首先定義一個數組:通過循環錄入10個整數,然后用一個二重循環測試前一個數是否

大于后一個數。如果大于則交換兩個數的下標,即交換兩個數在數組中的位置,交換

通過一個變量來進行。

我先用傳統的方法解決這個問題,經過比較,選用了較為簡單的和高效的排序方法

——“快速排序”,具體算法可參考數據結構等有關書籍。對所有數據排序后再合

并相同數據,合并程序較為簡便,我開始時采用了這種方法,但后來發現對于這些

的數據,先合并后排序速度更快,因為有大量相同的數據。合并是采用“標記”算

法,具體如下:(設數據已存放在sData()數組中 ,結果存到Queryp()數組,

Amount是數據個數)

‘把相同元素置 0

For i = 1 To Amount

If sData(i) 0 Then

For j = i + 1 To Amount

If sData(i) = sData(j) Then sData(j) = 0

Next j

End If

Next i

‘刪除相同元素

Queryp(1) = sData(1)

k = 1

For i = 2 To Amount

If Not (sData(i) = 0) Then

k = k + 1

Queryp(k) = sData(i)

End If

Next i

kMax = k

ReDim Preserve Queryp(kMax)

雖然這樣使得運算速度有所高,但是仍然要進行大量的循環運算,占據了程序大部

分的運算時間。于是我一直在尋覓一種更為高效的算法。

功夫不負有心人,在仔細分析數據的特征,比較了多種方案之后,我終于找到了一

種相當成功的算法,原來要3到4秒的運算縮短到僅需0.1到0.2秒。

我遇到的數據具有以下特征:①相同數據很多,②最大、最小數之間相差不到3,

③都是帶兩位小數的正數。

針對數據的特征,我采用了以下算法:

針對數據的特征,我采用了以下算法:

步驟:

1. 用一個循環找出整數和小數部分的最大、最小值。小數部分的最大、最小值乘

以100轉為整數。

2. 定義一個二維數組,下標范圍分別是整數和小數部分的最小值到最大值。

3. 再用一個循環把所有源數據填入剛才定義的二維數組,填寫規則是,源數據的

整數和小數部分分別對應二維數組的兩個下標。例如,“13.51″填到“A(13,51)”

中。

4. 最后順向或逆向讀取二維數組中的非零數據即可得到從小到大或從大到小排列

的數據,而且不會含有重復數據。

http://apps.hi.baidu.com/share/detail/26844151


轉載于:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容