Excel - 打开名为

时间:2017-02-06 14:53:35

标签: excel vba excel-vba

我有以下代码。

很简单,它要求用户选择多个excel工作簿,然后将这些工作簿中的数据复制并粘贴到当前工作簿中。

1。 我想添加功能,而不是用户选择excel工作簿。将选择excel工作簿,因为它们的名称列在当前的Excel工作表中。

例如 - 在指定文件夹中选择excel工作簿,其名称在A1:A5。

中列出
  1. 我希望在将数据复制到当前工作簿之前对数据执行自动处理。
  2. 例如,如果工作簿名称= 100.xlsx,则将选择乘以15。

    查看我当前的代码

    Sub SUM_BalanceSheet()
    
    Application.ScreenUpdating = False
    
    'FileNames is array of file names, file is for loop, wb is for the open file within loop
    'PasteSheet is the sheet where we'll paste all this information
    'lastCol will find the last column of PasteSheet, where we want to paste our values
    Dim FileNames
    Dim file
    Dim wb As Workbook
    Dim PasteSheet As Worksheet
    Dim lastCol As Long
    
    Set PasteSheet = ActiveSheet
    lastCol = PasteSheet.Cells(1, Columns.Count).End(xlToLeft).Column
    
    'Build the array of FileNames to pull data from
    FileNames = Application.GetOpenFilename(filefilter:="Excel Files (*.xlsx), *.xlsx", MultiSelect:=True)
    'If user clicks cancel, exit sub rather than throw an error
    If Not IsArray(FileNames) Then Exit Sub
    
    'Loop through selected files, put file name in row 1, paste P18:P22 as values
    'below each file's filename. Paste in successive columns
    For Each file In FileNames
        Set wb = Workbooks.Open(file, UpdateLinks:=0)
        PasteSheet.Cells(1, lastCol + 1) = wb.Name
        wb.Sheets("Page 1").Range("L14:L98").Copy
        PasteSheet.Cells(2, lastCol + 1).PasteSpecial Paste:=xlPasteValues
        wb.Close SaveChanges:=False
        lastCol = lastCol + 1
    Next
    
    'If it was a blank sheet then data will start pasting in column B, and we don't
    'want a blank column A, so delete it if it's blank
    If Cells(1, 1) = "" Then Cells(1, 1).EntireColumn.Delete shift:=xlLeft
    
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    
    End Sub
    

1 个答案:

答案 0 :(得分:0)

这是一个需要微调的框架,但你可以理解:

Dim i&, wbName$
Dim rng As Excel.Range
Dim wb, wb1 As Excel.Workbook

Set wb = Application.ThisWorkbook
Set rng = wb.Sheets("Sheet1").Range("A1")
For i = 0 To 14
    wbName = CStr(rng.Offset(i, 0).Value)
    On Error Resume Next 'Disable error handling. We will check whether wb is nothing later
    wb1 = Application.Workbooks.Open(wbName, False)
    On Error GoTo ErrorHandler
    If Not IsNothing(wb1) Then
        'Copy-paste here
        If wb1.Name = "100" Then 'any condition(s)
            'Multiply, divide, or whatever
        End If
    End If
Next


ErrorHandler:
    MsgBox "Error " & Err.Description
    'Add additional error handling

尽量不要在没有绝对需要的情况下使用ActiveSheetActiveWorkbook。请改为使用ThisWorkbook,专用Workbook对象和命名表Workbook.Sheets("Name")Workbook.Sheets(index)

或者,如果缺少文件,则可以执行此操作而不是禁用错误检查。