2017-02-06 7 views
2

У меня есть код ниже.Excel - Открытые книги с названиями

Просто попросите пользователя выбрать несколько книг excel, а затем скопировать и вставить данные из этих книг в текущую рабочую книгу.

1. Я хотел бы добавить функциональность, вместо этого, вместо того, чтобы выбирать книги Excel. Прежние книги будут выбраны так, чтобы их имена были указаны на текущем листе excel.

Например - Выберите книги Excel в указанной папке, имена которых указаны в A1: A5.

  1. Я хотел бы выполнить автоматическую обработку данных до того, как он будет скопирован в текущую рабочую книгу.

Например, если имя рабочей книги = 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 

ответ

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 

Старайтесь не использовать ActiveSheet и ActiveWorkbook без абсолютной необходимости. Используйте ThisWorkbook, выделенный объект Workbook, а вместо него - лист Workbook.Sheets("Name") или Workbook.Sheets(index).

Альтернативно вместо отключения проверки ошибок вы можете сделать это и сбой, если файл отсутствует.

+0

Thanks Eugene, как бы я использовал несколько диапазонов? – RalphDylan

+0

@RalphDylan Существует много способов, вы можете перебирать каждую ячейку в целевом диапазоне и назначать новое значение 'rng.Value = rng.Value * Factor', или вы можете поместить коэффициент в некоторую временную ячейку на листе (' Set rngFactor = SomeSheet.Cells (1,1) .Value'), скопируйте его и вставьте в целевой диапазон как значение для умножения: 'rngTarget.PasteSpecial Paste: = xlPasteValues, Operation: = xlMultiply, SkipBlanks: = False, Transpose : = false' – Eugene

Смежные вопросы