分享

常用VBA小技巧

 Excel实用知识 2021-11-21

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

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

  • 增加新的工作表并并命名
1
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:\ab\c\d.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.200\files\administrative\Operation\Daily 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
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多