Как скопировать строки, если столбец содержит определенный текст/значение в Excel?

У меня есть два файла, скажем, F1 и F2.

Если данные в столбце 1 из F1 соответствуют столбцу 1 из F2, вставьте столбец 2 из F1 в F2.

Eg.

 file F1 has
    column1  column2
    X        value1
    Y        value2
    Z        value3



file F2 has
    column1    column2
    Y          key1
    Z          key2
    X          key3

Я пытаюсь вставить новый столбец в F2, чтобы он выглядел так:

column1   column2  column3
X         value1   key3
Y         value2   key1
Z         value3   key2

Это достижимо в одном файле. Как это сделать для нескольких файлов в excel/libreoffice?


person ramailo sathi    schedule 25.01.2016    source источник
comment
Почему бы не использовать функцию ВПР(), которая ссылается на другой файл?   -  person Scott Craner    schedule 25.01.2016
comment
В столбце1 сотни строк. Кстати, не могли бы вы написать это как ответ?   -  person ramailo sathi    schedule 25.01.2016
comment
Я согласен с @Scott Craner, что VLOOKUP - ваш лучший вариант. Масштабировать это до сотен строк не проблема.   -  person nbayly    schedule 25.01.2016


Ответы (2)


Как указано в комментариях, VLOOKUP может использовать другие файлы. Вот как это выглядит в LibreOffice:

введите здесь описание изображения

Формула на картинке:

=VLOOKUP(A1,'file:///C:/Users/JimStandard/Desktop/F1.ods'#$Sheet1.A$1:B$3,2)

Знаки $ облегчают заполнение формулы, щелкнув и перетащив квадрат в правом нижнем углу ячейки C1.

person Jim K    schedule 25.01.2016
comment
Спасибо за ответ. Есть ли обходной путь, если для key1 больше значения? Например. ожидаемый результат: Y key1 value2 value4 - person ramailo sathi; 04.02.2016
comment
Вы имеете в виду, есть ли в F1 строка, такая как Y value4, а также Y value2? - person Jim K; 04.02.2016
comment
ВПР получает только одно значение для каждого ключа. Одним из хороших способов обработки нескольких значений является использование LibreOffice Base. Он может выполнять запрос в электронной таблице Calc. Или вы можете написать макрос для обработки этого, как это предлагается в другом ответе. - person Jim K; 04.02.2016

Предполагая, что F1 и F2 являются листами Excel в рабочей книге, вы можете создать макрос с этим кодом в VBA и адаптировать его к вашим потребностям.

Public Sub CopyColumns()

    Dim init As Range
    Dim nameColumn As String
    Dim i As Integer
    Dim n As Integer
    Dim array1(3) As String
    Dim array2(2, 3) As String     'We declare two dimensional array

    Sheets("NameOfF1Sheet").Activate

    i = 0

    Range("A1").Select    'Suppose the start cell of the row that contains the text "column1" in F1 file

    nameColumn = "column1"   'Search column name to copy

    Do
        If ActiveCell.Value = nameColumn Then
            ActiveCell.offset(1, 0).Select
            Do
                array2(1, i) = ActiveCell.Value                 'Copy data in array2 from column1
                array2(2, i) = ActiveCell.offset(0, 1).Value    'Copy data in array2 from column2
                i = i + 1
            Loop Until IsEmpty(ActiveCell) = True
        Else
            ActiveCell.offset(0, 1).Select
        End If
    While IsEmpty(ActiveCell) = True    'Copy while there is data in column1

    Sheets("NameOfF2Sheet").Activate    'Sheet change

    i = 0
    n = 0

    Range("A1").Select     'Suppose the start cell of the row that contains the text "column1" in F2 file

    nameColumn = "column1"   'Search column name to paste

    Do
        If ActiveCell.Value = nameColumn Then

            init = ActiveCell.Address

            ActiveCell.offset(0, 1).Select      'Copy all column2
            Do
                array1(n) = ActiveCell.Value
                n = n + 1
                ActiveCell.offset(1, 0).Select
            While IsEmpty(ActiveCell) = True

            Range(init).Select

            ActiveCell.offset(0, 2).Value = "column3"   'Rename old "column2" as "column3"
            ActiveCell.offset(1, 2).Select

            n = 0

            Do                                  'Paste all rows of "column2" in "column3"
                ActiveCell.Value = array1(n)
                n = n + 1
                ActiveCell.offset(1, 0).Select
            Loop Until n < 3

            Range(init).Select

            ActiveCell.offset(1, 1).Select
            Do
                If ActiveCell.Value = array2(1, i) Then
                    ActiveCell.offset(0, 2).Value = array2(2, i)    'Paste data in column2 from array2
                End If
                i = i + 1
            Loop Until i < 3
        Else
            ActiveCell.offset(0, 1).Select
        End If
    While IsEmpty(ActiveCell) = True

End Sub

Я надеюсь, что вы служите, я новичок и мой первый ответ!

person David Lozano    schedule 26.01.2016
comment
Спасибо за первый ответ! Просто совет для будущей работы с Calc, этот код будет чище и будет выполняться быстрее с использованием функций API .getDataArray и .setDataArray вместо извлечения и установки значений по одному. - person Lyrl; 26.01.2016