2015-04-20 61 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合併兩個選擇的工作簿,但我無法弄清楚如何通過名字來匹配和比複製到分頁符。任何人都可以有建議,或可以幫助指導我? 謝謝!

代碼: 這是不正確的,但我試圖用一個VLOOKUP找到值中的至少一個工作表中的

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循環,因此它利用了分頁搜索。將它與上面的代碼進行比較,看看它是如何改變的。這也可以調整以適應細節:

'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