2012年8月13日 星期一

Excel VBA 使用函數範例參考之六

自定義菜單
  把建立和刪除自定義菜單的代碼分別寫在Workbook_open和Workbook_beforeclosed
  的事件中。
  應該用VBA,工作薄代碼中有workbook-open()過程,在該過程中寫入
  with activeworkbook
  .sheets("表2").active
  end with
  VBA實現向鎖定工作表中插入行,並自動複制上面行中指定列的函數
  Option Explicit
  Public Const strPass = "123" 123是口令
  Sub 行上再插入一行()
  ActiveSheet.Unprotect password:=strPass
  Selection.Copy
  Selection.Insert Shift:=xlDown
  Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone,
  SkipBlanks:= _
  False, Transpose:=False
  Application.CutCopyMode = False
  ActiveSheet.Protect password:=strPass
  End Sub
  如何使不出現每次關閉XLS文件時出現的:
  “XXX.xls檔已被修改,是否可在其修改後的內容?”字樣??
  可以在工作表關閉之前進行手工保存工作
  ThisWorkbook.save
  如何實現動態時間顯示?
  sub mytime
  range("a1")=now()
  Application.OnTime Now + Timevalue("00:00:01"), "mytime"
  end sub
  用 vba 判斷指定 excel 檔是否打開?
  For Each w In Workbooks
  If w.Name XXX Then
  …………
  End If
  Next w
  vba怎麽調用excel自帶的函數?比如vlookup?
  Application.WorksheetFunction.f(x)
  f(x)是你想使用的工作表函數
  但是用內部函數時引用單元格會出錯,怎麽辦?
  把你要引用的單元格改成VBA認可格式(類型)。如在Excel中的“F7:F12”應改爲
  “Range("F7:F12")”等。
  VBA中如何關閉,保存和退出Excel?
  Workbooks("你的工作簿").Save。
  下表舉例說明瞭使用 Rows 和 Columns 屬性的一些行和列的引用。
  引用 含義
  Rows(1) 第一行
  Rows 工作表上所有的行
  Columns(1) 第一列
  Columns("A") 第一列
  Columns 工作表上所有的列
  若要同時處理若幹行或列,請創建一個對象變量並使用 Union 方法,將對 Rows 屬
  性或 Columns 屬性的多個調用組合起來。下例將活動工作簿中第一張工作表上的第
  一行、第三行和第五行的字體設置爲加粗。
  Sub SeveralRows()
  Worksheets("Sheet1").Activate
  Dim myUnion As Range
  Set myUnion = Union(Rows(1), Rows(3), Rows(5))
  myUnion.Font.Bold = True
  End Sub
  如果只是你說的只連接幾個儲存格那用簡單的方法
  Range("A1").Formula = Application.Evaluate("=[Book2.xls]Sheet1!A1")
  或
  Range("A1").Formula = "=[Book2.xls]Sheet1!A1"
  請問在vba如何呼叫已定義的名稱範圍
  我在a1:b100插入名稱∶myrange
  請問我如何用vba選取此範圍
  Range("myrange").Select
  如何訪問沒有打開的EXCEL文件?
  Sub AlternativeImport()
  Dim xlapp As Excel.Application
  Dim wbSource As Excel.Workbook
  Set xlapp = New Excel.Application
  xlapp.EnableEvents = False
  Set wbSource = xlapp.Workbooks.Open("C:\test\Book2.xls")
  Range("A1:A10").Value = wbSource.Sheets("Sheet1").Range
  ("A1:A10").Value
  wbSource.Close False
  xlapp.Quit
  End Sub
  怎樣使VBAprject工程不可查看?(不用密碼)
  用可編輯十六進制文件的軟件工具(如WinHex等)打開Excel.xls,在文件的尾部,查
  找ID="{00000000-0000-0000-0000-000000000000}"(有工程鎖定密碼時),或
  ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"(沒有工程鎖定密碼時),修改其中
  的任意1位後,保存,即可達到目的.當查看工程是會出現“工程不可查看”的提示.
  注意:修改前,一定要備份原文件,以防不測
  如何用VBA控制報表的格式(左邊距,紙張大小,列印第幾頁等)
  列印第幾頁控制:ActiveWindow.SelectedSheets.PrintOut From:=x, To:=y
  ActiveSheet.PageSetup.LeftMargin= 左邊距
  ActiveSheet.PageSetup..PaperSize = 紙張大小
  如何使VBA自動消除使用COPY複制後産生的虛線框?
  Application.CutCopyMode = False
  替換Excel 97的菜單欄是很容易的,只需創建一個新的菜單欄就會刪除Excel 97的
  菜單欄。當需要恢複Excel 97的菜單欄時,只要刪除新創建的菜單欄就可以了。該
  系統的自定義菜單中只需兩個命令按鈕,一個用來返回到系統的主畫面
  (ReturnMAIN),另一個用來退出系統(ExitSYS)。下麵是模塊(Module)中有關
  的巨集或是事件控制程式。
  Sub ZapMenu( )
  On Error Resume Next
  CommandBars(“保險查詢系統”).Delete
  End Sub
  這是一個用來刪除自定義菜單欄的宏。語句On Error Resume Next保證無論自
  定義菜單欄是否存在都能正確刪除它。
  Sub ExitSYS( )
  ZapMenu
  ActiveWorkbook.Close SaveChanges := False
  End Sub
  這是用來退出系統的宏。它刪除自定義菜單,並關閉活動的工作簿(不提示保存
  修改)。
  Sub ReturnMAIN( )
  Worksheets(“保險查詢系統”).Select
  End Sub
  該宏用來返回主畫面。它啟動“保險查詢系統”工作表。
  Sub SetMenu( )
  Dim myBar As CommandBar
  Dim myButton As CommandBarButton
  ZapMenu
  Set myBar = CommandBars.Add(Name:=“保險查詢系統”, _
  Position :=msoBarTop, _
  MenuBar :=True)
  Set myButton = myBar.Controls.Add(msoControlButton)
  myButton. = msoButtonCaption
  myButton.Caption = “退出[&E]”
  myButton.OnAction = “ExitSYS”
  Set myButton = myBar.Controls.Add(msoControlButton)
  myButton. = msoButtonCaption
  myButton.Caption = “返回[&R]”
  myButton.OnAction = “ReturnMAIN”
  myButton.Visible = False
  myBar.Protection = msoBarNoMove + msoBarNoCustomize
  myBar.Visible = True
  End Sub
  這個巨集包含五部分。第一部分定義了一對變量。第二部分首先運行ZapMenu巨集,
  保證保險查詢系統菜單欄是不存在的,然後創建它。參數MenuBar的值設爲True,確
  保這個新創建的命令欄爲一菜單欄。第三部分和第四部分將兩個命令按鈕加入到菜單
  欄中。並設置ReturnMAIN命令按鈕的初始狀態爲不可見狀態。最後一部分保護這個
  新創建的菜單欄,使用戶不能移動也不能自定義新菜單欄。
  工作表彙總
  Sub sum() '表彙總,第1張的a1:e20等於所有表的相同單元格的和
  Attribute sum.VB_ProcData.VB_Invoke_Func = "z\n14"
  Dim X As Worksheet
  For y = 1 To 20
  For z = 1 To 5
  For Each X In Worksheets
  shname = X.Name
  ActiveSheet.Cells(y, z).Value = ActiveSheet.Cells(y, z).Value +
  Worksheets(shname).Cells(y, z)
  Next
  Next z
  Next y
  End Sub(王朝網路 wangchao.net.cn)
補充說明:
在我們日常使用Excel的時候,不僅會用到當前Excel文件的數據,還經常需要訪問其他的數據文件。這些數據文件可能是Excel文件、文本文件或數據庫文件等。經常有朋友會問如何在vba代碼裏操作這些數據文件?本文就系統地介紹一下在Excel中應用VBA操作數據文件的方法。
  本文主要介紹四種常用的方法:
  1、利用Excel對象來處理文件;
  2、利用VBA文件處理語句來處理文件;
  3、利用FileSystemObject對象來處理文件;
  4、利用API函數來處理文件。
  當然對于數據庫文件,還可以利用ADO+SQL的方法操作,不過論壇已經有前輩詳細介紹過此類方法,本文就不再重複了。
  一、利用Excel對象來處理文件
  利用Excel對象自帶的方法來操作文件是最方便,也是最簡單的。
  我們主要利用Workbooks集合和Workbook對象的方法來操作文件。
  1、打開Excel文件
  我們可以用Workbooks.Open方法打開一個Excel工作簿。
  Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
   其中FileName是必選的參數,表示要打開的工作簿名,如果沒有指定路徑,則代表當前路徑。另外14個是可選參數,除了密碼參數,其他的一般很少用。具體的含義可以參看VBA的幫助。
  例:
   Workbooks.Open "F:\test.xls"
  可以打開F盤的test.xls文件。
  2、打開文本文件
   使用Open方法也可以打開文本文件,但建議使用OpenText方法。此方法是載入一個文本文件,並將其作爲包含單個工作表的工作簿進行分列處理,然後在此工作表中放入經過分列處理的文本文件數據。完整語法如下:
  Workbooks.OpenText(FileName, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local)
  關于以上參數的具體含義可以參看VBA的幫助,這裏就不重複了。在實際的編程中,一般無需對這些複雜的參數進行處理。可以通過錄制宏來得到打開一個文本文件的VBA代碼。具體方法就是選擇“文件——打開”,然後選擇打開文本文件,就會出現文本導入向導,一步一步執行完,直到文本打開後,停止錄制。
  以下是錄制宏得到的代碼:
  Sub Macro1()
  '
  ' Macro1 Macro
  ' 宏由 MC SYSTEM 錄制,時間: 2007-3-29
  '
  '
   Workbooks.OpenText Filename:="F:\CallWindowProc.txt", Origin:=xlWindows, _
   StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
   ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
   , Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
   TrailingMinusNumbers:=True
  End Sub
  在實際編程中只要做相應的修改就可以使用了。
  3、打開其他文件
  利用Excel對象還可以打開XML文件和一些數據庫(如Access)文件,對應XML文件,需要Excel2003以上的版本。
  OpenXML方法的語法如下:
  Workbooks.OpenXML(Filename, Stylesheets, LoadOption)
  FileName String 類型,必需。要打開的文件名。
  Stylesheets Variant 類型,可選。單個值或值的數組,用于指定要應用哪些 XSL 轉換 (XSLT) 樣式表處理指令。
  LoadOption Variant 類型,轉換。指定 Excel 打開 XML 數據文件的方式。可爲 XlXmlLoadOption 常量之一。
  XlXmlLoadOption 可爲以下 XlXmlLoadOption 常量之一:
  xlXmlLoadImportToList 將 XML 數據文件的內容置于 XML 列表中。
  xlXmlLoadMapXml 在“XML 結構”任務窗格中顯示 XML 數據文件的架構。
  xlXmlLoadOpenXml 打開 XML 數據文件。文件的內容將展開。
  xlXmlLoadPromptUser 提示用戶選擇打開文件的方式。
  示例
  下面的代碼打開了 XML 數據文件“customers.xml”並在 XML 列表中顯示了此文件的內容。
  Sub UseOpenXML()
   Application.Workbooks.OpenXML _
   Filename:="customers.xml", _
   LoadOption:=xlXmlLoadImportToList
  End Sub
  OpenDatabase 方法語法如下:
  Workbooks.OpenDatabase(FileName, CommandText, CommandType, BackgroundQuery, ImportDataAs)
  FileName String 類型,必需。連接字符串。
  CommandText Variant 類型,可選。查詢的命令文本。
  CommandType Variant 類型,可選。查詢的命令類型。以下是可用的命令類型:Default、SQL 和 Table。
  BackgroundQuery Variant 類型,可選。查詢的背景。
  ImportDataAs Variant 類型,可選。確定查詢的格式。
  示例
  本示例中,Excel 打開了“northwind.mdb”文件。
  Sub OpenDatabase()
  Workbooks.OpenDatabase FileName:="C:\northwind.mdb"
  End Sub
  4、保存文件
  文件的保存使用Workbook對象的Save或SaveAs方法。
  Save方法使用簡單,語法爲
  expression.Save,expression是某個Workbook對象。
  如:ActiveWorkbook.Save
  即保存當前活動工作簿。
  如果是第一次保存工作簿或要另存爲,請使用 SaveAs 方法爲該文件指定文件名。
  其語法爲:
  expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
  具體參數含義可參看VBA幫助,使用都比較簡單。
  示例
  本示例新建一個工作簿,提示用戶輸入文件名,然後保存該工作簿。
  Set NewBook = Workbooks.Add
  Do
   fName = Application.GetSaveAsFilename
  Loop Until fName <> False
  NewBook.SaveAs Filename:=fName
  Application.GetSaveAsFilename爲調出標准的“另存爲”對話框,獲取用戶文件名,但並不真正保存任何文件,然後使用代碼保存文件。還有Application.GetOpenFileName可以調出標准的“打開”對話框。
  5、關閉文件
  關閉文件可以使用Workbooks集合或Workbook對象的 Close 方法。前者是關閉所有打開的工作簿,後者關閉特定的工作簿。
  Workbook對象的 Close 方法語法爲:
  expression.Close(SaveChanges, Filename, RouteWorkbook)
  SaveChanges參數表示是否保存更改,對許多不需要更改的操作,可設置爲False以免彈出保存更改提示的對話框。
  FileName 可選。以此文件名保存所做的更改。
  RouteWorkbook 可選。如果指定工作簿不需要傳送給下一個收件人(沒有傳送名單或已經傳送),則忽略該參數。
  示例
  本示例關閉 Book1.xls,並放棄所有對此工作簿的更改。
  Workbooks("BOOK1.XLS").Close SaveChanges:=False
  
  本示例關閉所有打開的工作簿。如果某個打開的工作簿有改變,Microsoft Excel 將顯示詢問是否保存更改的對話框和相應提示。
  Workbooks.Close
  6、綜合實例
  假如F盤有一個Excel文件test.xls,現在有另一個Excel文件要訪問test.xls的數據,我們來看用VBA代碼如何操作。代碼如下:
  Public Sub test()
  Application.ScreenUpdating = False
  Workbooks.Open "f:\test.xls"
  ThisWorkbook.Sheets(1).Range("b1") = ActiveWorkbook.Sheets(1).Range("a2")
  ActiveWorkbook.Close
  Application.ScreenUpdating = True
  End Sub
  首先關閉屏幕刷新,是爲了防止test.xls在打開時被看見(有時候還是看的見)。打開後,見test.xls的Sheet1的單元格A2中的值賦給當前工作簿的Sheet1的單元格B2,然後關閉test.xls。
  當要打開的工作簿不確定的時候,可以通過調用打開對話框來讓用戶自己選擇。
  可改爲如下:
  Public Sub test()
  Application.ScreenUpdating = False
  Dim Filename as String
  Filename = Application.GetOpenFileName
  Workbooks.Open Filename
  ThisWorkbook.Sheets(1).Range("b1") = ActiveWorkbook.Sheets(1).Range("a2")
  ActiveWorkbook.Close
  Application.ScreenUpdating = True
  End Sub
  7、總結
  利用Excel對象的方法進行文件操作是最簡單,也是最方便的,適合初學者。對于Excel文件格式,如果我們僅僅是讀取其表格中的內容,這種方法也是首選。對于文本文件的操作,使用第二種方法比較方便,若要將文本轉換成表格,那麽使用此方法也是合適的.

 相關閱讀...

Excel VBA 使用函數範例參考之一
Excel VBA 使用函數範例參考之二
Excel VBA 使用函數範例參考之三
Excel VBA 使用函數範例參考之四
Excel VBA 使用函數範例參考之五

沒有留言:

張貼留言