2015-04-20 2 views
0

Я хочу написать программу, которая будет соответствовать именам переменных в двух отдельных книгах, чем копировать всю информацию из переменной до тех пор, пока страница не перейдет из обеих книг в новую работу. Каждая книга содержит несколько разрывов страниц, а не листы. Например:Excel слияние двух файлов на основе переменной

Workbook A (Variable = X)  
Persons   Name 
X     Bill 

Work Book B 
Persons   Nickname 
X     Billy 

New Workbook 
Page 1 
Persons   Name 
X     Bill 

Page 2 
Persons   Nickname 
X     Billy 

Я использовал код в этом site объединить две выбранные книги, но я не могу понять, как соответствовать по имени и не копировать на разрыв страницы. Может ли кто-нибудь есть предложения или может помочь мне? Спасибо!

Код: Это не правильно, но я пытался использовать ВПР, чтобы найти по крайней мере, одно из значений в рабочем листе

MergeSelectedWorkbooks() 
    Dim SummarySheet As Worksheet 
    Dim FolderPath As String 
    Dim SelectedFiles() As Variant 
    Dim NRow As Long 
    Dim FileName As String 
    Dim NFile As Long 
    Dim WorkBk As Workbook 
    Dim SourceRange As Range 
    Dim DestRange As Range 
    Dim VariableX As Variant 

    ' Create a new workbook and set a variable to the first sheet. 
    Set SummarySheet = Workbooks.Add(xlWBATWorksheet).Worksheets(1) 

    ' Modify this folder path to point to the files you want to use. 
    FolderPath = "C:\Users\Documents\Test" 

    ' Set the current directory to the the folder path. 
    ChDrive FolderPath 
    ChDir FolderPath 
    SelectedFiles = Application.GetOpenFilename(_ 
     filefilter:="Excel Files (*.xl*), *.xl*", MultiSelect:=True) 

    ' NRow keeps track of where to insert new rows in the destination workbook. 
    NRow = 1 

    ' Loop through the list of returned file names 
    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles) 
     ' Set FileName to be the current workbook file name to open. 
     FileName = SelectedFiles(NFile) 

     ' Open the current workbook. 
     Set WorkBk = Workbooks.Open(FileName) 

     ' Set the cell in column A to be the file name. 
     SummarySheet.Range("A" & NRow).Value = FileName 

     ' Set the source range to be A9 through C9. 
     ' Modify this range for your workbooks. It can span multiple rows. 
     Set SourceRange = VBAVlookup(2, WorkBk.Worksheets(1).Range("A1:A25"), 2, False) 

     ' Set the destination range to start at column B and be the same size as the source range. 
     Set DestRange = SummarySheet.Range("B" & NRow) 
     Set DestRange = DestRange.Resize(SourceRange.Rows.Count, _ 
      SourceRange.Columns.Count) 

     ' Copy over the values from the source to the destination. 
     DestRange.Value = SourceRange.Value 

     ' Increase NRow so that we know where to copy data next. 
     NRow = NRow + DestRange.Rows.Count 

     ' Close the source workbook without saving changes. 
     WorkBk.Close savechanges:=False 
    Next NFile 

    ' Call AutoFit on the destination sheet so that all data is readable. 
    SummarySheet.Columns.AutoFit 

    End Sub 

Function VBAVlookup(ByVal search As Variant, _ 
        cell_range As Range, _ 
        offset As Long, _ 
        Optional opt As Boolean = False) 

Dim result As Variant 
result = WorksheetFunction.VLookup(search, cell_range, offset, opt) 
'do some cool things to result 

VBAVlookup = result 

End Function 
+1

Пожалуйста, покажите нам код, который у вас есть. Нет никакой гарантии, что ссылка будет оставаться жизнеспособной в будущем, плюс, в вашей копии могут быть опечатки, и нам нужно посмотреть, что вы сделали, чтобы попытаться совпадение по имени. – FreeMan

ответ

1

Так как вам нужно объединить информацию для каждой переменной, я угадать переменную существует только один раз, по крайней мере, в одной из книг? Другими словами, вам не нужно объединять информацию в книге, прежде чем сочетать между книгами, не так ли?

Если это так, и одна книга перечисляет каждую переменную (и, возможно, дополнительную информацию для этой переменной) только один раз, вы можете использовать ее в качестве базовой книги при поиске между книгами.

Вот некоторые общие указатели, чтобы получить вещи, идущие:

Использование Excel-VBA код, открыть рабочие книги:

'define the input filepath 
Dim inputfilepath As String 
'define workbook name where variable info is located 
Dim workbookTitle As String 
workbookTitle = "Workbook1" 

'this creates a filepath, filename, and file extension. 
'if not ".xls", change to make appropriate 
inputfilepath = ActiveWorkbook.Path & "\" & workbookTitle & ".xls" 

'open comparing workbook. see .OpenText method documentation for 
'more details and options 
Workbooks.OpenText Filename:=inputfilepath, Origin:= _ 
    xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _ 
    xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _ 
    Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _ 
    Array(2, 1)), TrailingMinusNumbers:=True 

Как найти переменные? Вы упомянули, используя VLOOKUP, что хорошо. Но в этом случае, поскольку вы используете Excel-VBA, я хотел бы предложить использовать свойство Range.Value. Вы можете использовать цикл for для прохождения каждой переменной в базовой книге.

Как вы находите, существует ли эта переменная в другой книге? Тогда поиск этой переменной с помощью другого for цикла, вложенного в первый for цикла:

'find the variable. 
'here, it's assumed variable on first line 
Dim myVar As String 

'1st for loop 
'w needs to be assigned to the appropriate workbook, 
'and s needs to be assigned to the appropriate worksheet 
For varRow = 2 To Workbooks(w).Worksheets(s).UsedRange.Rows.Count 

    'assign the variable name to "myVar" 
    myVar = Workbooks(w).Worksheets(s).Range(Cells(varRow, 0)).Value 

    'nested for loop 
    'similar to parent for loop, w2 needs to be assigned to the 
    'appropriate workbook for finding additional variable info, 
    'and s2 needs to be assigned to the appropriate worksheet 
    For varRow2 = 2 To Workbooks(w2).Worksheets(s2).UsedRange.Rows.Count 

     'assign the variable under inspection in the comparison 
     'worksheet to "compareVar." 
     compareVar = Workbooks(w2).Worksheets(s2).Range(Cells(varRow2, 0)).Value 

     'perform StrComp to compare myVar and compareVar, and see 
     'if a match. 
     If StrComp(CStr(myVar), CStr(campareVar)) <> 0 Then 

      'code for merging values here, since this 
      'will execute if the variables match 

     End If 

    Next 

Next 

Я использую StrComp функцию, чтобы увидеть, если имя переменной существует в другой книге. Я также использую .UsedRange.Rows.Count, чтобы определить пределы цикла for, так как это один из способов определить рабочий диапазон на листе. Циклы for просто проходят по строкам, глядя на информацию в этой строке. Эта структура может быть адаптирована для того, как информация создается в книгах.

Теперь это проходит по строкам, но как вы начинаете разворачивать страницы? Благодаря this SO answer вы можете перебирать перерывы страниц. Я изменил первый цикл for сверху, поэтому он использует поиск по страницеbreak. Сравните это с приведенным выше кодом, чтобы узнать, как он изменился. Это также можно приспособить к деталям:

'1st for loop 
'w needs to be assigned to the appropriate workbook, 
'and s needs to be assigned to the appropriate worksheet 
For Each pgBreak In Workbooks(w).Worksheets(s).HPageBreaks 

    'assuming the variable is immediately after a pagebreak, 
    'assign the variable name to "myVar" 
    myVar = Workbooks(w).Worksheets(s) _ 
    .Range(Cells(pgBreak.Location.Row + 1, 0)).Value 

Надеюсь, что все это поможет вам и поможет вам.

+0

Не могу поблагодарить вас за вашу помощь! – user1026987

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