Задался вопросом отсортировать артикула в файле(с изображениями). Размер изображений разный, как и высота строк.
Подскажите пожалуйста, как сделать сортировку в excel, но чтобы размеры строк тоже сортировались? А то по артикулам получается сделать сортировку, но из-за разной высоты строк изображения то уменьшаются, то лезут друг на другая.
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 - 20 Высота строки с фото2 - 25 Высота строки с фото3 - 30
Мне нужно сделать сортировку по артикулам. Т.е. чтобы строки были в таком порядке: Фото1 - 111 Фото3 - 222 Фото2 - 333
Если я делаю сортировку по высоте строки... то ничего не меняется. Они так и будут идти в порядке Фото1,2,3.
Что даёт мне сортировка по высоте строки? Да и с чего строки вообще будут размер менять свой при сортировке? Или я делаю какую то неправильную сортировку?
Андрей VG, уважаемый, я никому ничего не предлагаю. Я поинтересовался как сделать нужную мне сортировку, не более. МатросНаЗебре привёл макрос, который по моему мнению мне никак помочь не может, чем я объяснил в своём предыдущем посте.
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, я именно так и делал каждый раз. Но в ручную бывает сложно сделать, когда больше 150 позиций. Вот и думал, что есть возможность как-то автоматизировать это.
Вообще странно, что в экселе по-умолчанию нет такой сортировки.
Malcolm написал: есть возможность как-то автоматизировать это.
Есть такая возможность - написать макрос, реализующий данный алгоритм.
Цитата
Malcolm написал: Вообще странно, что в экселе по-умолчанию нет такой сортировки.
В Excel много чего нет, но решается созданием макросов - в том его сила. Но вы можете написать в техподдержку Microsoft, чтобы они запланировали выпуск такого решения. Вдруг получится убедить?
Вроде как, ничего тут изобретать не надо Всё нормально сортируется / фильтруется штатными средствами Excel, если картинки привязаны к ячейкам (перемещаются и изменяются вместе с ячейками) Инструкция: https://excelvba.ru/programmes/PastePictures/manuals/errors/filter
Игорь, можно продемонстрировать сортировку штатными средствами на примере (я не застенчив как ТС, прикладываю). Требования в статье по данной вами ссылки
Цитата
режим привязки у всех картинок должен быть выбран «Перемещать и изменять объект вместе с ячейками»
выполнил (как и остальные - картинки полностью внутри соответствующих ячеек). Но вот при сортировке по столбцу id не по убыванию, размер самой большой картинки с id 2 меняется по вертикали. Для теста использовал Excel 365 персональный. Завтра на работе попробую под 2016.
Андрей, вы правы, а я ошибся То, что я описал, помогает только при фильтрации таблицы А с сортировкой это не работает До этого я сортировал таблицы с картинками разного размера, но со строками одинаковой высоты (картинки вписаны в ячейки, с добавлением отступов сверху и снизу), и проблем не было. А если вставлять картинки как в вашем файле - то только макросом сортировать.