Страницы: 1
RSS
Сортировка строк по их высоте с перемещением картинок
 
Добрый день.

Задался вопросом отсортировать артикула в файле(с изображениями). Размер изображений разный, как и высота строк.

Подскажите пожалуйста, как сделать сортировку в excel, но чтобы размеры строк тоже сортировались? А то по артикулам получается сделать сортировку, но из-за разной высоты строк изображения то уменьшаются, то лезут друг на другая.

Спасибо.
Изменено: Malcolm - 05.03.2020 10:58:54
 
Код
1
2
3
4
5
6
7
8
9
10
Sub Выстота_строк()
    Dim a As Variant
    Dim y As Long
    y = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
    ReDim a(1 To y, 1 To 1)
    For y = ActiveSheet.UsedRange.Row To ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
        a(y, 1) = Rows(y).Height
    Next
    Cells(1, 1).Resize(UBound(a, 1)) = a
End Sub
Можно вывести высоту строк в отдельный столбец. И потом с его помощью отсортировать.
 
МатросНаЗебре, если честно, то не очень понимаю как это должно работать.
 
Нужно понять, как вставить макрос в файл?
 
МатросНаЗебре, да макрос то я встал, он мне считает высоту строк столбца А. Но какой смысл в этом?

Предположим такой пример: (фото - артикул)
Фото1 - 111
Фото2 - 333
Фото3 - 222

Высота строки с фото1 - 20
Высота строки с фото2 - 25
Высота строки с фото3 - 30

Мне нужно сделать сортировку по артикулам. Т.е. чтобы строки были в таком порядке:
Фото1 - 111
Фото3 - 222
Фото2 - 333

Если я делаю сортировку по высоте строки... то ничего не меняется. Они так и будут идти в порядке Фото1,2,3.

Что даёт мне сортировка по высоте строки? Да и с чего строки вообще будут размер менять свой при сортировке? Или я делаю какую то неправильную сортировку?
Изменено: Malcolm - 06.03.2020 10:18:09
 
Доброе время суток
Цитата
Malcolm написал:
Предположим такой пример
Вы предлагаете МатросНаЗебре сделать такой пример, что есть, как надо? Чтобы можно было заниматься как разработкой, так и отладкой?
 
Андрей VG, уважаемый, я никому ничего не предлагаю. Я поинтересовался как сделать нужную мне сортировку, не более. МатросНаЗебре привёл макрос, который по моему мнению мне никак помочь не может, чем я объяснил в своём предыдущем посте.
Изменено: Malcolm - 06.03.2020 10:15:03
 
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Sub Main()
    Dim r As Range
    Set r = ActiveSheet.UsedRange.Columns(1)
         
    Dim arr As Variant
    arr = r
     
    SortArray arr, 1
End Sub
'
Sub SortArray(arr As Variant, iColumn As Integer)    'Сортировка расчёской
    Dim d As Long
    Dim bNextTurnExit As Boolean: bNextTurnExit = False
     
    Dim i As Long
    Dim j As Long
    Dim t As Variant
    Dim x As Integer
     
'    Dim yOut As Byte: yOut = 1
'    Cells(yOut, 3).Value = Join(arr): yOut = yOut + 1
     
    Dim dh As Double
    dh = UBound(arr, 1) - LBound(arr, 1)
    If dh < 2 Then Exit Sub
    Do
        dh = dh / 1.247
        d = Round(dh, 0)
         
        If bNextTurnExit Then d = 1
        i = LBound(arr, 1)
        Do
            j = i + d
            If j > UBound(arr, 1) Then Exit Do
            If arr(i, iColumn) > arr(j, iColumn) Then
                 
                For x = LBound(arr, 2) To UBound(arr, 2)
                    t = arr(j, x)
                    arr(j, x) = arr(i, x)
                    arr(i, x) = t
                Next
                 
                Rows(j).Copy Rows(100000)
                Rows(i).Copy Rows(j)
                Rows(100000).Copy Rows(i)
                 
'                Cells(yOut, 3).Value = Join(arr): yOut = yOut + 1
            End If
'            Cells(yOut, 3).Value = Join(arr): yOut = yOut + 1
            i = i + 1
            DoEvents
        Loop
         
        If bNextTurnExit Then Exit Do
        If d <= 1 Then bNextTurnExit = True
    Loop
     
End Sub
Вот наброски макроса, сортирующего строки вместе в высотами. Как вариант, можно заменить копирование строк, на изменение высот.
 
МатросНаЗебре, спасибо, со строками работает теперь. Но не с картинками, их просто начинает по очень много раз засовывать в каждую ячейку и в итоге всё зависает.
 
Цитата
Malcolm написал:
Я поинтересовался как сделать нужную мне сортировку, не более.
То есть нужен алгоритм с учётом того, чтобы картинки сортировались, который вы реализуете самостоятельно?
1. Запоминаете в словаре для каждого артикула высоту строки и относительное положение картинок от верхнего края строки.
2. Находите максимальную высоту строки.
3. Для каждой картинки строки устанавливаете свойство перемещать, но не изменять размеры
4. Для всех строк устанавливаете максимальную высоту пункта 2.
5. Выполняете сортировку по артикулу.
6. Пользуясь словарём, восстанавливаете относительное положение картинок в строке, а затем восстанавливаете высоту строки.
Изменено: Андрей VG - 06.03.2020 15:25:15
 
Андрей VG, я именно так и делал каждый раз. Но в ручную бывает сложно сделать, когда больше 150 позиций. Вот и думал, что есть возможность как-то автоматизировать это.

Вообще странно, что в экселе по-умолчанию нет такой сортировки.
 
Цитата
Malcolm написал:
есть возможность как-то автоматизировать это.
Есть такая возможность - написать макрос, реализующий данный алгоритм.
Цитата
Malcolm написал:
Вообще странно, что в экселе по-умолчанию нет такой сортировки.
В Excel много чего нет, но решается созданием макросов - в том его сила. Но вы можете написать в техподдержку Microsoft, чтобы они запланировали выпуск такого решения. Вдруг получится убедить?
 
Вроде как, ничего тут изобретать не надо
Всё нормально сортируется / фильтруется штатными средствами Excel, если картинки привязаны к ячейкам (перемещаются и изменяются вместе с ячейками)
Инструкция:
https://excelvba.ru/programmes/PastePictures/manuals/errors/filter
 
Цитата
Игорь написал:
Всё нормально сортируется
Игорь, можно продемонстрировать сортировку штатными средствами на примере (я не застенчив как ТС, прикладываю).
Требования в статье по данной вами ссылки
Цитата
режим привязки у всех картинок должен быть выбран «Перемещать и изменять объект вместе с ячейками»
выполнил (как и остальные - картинки полностью внутри соответствующих ячеек).
Но вот при сортировке по столбцу id не по убыванию, размер самой большой картинки с id 2 меняется по вертикали.
Для теста использовал Excel 365 персональный. Завтра на работе попробую под 2016.
Изменено: Андрей VG - 09.03.2020 20:40:45
 
Андрей, вы правы, а я ошибся
То, что я описал, помогает только при фильтрации таблицы
А с сортировкой это не работает
До этого я сортировал таблицы с картинками разного размера, но со строками одинаковой высоты (картинки вписаны в ячейки, с добавлением отступов сверху и снизу), и проблем не было. А если вставлять картинки как в вашем файле - то только макросом сортировать.
Страницы: 1
Читают тему
Наверх
Loading...