zoukankan      html  css  js  c++  java
  • 常用VBA小技巧

    用对话框选取文件路径(单个文件)

    删除导入csv等文本文件后留下的 Data connections

    • 增加新的工作表并并命名
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "333"
    
    • 检查工作表是否存在,若不存在则新建
    '参数:
    '           SheetName: 工作表名字
    '功能:
    '           检查以SheetName为工作表名字的worksheet是否存在,若不存在,则新建.
    Private Sub CheckCreateNewWorksheet(SheetName As String)
        Dim ExistsFlag As Boolean       ' ExistsFlag: true-SheetName的工作表存在; false-不存在
        Dim St As Worksheet
        
        ExistsFlag = False
        For Each St In Worksheets
            If St.Name = SheetName Then
                ExistsFlag = True
                Exit For
            End If
        Next
    
        '如果以SheetName为工作表名字的worksheet不存在,则新建它
        If ExistsFlag = False Then
                Worksheets.Add(After:=Worksheets(3)).Name = SheetName
        End If
        
    End Sub
    • 路径中提取最后的文件名
    '从路径C:abcd.txt 中提取文件名 d.txt
    Public Function GetfileName(FilePath As String) As String
        Dim strTemp() As String
        strTemp = VBA.Split(FilePath, "")
        GetfileName = strTemp(UBound(strTemp))
    End Function
    •  用对话框选取文件路径  (单个文件)
    '得到指定文件的全路径
    
    ' 出口参数:SelectedDataPath     选择的文件的全路径
    
    ' TitleDisplayed    :展示的标题
    ' InitalPath:          起始的路径
    Private Sub GetFilePathFromDialog(SelectedDataPath As String, TitleDisplayed As String, InitalPath As String)
    
            With Application.FileDialog(msoFileDialogFilePicker)
                .Title = TitleDisplayed           ' "Select The Portfolio Holding Report:"
                .InitialFileName = InitalPath       '   "\192.168.0.200filesadministrativeOperationDaily PMS"      '打开对话框后的默认展示路径,增加易用性
                .AllowMultiSelect = False    '不允许多选
                .Filters.Clear                    '清除过滤器
                '.Filters.Add "Excel Files", "*.xls;*.xlw;*.xlsx;*.xlsm"      '设置两个过滤器
                .Filters.Add "All Files", "*.*"
                If .Show = -1 Then                                     'Show 方法显示对话框,并且返回 -1(如果您按 OK)和 0(如果您按 Cancel)
                    SelectedDataPath = .SelectedItems(1)
                Else    '说明用户按了"取消"按钮,则提示程序将退出.
                    Err.Raise Number:=512 + 1, Description:="You click cancel buttion. Program will terminate."
                End If
            End With
    
    End Sub
    •  用对话框选取文件路径(可以一次性选取多个文件: 主要利用 .AllowMultiSelect = True )
    ' 将待做CICC的 Pos rec的数据通过点选文件的方式拷贝到对应的表格
    Public Sub GetCiccPosRecData(WktPMS As Worksheet, WktBPFL As Worksheet, WktCCF As Worksheet, WktUBS As Worksheet)
        Application.ScreenUpdating = False
        
        Dim FileItems As FileDialogSelectedItems
        Dim VrtItem As Variant
        
        '通过多选的方式,选定所有文件
        With Application.FileDialog(msoFileDialogFilePicker)
            .AllowMultiSelect = True                                                                           ' 允许多选
            .Title = "please select the files regarding to CICC position rec."
            .InitialFileName = WktPMS.Parent.Path                                                       ' 打开对话框后的默认展示路径,增加易用性
            .Filters.Clear                                                                                          ' 清除过滤器
            .Filters.Add "Excel Files", "*.xls;*.xlw;*.xlsx;*.xlsm;*.csv;*.XLS"      '设置两个过滤器
            '.Filters.Add "All Files", "*.*"
            If .Show = -1 Then                                     'Show 方法显示对话框,并且返回 -1(如果您按 OK)和 0(如果您按 Cancel)
                'SelectedDataPath = .SelectedItems(1)
                Set FileItems = .SelectedItems
            Else    '说明用户按了"取消"按钮,则提示程序将退出.
                Err.Raise Number:=512 + 1, Description:="You click cancel buttion. Program will terminate."
            End If
        End With
        
        
        For Each VrtItem In FileItems
            If InStr(CStr(VrtItem), "BrillianceAQM") > 0 Then                   'UBS
                Call GetCiccDataForOnefund(WktUBS, CStr(VrtItem))
            ElseIf InStr(CStr(VrtItem), "BRILLIANCE_") > 0 Then             'BPFL
                Call GetCiccDataForOnefund(WktBPFL, CStr(VrtItem))
            ElseIf InStr(CStr(VrtItem), "ChinaCoreFund_") > 0 Then          'CCF
                Call GetCiccDataForOnefund(WktCCF, CStr(VrtItem))
            ElseIf InStr(CStr(VrtItem), "rep_position_by_custodian_CICC") > 0 Then          ' PMS custodian: CICC
                Call GetCiccPMSData(WktPMS, CStr(VrtItem))
            Else
                Err.Raise Number:=512 + 13, Description:="An new file name. Please check manually."
            End If
        Next
        
        
        Application.ScreenUpdating = True
        
        Debug.Print "--------------------"
        
    End Sub
    • Transpose 将横向的一维数组转置到 excel的列中
      WktOutput.Range("A2").Resize(DicAll.Count, 1) = Application.WorksheetFunction.Transpose(DicAll.Keys)       将 DicAll.Keys 这个数组 转置到 A 列
    • 拷贝工作表,从workbook1拷贝到 workbook2  

    •         WbOMS.Worksheets("Sheet").Cells.Copy
              WktOmsOri.Range("A1").PasteSpecial xlPasteAll
              
              WbSMY.Worksheets(StrDate).Cells.Copy
              WktSmyOri.Range("A1").PasteSpecial xlPasteAll
    • 避免剪贴后出现对话框
    '在粘贴后,加一句CutCopyMode  = False的代码 ,以清空剪贴板.
    
        Wkt.Cells.Copy WktDest.Range("A1")
        Application.CutCopyMode = False
        
        '关闭 Source File
        Wkb.Save
        Wkb.Close
    
    
    '如下代码需成对出现
    
        Application.DisplayAlerts = False
        Application.ScreenUpdating = False
    •  用数组给单元格批量赋值
        Dim AryTitle as Variant 
       AryTitle = Array("Ticker", "Last Price", "Current Price", "Diff", "Only In Last", "Only In Current")
        Wkt.Range("A1:F1").Value = AryTitle  '注意 Range的大小要和数组的长度相同.
        Wkt.Range("A1:F1").Font.Bold = True
     
    • 关闭某个window窗口
    Windows("TEST_FOR_0227_Merill_Lynch_DB_GS.xlsm").WindowState = xlMinimized

      其中Windows()的参数为窗口名称。

    • 删除导入csv等文本文件后留下的 Data connections
    ' Function:
    '           delete all the data connnections to avoid leaving many unuseful data connections behind
    Public Sub DeleteDataConnections()
    
        Application.DisplayAlerts = False
    
        Dim Wb As Workbook
        Dim AryConName() As String                                                              ' 存储data connections名字的数组
        Dim ConNum As Integer
        Dim Idx As Integer
        
        
        Set Wb = ThisWorkbook
        ConNum = Wb.Connections.Count
        Debug.Print "[In DeleteDataConnections ]  Wb.Connections.Count = " & Wb.Connections.Count
        
        
        If ConNum > 0 Then                                                                          ' 如果 存在data connections链接,则先存储其names, 再利用names将其循环删除.
            ReDim AryConName(1 To ConNum) As String
            
            For Idx = 1 To ConNum
                AryConName(Idx) = Wb.Connections.Item(Idx).Name
                Debug.Print "[In DeleteDataConnections ] ------------>idx = " & Idx & "    AryConName(Idx) = " & AryConName(Idx)
            Next
        
            For Idx = 1 To ConNum                                                                   ' 利用name来循环删除,而非利用 wb.Connections.Item(idx)
                Wb.Connections(AryConName(Idx)).Delete
            Next
        End If
        
    
    End Sub
  • 相关阅读:
    遇到项目上面有叉,但是找不到错误的原因
    遇到build的问题
    遇到scan configurtation CDT builder等的错误
    遇到attemp to invoke virtual method
    遇到looper之类关于消息循环的
    Linux与Windows信息交互快捷方法
    并行查询
    PostgreSQL 事务管理的MVCC
    Linux安装memcached
    Linux 安装 Redis
  • 原文地址:https://www.cnblogs.com/bmrs/p/7651649.html
Copyright © 2011-2022 走看看