Извините, конечно, но диалог выбора файлов и прописывание конкретного пути, где будет выполняться поиск изображение, это не то, что я имел виду. В моём случае речь про то, что ни файл, ни изображения не должны быть привязаны к какому-то конкретному пути. Задумка в том, что, в какую бы папку пользователь ни положил файлы, код будет работать автономно, не нужно будет заходить в код и прописывать новый путь.
Цитата
написал: диалог выбора файлов:
Код
' если путь надо указать статичный - вместо диалога прописываем одну строку
' sPicsPath = "C:\images\"
Это понял, спасибо!
Цитата
написал: убираете блок выбора папки(у которого тоже есть комментарий: 'выбираем путь к папке с картинками). И оставляете только эту строку:
Правильно понимаю, что нужно этот код использовать? (уже добавил в него oShp.OnAction = "ClickResizeImage"). Этот код помещаю в модуль, а коды для PlaceImage и ClickResizeImage в "ЭтаКнига"?
И ещё момент, можно ли в Вашем коде сделать так, чтобы путь до файлов изображений был тот же, что и путь этой книги Excel? Что-то вроде folderPath = ThisWorkbook.path & "\".
Код
Option Explicit
Sub InsertPictureByVal()
Dim sPicsPath As String
Dim sPicName As String, sPFName As String, sSpName As String
Dim llastr As Long, lr As Long
Dim oShp As Shape
Dim zoom As Double
'выбираем путь к папке с картинками
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Выбрать папку с картинками" 'заголовок окна диалога
.ButtonName = "Выбрать папку"
.Filters.Clear 'очищаем установленные ранее типы файлов
.InitialFileName = ThisWorkbook.Path 'назначаем первую папку отображения
.InitialView = msoFileDialogViewLargeIcons 'вид диалогового окна
If .Show = 0 Then Exit Sub 'показываем диалог
sPicsPath = .SelectedItems(1) 'считываем путь к папке
End With
' если путь надо указать статичный - вместо диалога прописываем одну строку
' sPicsPath = "C:\images\"
'проверяем, есть ли слеш после пути к папке
'если нет - добавляем, иначе путь к картинке будет неверный
If Right(sPicsPath, 1) <> Application.PathSeparator Then
sPicsPath = sPicsPath & Application.PathSeparator
End If
'определяем последнюю ячейку по столбцу с именами картинок
llastr = Cells(Rows.Count, 2).End(xlUp).Row
'если кроме шапки в столбце с именами картинок ничего нет
If llastr < 2 Then
Exit Sub
End If
'цикл по столбцу с именами картинок
For lr = 2 To llastr
sPicName = Cells(lr, 2).Value
'проверяем наличие картинки в папке
sPFName = sPicsPath & sPicName
If Dir(sPFName, 16) <> "" And sPicName <> "" Then
'в эту ячейку вставляем картинку
With Cells(lr, 3)
'задаем картинке уникальный адрес,
'привязанный к адресу ячейки
sSpName = "_" & .Address(0, 0) & "_autopaste"
'если картинка уже есть - удаляем её
Set oShp = Nothing
On Error Resume Next
Set oShp = ActiveSheet.Shapes(sSpName)
If Not oShp Is Nothing Then
oShp.Delete
End If
On Error GoTo 0
'вставляем выбранную картинку
Set oShp = ActiveSheet.Shapes.AddPicture(sPFName, False, True, .Left + 1, .Top + 1, -1, -1)
'определяем размеры картинки в зависимости от размера ячейки
zoom = Application.Min(.Width / oShp.Width, .Height / oShp.Height)
oShp.Height = oShp.Height * zoom - 2
'переименовываем вставленную картинку(чтобы потом можно было заменить)
oShp.Name = sSpName
oShp.OnAction = "ClickResizeImage"
End With
End If
Next
End Sub
Для базы данных ищу решение такой задачи (из 2 пунктов):
1. Нужно вставить изображение по критерию (артикул). Расширение файлов изображений может быть любым. Вариант решения тут: https://www.planetaexcel.ru/techniques/25/28717/ Но здесь сначала нужно создать ссылки на изображения, затем по ним будет выполнен поиск. Ссылку на изображения я получаю с помощью формулы.
2. Нужно сделать масштабирование изображения, то есть нажимаем на маленькое изображение - оно увеличивается, нажимаем по увеличенному - оно возвращается к исходному размеру.
Найденный в интернете код работает частично, так как вставка изображений происходит по сути в ручном режиме - нужно выбирать ячейку и путь к файлу, чтобы сделать связку.
Код
Sub InsertImage()
Dim SHP As Shape, fName As String, Cel As Range
Set Cel = Application.InputBox("select cell for image placement & click on OK", "", , , , , , 8)
fName = Application.GetOpenFilename(Title:="Select image", FileFilter:="Images (*.gif;*.jpg;*.jpeg;*.bmp;*.png),*.gif;*.jpg;*.jpeg;*.bmp;*.png")
Cel.Select
ActiveSheet.Pictures.Insert(fName).Select
Set SHP = Selection.ShapeRange.Item(1)
Call PlaceImage(Cel, SHP)
SHP.OnAction = "ClickResizeImage" '(assign macro)
Cel.Select
End Sub
Sub PlaceImage(Cel As Range, SHP As Shape)
Dim W As Double, H As Double, L As Double, T As Double
Cel.Select: W = Cel.Width: H = Cel.Height: L = Cel.Left: T = Cel.Top
With SHP
.LockAspectRatio = msoTrue
.Width = W
If .Height > H Then .Height = H
.Left = L + (W - SHP.Width) / 2
.Top = T + (H - SHP.Height) / 2
End With
End Sub
Sub ClickResizeImage()
Dim SHP As Shape, Cel As Range, W As Double, H As Double, L As Double, T As Double
Set SHP = ActiveSheet.Shapes(Application.Caller)
Set Cel = SHP.TopLeftCell
Cel.Select: W = Cel.Width: H = Cel.Height: L = Cel.Left: T = Cel.Top
If SHP.Width < W Or SHP.Height < H Then SHP.Width = W * 5 Else Call PlaceImage(Cel, SHP)
End Sub
Можно ли как-то объединить коды, чтобы получить такой результат? 1. В колонке A список артикулов. 2. В колонку B автоматически вставляются изображения, найденные по артикулу в той же папке, где лежит файл Excel (в формате "иконок" под высоту ячейки, без каких-либо ссылок). 3. Иконки можно масштабировать до полного изображения и обратно.
Можно и так. Но файлов несколько. Указанный по ссылке макрос обрабатывает сразу несколько файлов и складывает картинки в одну папку.
К тому же, файлы имеют название Image 1, Image 2 и так далее. Будет пересечение названий между файлами, придётся вручную переименовывать. Конкретно сейчас речь про ~2000 объектов в 15 Excel-книгах.
Столкнулся с такой проблемой как "массовое извлечение изображений из Excel". Нашёл интересный код на VBA, работает хорошо, но сохраняет изображения в том виде, как они представлены на листе, то есть уменьшенного размера. А надо сохранить в исходном разрешении. Есть у кого-то идеи, как нужно дополнить код? (я в макросах совершенно не силён)
Вопрос - возможно ли в Excel как-то сделать PQ-запрос (веб-запрос) таким образом, чтобы результаты он возвращал в конкретный столбец на обычной (или умной сводной) таблице листа Excel?
Замысел в том, чтобы можно было щелкнуть правой кнопкой по этому "простому" столбцу для обновления данных.
Пока что у меня решение только через ВПР, что не позволяет обновлять данные, не заходя в сам запрос.
Подскажите, пожалуйста, как можно решить такую проблему? Есть список кодов, которые подставляются через параметр к ссылке, далее извлекается информация с веб-страницы. Так получилось, что есть случаи, когда страницы с таким кодом нет, соответственно в таблице выводится ошибка, дальше обработка других кодов прекращается. Мне нужно, чтобы строка просто игнорировалась, если веб-страницы нет. В таблице колонки, соответственно, с нулями.
Весь файл скидывать не буду, он тяжелый. Вызываемая функция работает следующим образом:
Добрый день. Не подскажете, как быть с изменением таблицы, если кол-во строк (столбцов) в запросе отличается? Выдает ошибку (столбец показывает "Error"), если его не находит.
Надо как-то сделать, чтобы было по умолчанию 5 столбцов, но у меня не получается это победить.
То есть нужно, чтобы если по одному какому-то столбцу нет данных, то, соответственно, выводило пустое значение. Простое добавление доп. строки не помогает, там вылезает ошибка на CSS.
IKor, помимо собственно формулировки запроса (спорить не буду, мог и неоднозначно это сделать), к моему сообщению был приложен файл. Согласитесь, странно, если я на просьбу помочь с оптимизацией моей формулы, которая дает правильный результат, я получаю решения с другими результатами. Тут тогда тоже могу парировать "к вопросу о мастерстве ознакомления с файлом".
Спасибо за предложенное решение! Это в любом случае помощь в попытке достичь желаемого.
Изначально я так и делал, у меня созданы три столбца под каждое условие. Потом были долгие попытки все в один столбец запихать, что я и сделал в итоге. Решение в моем файле.
Цитата
написал: Рекомендую задуматься об организации пары вспомогательных столбцов для указания границ диапазонов - либо сразу используйте два столбца и не экспериментируйте с обработкой текста вместо чисел.
Еще раз - мой запрос был оптимизировать/упростить формулу, а не придумать другую логику для значений, включая придирки формата ">200" - это не "не менее 200".
Если сказано, что число 200 может входить в диапазоны ">200", "200-300", но не может входить в "140-200", значит так оно и должно быть, даже если математически это не так.
"140-200" означает ДО 200, то есть само 200 НЕвходит в него включительно. А вот в "200-300" или ">200" (то есть ОТ 200) - это то, что надо. Надо принять логику, а не изменять ее. Вопрос касается только доработки формулы. Нет идей, не надо предлагать неправильные, пожалуйста.
написал: Кстати, >200 - это не "не менее 200", а "более 200". Чувствуете разницу? 200 туда не входит
Я в курсе, что >200 - это словесно "более 200". Но для визуализации я сделал именно так. Если бы посмотрели формулу, то увидели бы там "$B$1>=ЗНАЧЕН". Можно было бы, конечно, указать вот так: "=>200"...
Цитата
написал: Чрезвычайно информативно. Пойду за волшебным шаром, может, он подскажет, что же там такое "не то".
Моя формула работает правильно, Ваши нули и единицы не совпадают с моими результатами. Как тут написали, не хотелось бы ковыряться в другой формуле, пытаясь понять логику.
написал: На мой взгляд числа " 200", а также "200-300" и "300-400" выходят за границы диапазона; в то время как числа "100-140" и "100-200" должны в него входить. Но видимо, Ваша логика какая-то иная.
Так число-то одно - 200, выделено желтой заливкой. Проверяется оно на предмет вхождения в нижеуказанные диапазоны, а не наоборот.
Вместо 200 можно подставлять другое - 98, 101, 385, например. И каждый раз это число будет проверяться формулой. Где попало в условия, диапазон выделяется "ИСТИНА", где нет - "ЛОЖЬ".
написал: Почему в B17:B19 ЛОЖЬ, хотя диапазоны больше 200
Стесняюсь спросить, а должна быть ИСТИНА? Диапазон 300-400, число 200 в него не входит однозначно, а вот условию ">200" оно удовлетворяет, поэтому ИСТИНА. Проверяется заданное число на соответствие каждой конкретной строке, а не списку в целом - по-моему, это весьма логично.
IKor, моя формула считает правильно, но она громоздкая. В вашей формуле не то, что надо (видимо, вследствие того, что я не указал в запросе, что требуется).
Можно ли как-то оптимизировать/упростить формулу проверки соответствия числа заданным критериям (то есть входит в диапазон 100-200, например, или является <100 (>200))?
Вообще в условиях этой инструкции написано, что надо ставить значение года как "Текстовое", чтобы в ссылке потом слияние было корректное. Но по-моему нет такого, что сам список для прогрузки должен содержать текстовые значения. У меня были числа, я переделал все колонку в текст.
Но очень долго идет загрузка. Список значений от 0 до 30000 сделал (с прицелом на будущее, если ничего в структуре не поменяется). Так ~8500 строк грузились около 2 часов. Остановил загрузку. Пока не знаю, как идти дальше, чтобы в итоге получить список ссылок. Даже вручную на предпросмотре таблица прогружается быстрее, чем программно.
Попробовал рандомные числа в УИН вставить, где-то что-то открывается как надо, а где-то просто пустая страница. Но идея мне нравится. Осталось логику образования УИНов понять.
Для уточнения. Дерево находится условно на главной странице, после раскрытия до нужного кода, он будет иметь прямую ссылку для перехода на страницу кода.
Подскажите, пожалуйста, можно ли как-то путем запросов в Power Query раскрыть список (см. приложенный скрин) и вывести найденные 10-значные коды списком?