Скопируйте строки данных на другой лист в Excel и добавьте столбец VBA

#excel #vba #copy

#excel #vba #Копировать

Вопрос:

Я не могу разобраться в этом.

У меня такая структура данных: введите описание изображения здесь

Я хотел бы получить что-то вроде этого (на другом листе). введите описание изображения здесь

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

На самом деле, я пытаюсь объединить / объединить 2 строки, как показано на рисунке, так, чтобы каждый идентификационный номер был представлен только один раз на листе 2.

 Sub Test()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("Sheet1")
    Dim i As Integer
    Dim last_row As Integer
    last_row = Application.WorksheetFunction.CountA(sh.Range("A:A"))
    For i = 2 To last_row
        If sh.Range("D" amp; i).Value = 2 Then
            sh.Range("A1:G3").Copy _
            Worksheets("sheet2").Range("A1")
        End If
    Next i
End Sub
 

На данный момент я могу скопировать только диапазон.
И тогда я не понимаю, в каком порядке выполнять подзадачи.

Комментарии:

1. Для любого идентификатора существует не более двух копий?

2. Да, будет либо только 1 уникальный идентификатор, либо не более 2 идентичных идентификаторов.

3. Как насчет электронной почты для второго пользователя?

4. На самом деле это тоже должно быть там, спасибо, что заметили. Однако это всего лишь вопрос повторения той же процедуры, что и вставка name2.

Ответ №1:

Это использует словарь, чтобы убедиться, что вы не копируете кратные одному и тому же идентификатору.

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

     Dim sourcesh As Worksheet
    Dim destsh As Worksheet
    
    Set sourcesh = ThisWorkbook.Sheets("Sheet1")
    Set destsh = ThisWorkbook.Sheets("Sheet2")
    
    Dim i As Long
    Dim j As Long
    Dim lr As Long
    
    With sourcesh
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row
        Dim dict As Object
        Set dict = CreateObject("Scripting.Dictionary")
        j = 1
        For i = 2 To lr
            If .Cells(i, 4).Value = 2 Then
                If Not dict.exists(.Cells(i, 1).Value) Then
                    destsh.Cells(j, 1) = .Cells(i, 1)
                    destsh.Cells(j, 2) = .Cells(i, 2)
                    destsh.Cells(j, 4) = .Cells(i, 3)
                    destsh.Cells(j, 5) = .Cells(i, 4)
                    destsh.Cells(j, 6) = .Cells(i, 5)
                    destsh.Cells(j, 7) = .Cells(i, 6)
                    destsh.Cells(j, 8) = .Cells(i, 7)
                    
                    dict.Add .Cells(i, 1).Value, j
                    j = j   1
                Else
                    destsh.Cells(dict(.Cells(i, 1).Value), 3) = .Cells(i, 2)
                End If
            End If
        Next i
    End With
 

Комментарии:

1. Хорошо, это действительно первый шаг. Затем я должен выяснить, как вставить другое имя в отдельный столбец.

2. Я действительно возьму отправную точку в этом!

3. Упс, пропустил это в вопросе, редактирование должно решить эту проблему.

4. Спасибо, Warcupine, ты избавил меня от множества головных болей и разочарований.