2012-05-30 3 views
1

Это мой первый пост. В настоящее время я работаю над проектом на работе, который требует, чтобы я работал с несколькими разными рабочими листами, чтобы создать один рабочий лист электронной почты, чтобы как-то слить почту. Рабочий лист содержит информацию о различных покупках, и каждый покупатель идентифицируется с их собственным идентификационным номером. Ниже приведен пример того, что моя таблица выглядит сейчас (хотя у меня есть больше столбцов):Создание одной строки информации в excel с использованием уникального значения

ID Salutation  Address ID  Name  Donation  ID Name   Tickets 
9 Mr. John Doe 123  12 Ms. Jane Smith 100.00  12 Ms.Jane Smith 300.00 
12 Ms. Jane Smith 456  22 Mr. Mike Man  500.00  84 Ms. Jo Smith 300.00 

То, что я хотел бы сделать, это как-то сортировать мои данные так, что everythign с таким же уникальным идентификатором (ID) линии вверх по той же строке. Например, ID 12 Джейн Смит - вся информация для нее будет отображаться под ее именем, соответствующим ее идентификационному номеру, а ID 22 будет совпадать с 22 и т. Д.

Когда я объединил все мои таблицы вместе, я отсортировал их по идентификационному номеру, однако моя проблема в том, что не все, кто сделал пожертвование, купили билет, а некоторые просто купили билеты и ничего не сделали, поэтому сортировка не работает.

Надеюсь, это имеет смысл.

Заранее спасибо.

ответ

0

Вы можете сделать это в Excel VBA. Если вы ранее не использовали VBA в Excel, см. Ссылку ниже, чтобы узнать, как получить к ней доступ.

http://msdn.microsoft.com/en-us/library/ee814737.aspx

Убедитесь, что вы резервную таблицу, прежде чем пытаться любой из этого в случае что-то пойдет не так!

Я написал кое-что, что скопирует данные из ваших вторичных листов в ваш основной рабочий лист. Просто откройте редактор VBA и вставьте код.

Затем отредактируйте функцию ConsolidateWorksheets() так, чтобы она имела правильные имена для ваших листов. Если у вас есть дополнительные листы, объявите их и добавьте еще одну строку, которая вызывает подпрограмму ProcessWorksheet для добавленного листа.

Этот код скопирует данные с ваших билетов и листов пожертвований на ваш основной рабочий лист, когда найдет соответствующий идентификатор. Если идентификатор не совпадает, он ничего не копирует для этой строки.

Option Explicit 

Sub ConsolidateWorksheets() 

    'declare the worksheets you are using 
    Dim mainWks As Worksheet 
    Dim ticketsWks As Worksheet 
    Dim donationsWks As Worksheet 

    'set the worksheet names 
    Set mainWks = ThisWorkbook.Worksheets("Sheet1") 
    Set ticketsWks = ThisWorkbook.Worksheets("Sheet2") 
    Set donationsWks = ThisWorkbook.Worksheets("Sheet3") 

    Call ProcessWorksheet(mainWks, ticketsWks) 
    Call ProcessWorksheet(mainWks, donationsWks) 

End Sub 

' copies data from the otherWks to the mainWks 
Sub ProcessWorksheet(mainWks As Worksheet, otherWks As Worksheet) 

    Dim i As Integer 
    Dim rowId As Integer 

    Dim otherRowIndex As Integer 
    Dim otherLastColIndex As Integer 

    Dim lastRowIndex As Integer 

    Dim pasteColStart As Integer 
    Dim pasteColEnd As Integer 

    ' figure out the last row in the main sheet 
    lastRowIndex = mainWks.UsedRange.Rows.count 
    otherLastColIndex = otherWks.UsedRange.Columns.count 

    ' figure out where to copy and paste from 
    ' this assumes that the id row is always the first row in every sheet 
    pasteColStart = mainWks.UsedRange.Columns.count + 1 
    pasteColEnd = pasteColStart + (otherLastColIndex - 2) 

    ' copy column headers 
    otherWks.Activate 
    otherWks.Range(Cells(1, 2), Cells(1, otherLastColIndex)).Copy 
    mainWks.Activate 
    mainWks.Range(Cells(1, pasteColStart), Cells(1, pasteColEnd)).PasteSpecial 

    ' loop through all the rows of the main sheet 
    For i = 2 To lastRowIndex 
     ' get row id from first cell in current row 
     rowId = Cells(i, 1).Value 
     'lookup row id in other worksheets 
     otherRowIndex = FindIdRowInWks(otherWks, rowId) 

     If otherRowIndex <> 0 Then 
      otherWks.Activate 
      otherWks.Range(Cells(otherRowIndex, 2), Cells(otherRowIndex, otherLastColIndex)).Copy 
      mainWks.Activate 
      mainWks.Range(Cells(i, pasteColStart), Cells(i, pasteColEnd)).PasteSpecial 
     End If 
    Next i 

End Sub 

' loops through the given worksheet, looks for a given id in the first column 
' and returns the row index where the id was found. returns 0 if nothing found. 
Public Function FindIdRowInWks(wks As Worksheet, idToFind As Integer) As Integer 
    Dim lastRow As Integer 
    lastRow = wks.Range("A" & Rows.count).End(xlUp).Row 

    Dim rowNumber As Integer 
    rowNumber = 0 

    Dim i As Integer 
    For i = 2 To lastRow 
     If (Cells(i, 1).Value = idToFind) Then 
      rowNumber = i 
     End If 
    Next i 
    FindIdRowInWks = rowNumber 
End Function 

Надеюсь, что это поможет!

0

Вы можете сделать это в 3 шага без VBA:

1) Создать новый лист

2) На новом листе получить сводный список ID & Salutation

Для XL2007 см Удалить дубликаты для XL2003 см. расширенный фильтр.

3) Создайте установку Как и при использовании vlookups и iferror, чтобы получить нужные значения на основе соответствующих разделов с исходного листа. См. Изображение и формулу vlookup в строке формул

enter image description here

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