Это достаточно близко. Я действительно ценю только видеть это. Цикл «для каждого» позволяет мне знать, что искать в будущем. Я буду гуглить каждый кусочек, чтобы понять это.

ком с программированием, но не VBA или объектной моделью Excel. Я нахожу это сильно расстраивающим иметь дело с.

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

Я хочу создать лист для каждой фамилии, желательно назовите его этим именем, а затем скопировать с исходного листа на каждый конкретный лист все строки с именем

Что у меня так далеко:

   Cells.find(What:="Last_Name", After:=ActiveCell, LookIn:=xlFormulas, _
       LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
       MatchCase:=False, SearchFormat:=False).Activate

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

    ActiveCell.Sort key1:=ActiveCell, Order1:=xlAscending, Header:=xlYes

но после этого я изо всех сил пытаюсь найти способ получить уникальные элементы в список или массив или что-то.

Я знаю, как создать лист с

Set WS = Sheets.Add
WS.name = "string name goes here"

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

Буду очень признателен за любые советы по изучению VBA или любого другого способа (.Net как-нибудь?) Взаимодействия с Excel.

 Lance Roberts20 янв. 2011 г., 20:40
Я надеялся дать вам полное решение, но это более длинный кусок кода, чем я думал. Вы можете получить функцию FindAll Чипа ПирсонаВот а затем измените его, используя параметр Row, чтобы захватить всю строку каждый раз, когда вы находите ячейку. Вы также можете упростить это для вашего конкретного случая.

Ответы на вопрос(1)

Решение Вопроса

Это должно вас близко

Sub MakeLastNameSheets()

    Dim rLNColumn As Range
    Dim rCell As Range
    Dim sh As Worksheet
    Dim shDest As Worksheet
    Dim rNext As Range

    Const sLNHEADER As String = "Last_Name"

    Set sh = ThisWorkbook.Sheets("Sheet1")
    Set rLNColumn = sh.UsedRange.Find(sLNHEADER, , xlValues, xlWhole)

    'Make sure you found something
    If Not rLNColumn Is Nothing Then
        'Go through each cell in the column
        For Each rCell In Intersect(rLNColumn.EntireColumn, sh.UsedRange).Cells
            'skip the header and empty cells
            If Not IsEmpty(rCell.Value) And rCell.Address <> rLNColumn.Address Then
                'see if a sheet already exists
                On Error Resume Next
                    Set shDest = sh.Parent.Sheets(rCell.Value)
                On Error GoTo 0

                'if it doesn't exist, make it
                If shDest Is Nothing Then
                    Set shDest = sh.Parent.Worksheets.Add
                    shDest.Name = rCell.Value
                End If

                'Find the next available row
                Set rNext = shDest.Cells(shDest.Rows.Count, 1).End(xlUp).Offset(1, 0)

                'Copy and paste
                Intersect(rCell.EntireRow, sh.UsedRange).Copy rNext

                'reset the destination sheet
                Set shDest = Nothing
            End If
        Next rCell
    End If

End Sub

Вы закончите с одним листом для каждой фамилии в вашем списке. Если у вас есть 1000 уникальных фамилий, вы, вероятно, вылетите Excel - листы ограничены доступной памятью. Он не копирует строку заголовка, но это достаточно просто. И он не проверяет наличие недопустимых символов имени листа, поэтому, если у вас есть какие-нибудь прикольные фамилии, вы можете очистить не-альфа.

 Lance Roberts20 янв. 2011 г., 23:16
проголосуйте за синонимы тегов VBA, если вы этого еще не сделали. Благодарю.
 mhb25 янв. 2011 г., 16:54
Это достаточно близко. Я действительно ценю только видеть это. Цикл «для каждого» позволяет мне знать, что искать в будущем. Я буду гуглить каждый кусочек, чтобы понять это.

Ваш ответ на вопрос