1

これは私の最初の投稿です。私は現在、差し込み印刷を行うために、いわば 1 つのメール マスター ワークシートを作成するために、いくつかの異なるワークシートを使用する必要があるプロジェクトに取り組んでいます。ワークシートにはさまざまな購入に関する情報が含まれており、各購入者は独自の ID 番号で識別されます。以下は、私のスプレッドシートが現在どのように見えるかの例です (ただし、より多くの列があります):

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 

私がやりたいことは、同じ一意の識別子 (ID) を持つすべてのものが同じ行に並ぶように、何らかの方法でデータを並べ替えることです。たとえば、ID 12 ジェーン スミス - 彼女のすべての情報は、彼女の ID 番号と一致する彼女の名前の下に表示され、ID 22 は 22 と一致します。

すべてのスプレッドシートをまとめて、ID 番号で並べ替えましたが、問題は、寄付をした人全員がチケットを購入したわけではないか、一部の人がチケットを購入しただけで何も購入しなかったため、並べ替えが機能しないことです。

うまくいけば、これは理にかなっています。

前もって感謝します。

4

2 に答える 2

0

これは、Excel VBA で行うことができます。以前に Excel で VBA を使用したことがない場合は、以下のリンクを参照してアクセス方法を確認してください。

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

何か問題が発生した場合に備えて、これを試す前にスプレッドシートをバックアップしてください。

I wrote something up that will copy data from your secondary worksheets into your main worksheet. Just open the VBA editor, and paste in the code.

Next, edit the ConsolidateWorksheets() function so that it has the right names for your sheets. If you have additional sheets, declare them and add another line that calls the ProcessWorksheet subroutine for the added sheet.

This code will copy data from your tickets and donations worksheet into your main worksheet when it finds a matching id. If there isn't a matching id, it doesn't copy anything for that row.

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

Hope that helps!

于 2012-05-30T18:24:14.593 に答える
0

これは、VBA を使用せずに 3 つのステップで実行できます。

1) 新しいワークシートを作成する

2) 新しいシートで、ID と挨拶の統合リストを取得します

XL2007 については、重複の削除を参照してください。XL2003 については、高度なフィルターを参照してください。

3) セットアップを作成する vlookups と iferror を使用して、元のシートの関連セクションに基づいて必要な値を取得します。数式バーの画像と vlookup 数式を参照してください

ここに画像の説明を入力

于 2012-05-30T22:08:55.840 に答える