VBA在Excel中的应用(四)

简介:

目录

 Column
 ComboBox
 Copy Paste 
 CountA 
 Evaluate 
 Excel to XML 
 Excel ADO 
 Excel to Text File 
 Excel Toolbar 

Column

  1. 1. 选择整列
    Sub  SelectEntireColumn()
        Selection.EntireColumn.Select
    End Sub
  2. 2. 将指定的列序号转换为列名
    复制代码
    Function  GetColumnRef(columnIndex  As   Integer As   String
        
    Dim  firstLetter  As   String
        
    Dim  secondLetter  As   String
        
    Dim  remainder  As   Integer

        
    Select   Case  columnIndex  /   26
            
    Case   Is   <=   1        ' Column ref is between A and Z
                firstLetter  =   Chr (columnIndex  +   64 )
                GetColumnRef 
    =  firstLetter
            
    Case   Else        ' Column ref has two letters
                remainder  =  columnIndex  -   26   *  (columnIndex  \   26 )
                
    If  remainder  =   0   Then
                    firstLetter 
    =   Chr ( 64   +  (columnIndex  \   26 -   1 )
                    secondLetter 
    =   " Z "
                    GetColumnRef 
    =  firstLetter  &  secondLetter
                
    Else
                    firstLetter 
    =   Chr ( 64   +  (columnIndex  \   26 ))
                    secondLetter 
    =   Chr ( 64   +  remainder)
                    GetColumnRef 
    =  firstLetter  &  secondLetter
                
    End   If
        
    End   Select
    End Function
    复制代码
    如columnIndex为11则转换后的列名为K,columnIndex为111则转换后的列名为DG。 
  3. 3. 将数组直接赋值给Columns
    复制代码
    Private   Sub  CommandButton1_Click()
        
    Dim  MyArray( 5 )
        
    For  i  =   1   To   5
            MyArray(i 
    -   1 =  i
        
    Next  i
        Cells.Clear
        Range(Cells(
    1 1 ), Cells( 1 5 ))  =  MyArray
    End Sub
    复制代码
  4. 4. 指定Column的宽度
    Sub  colDemo()
         ActiveCell.ColumnWidth 
    =   20
    End Sub
    又如Range("C1").ColumnWidth = Range("A1").ColumnWidth
  5. 5. 清除Columns的内容
    Sub  clear()
        Columns.clear
    End Sub
    这将导致当前Sheet中所有的内容被清除,等同于Cells.Clear,如果要清除特定列中的内容,可以给Columns加上参数。其它相关的还有Columns.ClearContents,Columns.ClearFormats,Columns.AutoFit,Columns.NumberFormat = "0.00%"等,与Cells对象中提供的诸多方法相似。


 返回目录

 ComboBox

  1. 1. 填充数据到ComboBox
    复制代码
    Private   Sub  Workbook_Open()
        
    Dim  vMonths  As  Variant
        
    Dim  vYears  As  Variant
        
    Dim  i  As   Integer

        
    ' Create date arrays
        vMonths  =  Array( " Jan " " Feb " " Mar " " Apr " " May " " Jun " , _
                            
    " Jul " " Aug " " Sep " " Oct " " Nov " " Dec " )
        vYears 
    =  Array( 2006 2007 )

        
    ' Populate months using AddItem method
         For  i  =   LBound (vMonths)  To   UBound (vMonths)
            Sheet1.ComboBox1.AddItem vMonths(i)
        
    Next  i

        
    ' Populate years using List property
        Sheet1.ComboBox2.List  =  WorksheetFunction.Transpose(vYears)
    End Sub
    复制代码
    LBound和UBound分别表示了数组的下标和上标,该示例采用了两种不同的方法填充ComboBox,一种是在循环中采用AddItem方法,一种是使用Excel的系统函数Transpose。通过ComboBox.Value可以得到ComboBox的当前值。


 返回目录

 Copy Paste

  1. 1. 利用VBA复制粘贴单元格
    复制代码
    1  Private   Sub  CommandButton1_Click()
    2      Range( " A1 " ).Copy
    3      Range( " A10 " ).Select
    4      ActiveSheet.Paste
    5      Application.CutCopyMode  =   False
    6  End Sub
    复制代码
    示例将A1单元格复制到A10单元格中,Application.CutCopyMode = False用来告诉Excel退出Copy模式,此时被复制的单元格周围活动的虚线将消失。还有一种较为简单的粘贴方式,用ActiveSheet.Paste Destination := Range("A10")代替上例中的3、4行,或者直接用Range("A1").Copy Destination := Range("A10")代替上例中的2、3、4行。
  2. 2. 使用VBA进行单元格复制粘贴的一个例子
    复制代码
    Public   Sub  CopyAreas()
      
    Dim  aRange  As  Range
      
    Dim  Destination  As  Range
      
      
    Set  Destination  =  Worksheets( " Sheet3 " ).Range( " A1 " )
      
    For   Each  aRange  In  Cells.SpecialCells(xlCellTypeConstants, xlNumbers).Areas
        aRange.Copy Destination:
    = Destination
        
    Set  Destination  =  Destination.Offset(aRange.Rows.Count  +   1 )
      
    Next  aRange
    End Sub
    复制代码


 返回目录

 CountA

  1. 1. 返回当前所选区域中非空单元格的数量
    Sub  CountNonBlankCells()              
        
    Dim  myCount  As   Integer                   
        myCount 
    =  Application.CountA(Selection)
        
    MsgBox   " The number of non-blank cell(s) in this selection is :   "   &  myCount, vbInformation,  " Count Cells "
    End Sub
    Count函数返回当前所选区域中的所有单元格数量,而CountA函数则返回当前所选区域中非空单元格的数量。 


 返回目录

 Evaluate

  1. 1. 使用Evaluate函数执行一个公式
    复制代码
    Public   Sub  ConcatenateExample1()
       
    Dim  X  As   String , Y  As   String
       X 
    =   " Jack  "
       Y 
    =   " Smith "
       
    MsgBox  Evaluate( " CONCATENATE("" "   &  X  &   " "","" "   &  Y  &   " "") " )
    End Sub
    复制代码
    Evaluate函数对给定的表达式进行公式运算,如果表达式匹配公式失败则抛出异常。示例中对公式Concatenate进行运算,该公式将给定的多个字符串连接起来。如下面这个例子用来判断当前单元格是否为空:
    复制代码
    Sub  IsActiveCellEmpty()
       
    Dim  stFunctionName  As   String
       
    Dim  stCellReference  As   String
       stFunctionName 
    =   " ISBLANK "
       stCellReference 
    =  ActiveCell.Address
       
    MsgBox  Evaluate(stFunctionName  &   " ( "   &  stCellReference  &   " ) " )
    End Sub
    复制代码


 返回目录

 Excel to XML

  1. 1. 导入XML文件到Excel的一个例子
    复制代码
    Sub  OpenAdoFile() 
        
    Dim  myRecordset  As  ADODB.Recordset 
        
    Dim  objExcel  As  Excel.Application 
        
    Dim  myWorkbook  As  Excel.Workbook 
        
    Dim  myWorksheet  As  Excel.Worksheet 
        
    Dim  StartRange  As  Excel.Range 
        
    Dim  h  as   Integer  

        
    Set  myRecordset  =   New  ADODB.Recordset 

        myRecordset.Open 
    " C:\data.xml " " Provider=MSPersist "  

        
    Set  objExcel  =   New  Excel.Application 
        
    Set  myWorkbook  =  objExcel.Workbooks.Add 
        
    Set  myWorksheet  =  myWorkbook.ActiveSheet 
        objExcel.Visible 
    =   True  
            
    For  h  =   1   To  myRecordset.Fields.Count 
                myWorksheet.Cells(
    1 , h).Value  =  myRecordset.Fields(h  -   1 ).Name 
            
    Next  
        
    Set  StartRange  =  myWorksheet.Cells( 2 1
        StartRange.CopyFromRecordset myRecordset 
        myWorksheet.Range(
    " A1 " ).CurrentRegion.Select 
        myWorksheet.Columns.AutoFit 
        myWorkbook.SaveAs 
    " C:\ExcelReport.xls "  

        
    Set  objExcel  =   Nothing  
        
    Set  myRecordset  =   Nothing  
    End Sub
    复制代码


 返回目录

 Excel ADO

  1. 1. 使用ADO打开Excel
    复制代码
    Sub  Open_ExcelSpread()
       
    Dim  conn  As  ADODB.Connection
       
    Set  conn  =   New  ADODB.Connection
       conn.Open 
    " Provider=Microsoft.Jet.OLEDB.4.0; "   &  _
           
    " Data Source= "   &  CurrentProject.Path  &  _
           
    " \Report.xls; "   &  _
           
    " Extended Properties=Excel 8.0; "
       conn.Close
       
    Set  conn  =   Nothing
    End Sub
    复制代码
  2. 2. 使用SQL语句在用ADO打开的Excel中插入一行数据
    复制代码
    Public   Sub  WorksheetInsert()
      
    Dim  Connection  As  ADODB.Connection
      
    Dim  ConnectionString  As   String
      ConnectionString 
    =   " Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "   &  ThisWorkbook.Path  &   " \Sales.xls; "   &  _
        
    " Extended Properties=Excel 8.0; "
        
      
    Dim  SQL  As   String
        
      SQL 
    =   " INSERT INTO [Sales$] VALUES('VA', 'On', 'Computers', 'Mid', 30) "

      
    Set  Connection  =   New  ADODB.Connection
      
    Call  Connection.Open(ConnectionString)
        
      
    Call  Connection.Execute(SQL, , CommandTypeEnum.adCmdText  Or  ExecuteOptionEnum.adExecuteNoRecords)
      Connection.Close
      
    Set  Connection  =   Nothing
    End Sub
    复制代码
  3. 3. 使用ADO从Access读取数据到Excel
    复制代码
    Public   Sub  SavedQuery()
        
      
    Dim  Field  As  ADODB.Field
      
    Dim  Recordset  As  ADODB.Recordset
      
    Dim  Offset  As   Long
        
      
    Const  ConnectionString  As   String   =   " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydb.mdb;Persist Security Info=False "
        
      
    Set  Recordset  =   New  ADODB.Recordset
      
    Call  Recordset.Open( " [Sales By Category] " , ConnectionString, _
        CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, _
        CommandTypeEnum.adCmdTable)

      
    If   Not  Recordset.EOF  Then
        
    With  Sheet1.Range( " A1 " )
          
    For   Each  Field  In  Recordset.Fields
            .Offset(
    0 , Offset).Value  =  Field.Name
            Offset 
    =  Offset  +   1
          
    Next  Field
          .Resize(
    1 , Recordset.Fields.Count).Font.Bold  =   True
        
    End   With
        
    Call  Sheet1.Range( " A2 " ).CopyFromRecordset(Recordset)
        Sheet1.UsedRange.EntireColumn.AutoFit
      
    Else
        Debug.Print 
    " Error: No records returned. "
      
    End   If
      Recordset.Close
      
    Set  Recordset  =   Nothing
    End Sub
    复制代码
    注意其中的CopyFromRecordSet方法,它可以从RecordSet中将数据直接读取到Excel的Range中,这比自己编写代码通过循环去填充Cell值要方便很多。如下面的方法就是通过循环读取值,然后通过Debug语句将读取到的值打印在Immediate窗口中。
    复制代码
    Sub  openWorksheet()
       
    Dim  myConnection  As   New  ADODB.Connection
       
    Dim  myRecordset  As  ADODB.Recordset
       
       myConnection.Open 
    " Provider=Microsoft.Jet.OLEDB.4.0; "   &  _
          
    " Data Source=C:\myCustomers.xls; "   &  _
          
    " Extended Properties=Excel 8.0; "

          
    Set  myRecordset  =   New  ADODB.Recordset
          myRecordset.Open 
    " customers " , myConnection, , , adCmdTable

          
    Do   Until  myRecordset.EOF
             Debug.Print myRecordset(
    " txtNumber " ), myRecordset( " txtBookPurchased " )
             myRecordset.MoveNext
          
    Loop
    End Sub
    复制代码
  4. 4. 将Access中的数据读取到Excel的一个例子
    复制代码
    Sub  ExcelExample()
        
    Dim  r  As   Integer , f  As   Integer
        
    Dim  vrecs  As  Variant
        
    Dim  rs  As  ADODB.Recordset
        
    Dim  cn  As  ADODB.Connection
        
    Dim  fld  As  ADODB.Field
        
    Set  cn  =   New  ADODB.Connection
        cn.Provider 
    =   " Microsoft OLE DB Provider for ODBC Drivers "
        cn.ConnectionString 
    =   " DRIVER={Microsoft Excel Driver (*.xls)};DBQ=C:\mydb.mdb; "
        cn.Open
        Debug.Print cn.ConnectionString
        
    Set  rs  =   New  ADODB.Recordset
        rs.CursorLocation 
    =  adUseClient
        rs.Open 
    " SELECT * FROM Employees " , cn, adOpenDynamic, adLockOptimistic
        
    For   Each  fld  In  rs.Fields
            Debug.Print fld.Name,
        
    Next
        Debug.Print
        vrecs 
    =  rs.GetRows( 6 )
        
    For  r  =   0   To   UBound (vrecs,  1 )
            
    For  f  =   0   To   UBound (vrecs,  2 )
                Debug.Print vrecs(f, r),
            
    Next
            Debug.Print
        
    Next
        Debug.Print 
    " adAddNew:  "   &  rs.Supports(adAddNew)
        Debug.Print 
    " adBookmark:  "   &  rs.Supports(adBookmark)
        Debug.Print 
    " adDelete:  "   &  rs.Supports(adDelete)
        Debug.Print 
    " adFind:  "   &  rs.Supports(adFind)
        Debug.Print 
    " adUpdate:  "   &  rs.Supports(adUpdate)
        Debug.Print 
    " adMovePrevious:  "   &  rs.Supports(adMovePrevious)
        
        rs.Close
        cn.Close
        
    End Sub
    复制代码
    读者可以自行创建测试环境运行这段代码(可根据需要做适当修改),其中程序将各种值打印到Immediate窗口中了。


 返回目录

 Excel to Text File

  1. 1. 使用TextToColumns方法 
    复制代码
    Private   Sub  CommandButton1_Click()
        
    Dim  rg  As  Range
        
    Set  rg  =  ThisWorkbook.Worksheets( " Sheet3 " ).Range( " a20 " ).CurrentRegion
        CSVTextToColumns rg, rg.Offset(
    0 2 )
        
    ' CSVTextToColumns rg
         Set  rg  =   Nothing
    End Sub

    Sub  CSVTextToColumns(rg  As  Range, Optional rgDestination  As  Range)
        
    If  IsMissing(rgDestination)  Or  rgDestination  Is   Nothing   Then
            rg.TextToColumns , xlDelimited, , , , , 
    True
        
    Else
            rg.TextToColumns rgDestination, xlDelimited, , , , , 
    True
        
    End   If
    End Sub
    复制代码
    Range.TextToColumns方法用于将包含文本的一列单元格分解为若干列,有关该方法的详细介绍,读者可以参考Excel的帮助信息,在Excel的帮助信息中搜索TextToColumns即可。示例中的代码将Sheet3中A20单元格所在的当前区域(可以简单地理解为A1:A20的区域)的内容通过TextToColumns方法复制到第三列中,这个由Offset的值决定。如果要演示该示例,读者可以在Excel中创建一个名称为Sheet3的工作表,然后在A1至A20的单元格中输入值,复制代码到Excel VBA工程中,通过按钮触发Click事件。
  2. 2. 导出Range中的数据到文本文件
    复制代码
    Sub  ExportRange()
        FirstCol 
    =   1
        LastCol 
    =   3
        FirstRow 
    =   1
        LastRow 
    =   3
        
        Open ThisWorkbook.Path 
    &   " \textfile.txt "   For  Output  As  # 1
            
    For  r  =  FirstRow  To  LastRow
                
    For  c  =  FirstCol  To  LastCol
                    
    Dim  vData  As  Variant
                    vData 
    =  Cells(r, c).value
                    
    If   IsNumeric (vData)  Then  vData  =  Val(vData)
                    
    If  c  <>  LastCol  Then
                        Write #
    1 , vData;
                    
    Else
                        Write #
    1 , vData
                    
    End   If
                
    Next  c
            
    Next  r
        Close #
    1
    End Sub
    复制代码
  3. 3. 从文本文件导入数据到Excel
    复制代码
    Private   Sub  CommandButton1_Click()
        
    Set  ImpRng  =  ActiveCell
        Open 
    " c:\textfile.txt "   For  Input  As  # 1
        txt 
    =   ""
        Application.ScreenUpdating 
    =   False
        
    Do   While   Not  EOF( 1 )
            Line Input #
    1 , vData
            ImpRng.Value 
    =  vData
            
    Set  ImpRng  =  ImpRng.Offset( 1 0 )
        
    Loop
        Close #
    1
        Application.ScreenUpdating 
    =   True
    End Sub
    复制代码
    示例从c:\textfile.txt文件中按行读取数据并依次显示到当前Sheet的单元格中。


 返回目录

 Excel Toolbar

  1. 通过VBA隐藏Excel中的Toolbars
    复制代码
    Sub  HideAllToolbars()
        
    Dim  TB  As  CommandBar
        
    Dim  TBNum  As   Integer
        
    Dim  mySheet  As  Worksheet
        
    Set  mySheet  =  Sheets( " mySheet " )
        Application.ScreenUpdating 
    =   False

        mySheet.Cells.Clear
        
        TBNum 
    =   0
        
    For   Each  TB In CommandBars
            
    If  TB.Type  =  msoBarTypeNormal  Then
                
    If  TB.Visible  Then
                    TBNum 
    =  TBNum  +   1
                    TB.Visible 
    =   False
                    mySheet.Cells(TBNum, 
    1 =  TB.Name
                
    End   If
            
    End   If
        
    Next  TB
        Application.ScreenUpdating 
    =   True
    End Sub
    复制代码
  2. 2. 通过VBA恢复Excel中的Toolbars
    复制代码
    Sub  RestoreToolbars()
        
    Dim  mySheet  As  Worksheet
        
    Set  mySheet  =  Sheets( " mySheet " )
        Application.ScreenUpdating 
    =   False

        
    On   Error   Resume   Next
        
    For   Each  cell In mySheet.Range( " A:A " ).SpecialCells(xlCellTypeConstants)
            CommandBars(cell.Value).Visible 
    =   True
        
    Next  cell
        Application.ScreenUpdating 
    =   True
    End Sub
    复制代码


 返回目录



本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2009/07/17/1525571.html,如需转载请自行联系原作者


相关文章
|
8天前
|
数据处理
Excel VBA 自动填充空白并合并相同值的解决方案
在Excel中,常需将一列数据中的空白单元格用上方最近的非空值填充,并合并连续相同值。本VBA宏方案自动完成此操作,包含代码实现、使用方法及注意事项。通过简单步骤添加宏,一键处理数据,提升效率,确保准确性。适用于频繁处理类似数据的用户。
20 7
|
2月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
77 6
Excel中用宏VBA实现GBT 4761-2008 家庭关系代码转换
Excel中用宏VBA实现GBT 4761-2008 家庭关系代码转换
|
4月前
|
数据采集 数据库
在EXCEL中VBA编程检验身份证号码有效性
在EXCEL中VBA编程检验身份证号码有效性
|
5月前
|
开发工具 开发者
Excel 2016 VBA 提取单元格的中文字符
Excel 2016 VBA 提取单元格的中文字符
47 1
|
5月前
|
算法 数据挖掘 Java
日常工作中,Python+Pandas是否能代替Excel+VBA?
日常工作中,Python+Pandas是否能代替Excel+VBA?
55 0
Excel如何使用VBA操作引用其它工作簿中的单元格
Excel引用其它工作簿中的单元格的值及使用VBA操作
|
7月前
|
机器学习/深度学习 安全 关系型数据库
Excel VBA的分层对象集合及外部对象库
基于对象的Excel VBA的分层对象集合及外部对象库
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
119 10
|
3月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
185 4