Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск информации и создание таблицы в матрице - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Поиск информации и создание таблицы в матрице
lianei2456 Дата: Среда, 17.05.2023, 09:06 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2010
Добрый день! Появилась проблема-есть очень большой обьем данных в виде матрицы с именами,оценками и названием предмета .Нужно чтобы эксель определял пустые ячейки(без оценки) и на основе их формировал список с именами и названием предмета по которому оценка не стоит.
К сообщению приложен файл: dlja_primera.xls (26.5 Kb)
 
Ответить
СообщениеДобрый день! Появилась проблема-есть очень большой обьем данных в виде матрицы с именами,оценками и названием предмета .Нужно чтобы эксель определял пустые ячейки(без оценки) и на основе их формировал список с именами и названием предмета по которому оценка не стоит.

Автор - lianei2456
Дата добавления - 17.05.2023 в 09:06
Nic70y Дата: Среда, 17.05.2023, 11:11 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 9005
Репутация: 2369 ±
Замечаний: 0% ±

Excel 2010
не правильно написал((
переделаю позже

исправил
[vba]
Код
Sub u_963()
    Application.ScreenUpdating = False
    a = Cells(Rows.Count, "a").End(xlUp).Row
    d = Cells(1, Columns.Count).End(xlToLeft).Column
    If a > 1 Then
        b = Application.Match("ÔÈÎ ñòóäåíòà", Range("a2:a" & a), 0)
        If IsNumeric(b) Then
            If a > b + 1 Then Range("a" & b + 2 & ":b" & a).Clear
            For c = 2 To b
                e = Range("a" & c).Value
                If e <> "" Then
                    f = Application.Count(Range(Cells(c, 3), Cells(c, d)))
                    If f < d - 2 Then
                        For g = 1 To d - 2 - f
                            s = Cells(c, "c").Address
                            t = Cells(c, d).Address
                            u = s & ":" & t
                            i = Evaluate("=SMALL(IF(" & u & "="""",COLUMN(" & u & "))," & g & ")")
                            j = Cells(1, i).Value
                            k = Cells(Rows.Count, "a").End(xlUp).Row + 1
                            Range("a" & k) = e
                            Range("b" & k) = j
                        Next
                    End If
                End If
            Next
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeTop).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeBottom).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeRight).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeLeft).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlInsideVertical).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlInsideHorizontal).LineStyle = xlContinuous
        End If
    End If
    Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: 19.xlsm (21.8 Kb)


ЮMoney 41001841029809

Сообщение отредактировал Nic70y - Среда, 17.05.2023, 11:56
 
Ответить
Сообщениене правильно написал((
переделаю позже

исправил
[vba]
Код
Sub u_963()
    Application.ScreenUpdating = False
    a = Cells(Rows.Count, "a").End(xlUp).Row
    d = Cells(1, Columns.Count).End(xlToLeft).Column
    If a > 1 Then
        b = Application.Match("ÔÈÎ ñòóäåíòà", Range("a2:a" & a), 0)
        If IsNumeric(b) Then
            If a > b + 1 Then Range("a" & b + 2 & ":b" & a).Clear
            For c = 2 To b
                e = Range("a" & c).Value
                If e <> "" Then
                    f = Application.Count(Range(Cells(c, 3), Cells(c, d)))
                    If f < d - 2 Then
                        For g = 1 To d - 2 - f
                            s = Cells(c, "c").Address
                            t = Cells(c, d).Address
                            u = s & ":" & t
                            i = Evaluate("=SMALL(IF(" & u & "="""",COLUMN(" & u & "))," & g & ")")
                            j = Cells(1, i).Value
                            k = Cells(Rows.Count, "a").End(xlUp).Row + 1
                            Range("a" & k) = e
                            Range("b" & k) = j
                        Next
                    End If
                End If
            Next
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeTop).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeBottom).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeRight).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlEdgeLeft).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlInsideVertical).LineStyle = xlContinuous
            Range("a" & b + 1 & ":b" & k).Borders(xlInsideHorizontal).LineStyle = xlContinuous
        End If
    End If
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Nic70y
Дата добавления - 17.05.2023 в 11:11
Gustav Дата: Среда, 17.05.2023, 12:43 | Сообщение № 3
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Если есть доступ к Excel последних версий, то можно получить требуемый список по следующей формуле, помещенной, например, в ячейку A11:
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  СЧЁТЗ(студенты);
колвоПредм; СЧЁТЗ(предметы);
массив;     MAKEARRAY(колвоСтуд*колвоПредм;3;LAMBDA(r;c;
            LET(
            стИнд;  ОТБР((r-1)/колвоПредм)+1;
            прИнд;  ОСТАТ(r-1;колвоПредм)+1;
            ВЫБОР(c; ИНДЕКС(студенты; стИнд); ИНДЕКС(предметы; прИнд); ИНДЕКС(оценки; стИнд; прИнд);
            ))));
ФИЛЬТР(массив; НЕ(ЕЧИСЛО(ИНДЕКС(массив;0;3))))
)
[/vba]

Если доступа к Excel последних версий нет, то можно попробовать (прямо сейчас!) портироваться в Google Таблицу. Аналогичная формула там будет выглядеть так (при включенном отображении названий функций на английском):
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  COUNTA(студенты);
колвоПредм; COUNTA(предметы);
массив;     MAKEARRAY(колвоСтуд*колвоПредм;3;LAMBDA(r;c;
            LET(
            стИнд;  TRUNC((r-1)/колвоПредм)+1;
            прИнд;  MOD(r-1;колвоПредм)+1;
            CHOOSE(c; INDEX(студенты;стИнд); INDEX(предметы;прИнд); INDEX(оценки;стИнд;прИнд);
            ))));
FILTER(массив; NOT(ISNUMBER(INDEX(массив;0;3))))
)
[/vba]

[p.s.]На примере случая Google сделал попроще (как мне показалось):[/p.s.]
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  COUNTA(студенты);
колвоПредм; COUNTA(предметы);
массивИнд;  MAP(SEQUENCE(колвоСтуд*колвоПредм); LAMBDA(i; {i \ TRUNC((i-1)/колвоПредм)+1 \ MOD(i-1;колвоПредм)+1}));
стИнд;      INDEX(массивИнд;0;2);
прИнд;      INDEX(массивИнд;0;3);
массив;     MAP(стИнд; прИнд; LAMBDA(ст; пр; {INDEX(студенты;ст) \ INDEX(предметы;пр) \ INDEX(оценки;ст;пр)}));
FILTER(массив; NOT(ISNUMBER(INDEX(массив;0;3))))
)
[/vba]
Т.е. сначала рассчитал массив индексов (первый MAP), а потом приставил к индексам фактические значения из диапазонов (второй MAP).


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 17.05.2023, 17:23
 
Ответить
СообщениеЕсли есть доступ к Excel последних версий, то можно получить требуемый список по следующей формуле, помещенной, например, в ячейку A11:
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  СЧЁТЗ(студенты);
колвоПредм; СЧЁТЗ(предметы);
массив;     MAKEARRAY(колвоСтуд*колвоПредм;3;LAMBDA(r;c;
            LET(
            стИнд;  ОТБР((r-1)/колвоПредм)+1;
            прИнд;  ОСТАТ(r-1;колвоПредм)+1;
            ВЫБОР(c; ИНДЕКС(студенты; стИнд); ИНДЕКС(предметы; прИнд); ИНДЕКС(оценки; стИнд; прИнд);
            ))));
ФИЛЬТР(массив; НЕ(ЕЧИСЛО(ИНДЕКС(массив;0;3))))
)
[/vba]

Если доступа к Excel последних версий нет, то можно попробовать (прямо сейчас!) портироваться в Google Таблицу. Аналогичная формула там будет выглядеть так (при включенном отображении названий функций на английском):
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  COUNTA(студенты);
колвоПредм; COUNTA(предметы);
массив;     MAKEARRAY(колвоСтуд*колвоПредм;3;LAMBDA(r;c;
            LET(
            стИнд;  TRUNC((r-1)/колвоПредм)+1;
            прИнд;  MOD(r-1;колвоПредм)+1;
            CHOOSE(c; INDEX(студенты;стИнд); INDEX(предметы;прИнд); INDEX(оценки;стИнд;прИнд);
            ))));
FILTER(массив; NOT(ISNUMBER(INDEX(массив;0;3))))
)
[/vba]

[p.s.]На примере случая Google сделал попроще (как мне показалось):[/p.s.]
[vba]
Код
=LET(
студенты;   A2:A7;
предметы;   C1:H1;
оценки;     C2:H7;
колвоСтуд;  COUNTA(студенты);
колвоПредм; COUNTA(предметы);
массивИнд;  MAP(SEQUENCE(колвоСтуд*колвоПредм); LAMBDA(i; {i \ TRUNC((i-1)/колвоПредм)+1 \ MOD(i-1;колвоПредм)+1}));
стИнд;      INDEX(массивИнд;0;2);
прИнд;      INDEX(массивИнд;0;3);
массив;     MAP(стИнд; прИнд; LAMBDA(ст; пр; {INDEX(студенты;ст) \ INDEX(предметы;пр) \ INDEX(оценки;ст;пр)}));
FILTER(массив; NOT(ISNUMBER(INDEX(массив;0;3))))
)
[/vba]
Т.е. сначала рассчитал массив индексов (первый MAP), а потом приставил к индексам фактические значения из диапазонов (второй MAP).

Автор - Gustav
Дата добавления - 17.05.2023 в 12:43
Nic70y Дата: Среда, 17.05.2023, 13:27 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 9005
Репутация: 2369 ±
Замечаний: 0% ±

Excel 2010
если хочется формулами для 2010
массивные:
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;ЦЕЛОЕ(НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7)+СТОЛБЕЦ(C$2:H$7)/1000);СТРОКА(A1))));"")
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7));СТРОКА(A1)));"")
Код
=ЕСЛИ(A11<>"";ИНДЕКС(A$1:H$1;ОКРУГЛ(ОСТАТ(НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7)+СТОЛБЕЦ(C$2:H$7)/1000);СТРОКА(A1));1)*1000;));"")
К сообщению приложен файл: 27.xlsx (12.6 Kb)


ЮMoney 41001841029809

Сообщение отредактировал Nic70y - Среда, 17.05.2023, 14:51
 
Ответить
Сообщениеесли хочется формулами для 2010
массивные:
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;ЦЕЛОЕ(НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7)+СТОЛБЕЦ(C$2:H$7)/1000);СТРОКА(A1))));"")
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7));СТРОКА(A1)));"")
Код
=ЕСЛИ(A11<>"";ИНДЕКС(A$1:H$1;ОКРУГЛ(ОСТАТ(НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(C$2:H$7)+СТОЛБЕЦ(C$2:H$7)/1000);СТРОКА(A1));1)*1000;));"")

Автор - Nic70y
Дата добавления - 17.05.2023 в 13:27
msi2102 Дата: Среда, 17.05.2023, 14:15 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 415
Репутация: 129 ±
Замечаний: 0% ±

Excel 2007
Ещё вариант макросом
[vba]
Код
Sub Макрос3()
    Dim arr1, y, x, n As Integer, m As Integer, k As Integer
    lr = Cells(1, 1).CurrentRegion.Rows.Count
    lr1 = Cells(Rows.Count, 1).End(xlUp).Row
    arr1 = Range("A1:H" & lr)
    Set dic = CreateObject("Scripting.Dictionary")
    k = 0
    For n = 2 To UBound(arr1)
        For m = 3 To UBound(arr1, 2)
            If arr1(n, m) = "" Then
                If Not dic.exists(arr1(n, 1)) Then Set dic(arr1(n, 1)) = CreateObject("Scripting.Dictionary")
                dic(arr1(n, 1)).Add arr1(1, m), arr1(1, m): k = k + 1
            End If
        Next
    Next
    ReDim arr1(1 To k, 1 To 2)
    n = 1
    Rows(lr + 3 & ":" & lr1 + 1).Delete Shift:=xlUp
    For Each y In dic
        For Each x In dic(y)
            arr1(n, 1) = y: arr1(n, 2) = x: n = n + 1
        Next
    Next
    Range("A" & lr + 3).Resize(UBound(arr1), 2) = arr1
End Sub
[/vba]
Строка между таблицами должна быть пустой
К сообщению приложен файл: dlja_primera.xlsm (22.3 Kb)
 
Ответить
СообщениеЕщё вариант макросом
[vba]
Код
Sub Макрос3()
    Dim arr1, y, x, n As Integer, m As Integer, k As Integer
    lr = Cells(1, 1).CurrentRegion.Rows.Count
    lr1 = Cells(Rows.Count, 1).End(xlUp).Row
    arr1 = Range("A1:H" & lr)
    Set dic = CreateObject("Scripting.Dictionary")
    k = 0
    For n = 2 To UBound(arr1)
        For m = 3 To UBound(arr1, 2)
            If arr1(n, m) = "" Then
                If Not dic.exists(arr1(n, 1)) Then Set dic(arr1(n, 1)) = CreateObject("Scripting.Dictionary")
                dic(arr1(n, 1)).Add arr1(1, m), arr1(1, m): k = k + 1
            End If
        Next
    Next
    ReDim arr1(1 To k, 1 To 2)
    n = 1
    Rows(lr + 3 & ":" & lr1 + 1).Delete Shift:=xlUp
    For Each y In dic
        For Each x In dic(y)
            arr1(n, 1) = y: arr1(n, 2) = x: n = n + 1
        Next
    Next
    Range("A" & lr + 3).Resize(UBound(arr1), 2) = arr1
End Sub
[/vba]
Строка между таблицами должна быть пустой

Автор - msi2102
Дата добавления - 17.05.2023 в 14:15
alexa1965 Дата: Среда, 17.05.2023, 14:43 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 383
Репутация: 62 ±
Замечаний: 0% ±

2003> 2019 >2016
А у меня тоже массивные для фио
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(A$2:A$7);1000);СТРОКА(A1)));"")
для долг
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:H$1;НАИМЕНЬШИЙ(ЕСЛИ((C$2:H$7="")*(A$2:A$7=A11);СТОЛБЕЦ(C$1:H$1);1000);ЕСЛИ(A11=A10;СТРОКА(A$1)+СЧЁТЕСЛИ(A$11:A11;A11)-1;СТРОКА(A$1))));"")
К сообщению приложен файл: 4467953.xls (30.5 Kb)


Главное не быть балабастиком
 
Ответить
СообщениеА у меня тоже массивные для фио
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:A$7;НАИМЕНЬШИЙ(ЕСЛИ(C$2:H$7="";СТРОКА(A$2:A$7);1000);СТРОКА(A1)));"")
для долг
Код
=ЕСЛИОШИБКА(ИНДЕКС(A$1:H$1;НАИМЕНЬШИЙ(ЕСЛИ((C$2:H$7="")*(A$2:A$7=A11);СТОЛБЕЦ(C$1:H$1);1000);ЕСЛИ(A11=A10;СТРОКА(A$1)+СЧЁТЕСЛИ(A$11:A11;A11)-1;СТРОКА(A$1))));"")

Автор - alexa1965
Дата добавления - 17.05.2023 в 14:43
Nic70y Дата: Среда, 17.05.2023, 14:49 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 9005
Репутация: 2369 ±
Замечаний: 0% ±

Excel 2010
alexa1965, точно переборщил с фио, переделал


ЮMoney 41001841029809
 
Ответить
Сообщениеalexa1965, точно переборщил с фио, переделал

Автор - Nic70y
Дата добавления - 17.05.2023 в 14:49
lianei2456 Дата: Среда, 17.05.2023, 14:50 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

2010
Nic70y, спасибо большое.
 
Ответить
СообщениеNic70y, спасибо большое.

Автор - lianei2456
Дата добавления - 17.05.2023 в 14:50
alexa1965 Дата: Среда, 17.05.2023, 14:54 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 383
Репутация: 62 ±
Замечаний: 0% ±

2003> 2019 >2016
переделал
Зато для долга красиво, не то что у меня


Главное не быть балабастиком
 
Ответить
Сообщение
переделал
Зато для долга красиво, не то что у меня

Автор - alexa1965
Дата добавления - 17.05.2023 в 14:54
Nic70y Дата: Среда, 17.05.2023, 14:54 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 9005
Репутация: 2369 ±
Замечаний: 0% ±

Excel 2010
lianei2456, если спасибо за формулы, то, благодаря alexa1965 я упростил.
скачайте файл из сообщения №4


ЮMoney 41001841029809
 
Ответить
Сообщениеlianei2456, если спасибо за формулы, то, благодаря alexa1965 я упростил.
скачайте файл из сообщения №4

Автор - Nic70y
Дата добавления - 17.05.2023 в 14:54
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!