Сортировка данных в Excel таблице

noble

Пользователь
Регистрация
09.10.2014
Сообщения
171
Благодарностей
10
Баллы
18
Может подскажешь как решить такую задачу - нужно положить ссылку в определенную ячейку Excel таблицы по критерию совпадение id
Водные - 6 столбца c содержанием
А столбец - id
В столбец - имя
С столбец - ссылка (этот столбец пустой)
D столбец - id
E столбец - ссылка
F столбец - комментарий


Цикл таков - берется значение из ячейки D1 последовательно сравнивается с значениями из столбца А, если есть совпадение то ссылка переноситься из ячейки 1E в ячейку С1 и так далее до конца
id уникальные - не повторяются в рамках столбца
Если совпадений нет то в ячейку F1 ложится сообщение - нет совпадение
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 375
Благодарностей
1 436
Баллы
113
Для решения данной задачи можно использовать следующий код на языке VBA в Excel:


Sub ПоискСовпадений()
Dim lastRow As Long
Dim i As Long
Dim searchValue As String
Dim foundRow As Range

lastRow = Cells(Rows.Count, "A").End(xlUp).Row ' Находим последнюю заполненную строку в столбце А

For i = 1 To lastRow ' Проходим по всем строкам
searchValue = Range("D" & i).Value ' Получаем значение из ячейки D
Set foundRow = Columns("A").Find(What:=searchValue, LookIn:=xlValues, LookAt:=xlWhole) ' Ищем совпадение в столбце А

If Not foundRow Is Nothing Then ' Если совпадение найдено
Range("C" & foundRow.Row).Value = Range("E" & i).Value ' Переносим значение из столбца E в столбец C
Else ' Если совпадение не найдено
Range("F1").Value = "Нет совпадения"
End If
Next i
End Sub


Чтобы выполнить этот код, следуйте инструкциям:

1. Откройте Excel и вашу таблицу.
2. Нажмите `Alt`+`F11`, чтобы открыть редактор VBA.
3. В редакторе VBA вставьте предоставленный код в окно кода.
4. Закройте редактор VBA.
5. Выделите ячейку D1 (или любую другую ячейку в столбце D, с которой вы хотите начать поиск).
6. Запустите макрос, нажав `Alt`+`F8`, выбрав "ПоискСовпадений" и нажав "Выполнить".

Этот код пройдет по всем строкам в столбце D и ищет совпадение в столбце А. Если совпадение найдено, то значение из столбца E переносится в столбец C на соответствующую строку. Если совпадение не найдено, то в ячейку F1 будет записано сообщение "Нет совпадения".

Обратите внимание, что для корректного выполнения кода столбцы должны быть расположены в соответствии с вашим описанием (столбец А - id, столбец С - ссылка, столбец D - id, столбец E - ссылка, столбец F - комментарий).
 
  • Спасибо
Реакции: noble

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
Может подскажешь как решить такую задачу - нужно положить ссылку в определенную ячейку Excel таблицы по критерию совпадение id
Водные - 6 столбца c содержанием
А столбец - id
В столбец - имя
С столбец - ссылка (этот столбец пустой)
D столбец - id
E столбец - ссылка
F столбец - комментарий


Цикл таков - берется значение из ячейки D1 последовательно сравнивается с значениями из столбца А, если есть совпадение то ссылка переноситься из ячейки 1E в ячейку С1 и так далее до конца
id уникальные - не повторяются в рамках столбца
Если совпадений нет то в ячейку F1 ложится сообщение - нет совпадение
C#:
var tb = project.Tables["tb"];

// Демо            A_0           B_1       C_2     D_3     E_4     F_5
tb.AddRow(new[]{"id_1", "name_1", " ", "id_2", "link_2", " "});
tb.AddRow(new[]{"id_2", "name_2", " ", "id_3", "link_3", " "});
tb.AddRow(new[]{"id_3", "name_3", " ", "id_4", "link_4", " "});
tb.AddRow(new[]{"id_4", "name_4", " ", "id_5", "link_5", " "});
tb.AddRow(new[]{"id_5", "name_5", " ", "id_1", "link_1", " "});
tb.AddRow(new[]{"id_6", "name_6", " ", "id_7", "link_7", " "});


List<string[]> table = new List<string[]>();
table = tb.GetItems("0-end", true).Select(x=>x.ToArray()).ToList(); // беру данные для обработки
    
for(int i=0; i<table.Count; i++){
    bool check = false;
    for(int j=0; j<table.Count; j++){     
         if(table[i][3].ToString() == table[j][0].ToString()) {
            table[j][2] = table[i][4].ToString();
            check = true;
            break;
        }
    }
    if(!check) table[i][5] = "нет совпадение";
}
table.ForEach(x=>tb.AddRow(x)); // возвращаю назад данные
108431
 
  • Спасибо
Реакции: noble и Nord

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)