Страницы: 1
RSS
Удаление рисунка из под ячейки - только в том случае, если ячейка пуста или в ней - неключевое слово.
 
Всем доброго времени суток.

Такой вопрос по макросу появился:
Имеющийся код - добавляет рисунок с текстбоксом - под ячейкой, в которой вписано определенное ключевое слово.
Список ключевых слов соответствует названиям файлов jpg, которые лежат в определенной папке.

Но макрос - при вставке слова - в других ячейках - добавляет картинку туда, а предыдущую вставленную почему-то удаляет.

Как изменить данный макрос, чтобы он удалял картинки с текстбоксами - под ячейками - только в том случае, если я стираю содержимое этой ячейки или ввожу слово - которое не соответствует названиям фалов jpg в этой папке?
 
Пожалуйста, посмотрите, это то или не то.
Незначительные заметки в коде, для вас интересен будет раздел о настройке размера картинки (Nastroyka razmera kartinki).
 
Имеется код, который расставляет сгруппированные картинки-текстбоксы.
Но этот код не удаляет их - если я стираю содержимое этой ячейки или ввожу слово - которое не соответствует названиям фалов jpg в этой папке.

В вашем коде я не особо разобрался.
Вроде бы он умеет удалять текстбокс если стереть текст ячейки, но у меня - как бы другая ситуация - не один текстбокс, а фигура в виде группы: Картинка+Текстбокс.
 
Вариант
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim iPath$, iFileName$, tb, pic
'  iPath = "d:\1\" 'Укажите папку с рисунками
iPath = ThisWorkbook.Path & Application.PathSeparator
iFileName = Dir(iPath & Target(1) & ".jpg")
On Error Resume Next
Application.ScreenUpdating = False
If iFileName <> Empty Then
    Me.Shapes(Target.Address).Delete
    Set pic = Me.Pictures.Insert(iPath & iFileName)
    pic.Left = Target.Left
    pic.Top = Target(2).Top
    Set tb = Me.TextBoxes.Add(pic.Left + 10, pic.Top + pic.Height - 30, 100, 20)
    tb.Text = Target(1)
    Me.Shapes.Range(Array(pic.Name, tb.Name)).Group.Name = Target.Address
Else
    MsgBox "В указанной папке - нет рисунка " & Target(1) & ".jpg"
    Me.Shapes(Target.Address).Delete
End If
Application.ScreenUpdating = True
End Sub
но ранее вставленные рисунки этот макрос обрабатывать не будет
Согласие есть продукт при полном непротивлении сторон
 
Sanja, спасибо за ответ.
 
Офф. Ігор Гончаренко, подскажите это такой не явный Offset? Первый раз с таким сталкиваюсь. Где-то подобное документировано?
Код
Target(2) 'или (по экспериментам) Target(3) или Target(,2) или и т.п.
Согласие есть продукт при полном непротивлении сторон
 
Target - это тип Range
a Range - это сложный тип, он одновременно и маасив и коддекция, поэтому VBA поддерживает обращение с ячейкам по 2-м индексам (строка и столбец) и по просто по порядковому номеру ячейки. порядковая нумерация начинается с первой строки...
допустим есть Set Target = [A1:C2]
хотим обратиться к В2, как бы по нормальному нужно обращаться к Target.Cells(2,2)
но можно опустить Cellls и использовать:
Target(2,2)
и даже
Target(5)
(В2 - 5-я из 6-и ячеек массива А1;С2)

подобные обращения не допустимы к типу Array
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Игорь, когда Target.Count >1 это понятно и логично, но в примере Target - это одна ячейка и Target(2).Address дает адрес, отстоящий от Target на одну строку. Все-таки Offset?  
Согласие есть продукт при полном непротивлении сторон
 
ну, это укладывается в ранее описанную схему:
если в качестве Target взять диапазон в несколько ячеек шириной, то Target(2) - будет первая ячейка вправо от начальной
но когда Target - это одна ячейка, то Target(2) рассматривается как след.ячейка под Target и т. д. пока Target(Х) - не выпадет за нижнюю строку листа
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо, Игорь
Согласие есть продукт при полном непротивлении сторон
 
См. описание Range.Item
Изменено: sokol92 - 04.05.2018 17:14:02
Владимир
 
Цитата
Димитрий2 написал:  картинки... - под ячейками
Это как? Под ячейкой можето быть только картинка-подложка для всеего листа
 
Виктор, ты имеешь в виду Z-порядок)
а Димитрий2, описавал то, что визуально видел на экране
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал: ты имеешь в виду Z-порядок)
Нет, я обратил внимание на непорядок в определениях )
 
sokol92, да это оно, спасибо
Согласие есть продукт при полном непротивлении сторон
 
Sanja, это - выстрадано... Item - свойство по умолчанию для объекта типа Range, заданного с параметрами (без параметров - Value). Так что Target(1) это Target.Item(1), Target.Cells(1,2) это Target.Cells.Item(1,2). Разница между свойствами Item и Cells видна на примере объекта Range("A1:B3").Rows. Как всегда в подобных случаях, на сайте есть замечательные сообщения Владимира (ZVI) на эту тему.
Изменено: sokol92 - 04.05.2018 20:15:48
Владимир
 
Ігор Гончаренко, спасибо за разъяснение!  
Страницы: 1
Наверх