Вставить изображение из буфера обмена в ячейку в Excel

Вопрос: Я хочу вставить изображение из буфера обмена в ячейку excel с помощью vba. я мог бы найти такой код: If My.Computer.Clipboard.ContainsImage() Then Dim grabpicture = My.Computer.Clipboard.GetImage() PictureBox1.Image = grabpicture End If но здесь переменная grabpicture является объектом. как обновить ячейку из объекта изображения. как это, Sheet1.Range("D11").Value = grabpicture Лучший ответ: Картинки не вставляются в

Вопрос:

Я хочу вставить изображение из буфера обмена в ячейку excel с помощью vba. я мог бы найти такой код:

If My.Computer.Clipboard.ContainsImage() Then Dim grabpicture = My.Computer.Clipboard.GetImage() PictureBox1.Image = grabpicture End If

но здесь переменная grabpicture является объектом. как обновить ячейку из объекта изображения. как это,

Sheet1.Range(«D11»).Value = grabpicture Лучший ответ:

Картинки не вставляются в ячейки. Картинки вставляются на лист, а затем могут быть выровнены так, чтобы верхний левый угол визуально соответствовал верхнему левому углу некоторой ячейки.

Чтобы вставить изображение из буфера обмена, вы используете Sheet1.Paste().

Ответ №1

Для перемещения изображения с одного листа на другой с помощью стандартных методов буфера обмена используется Copy-Paste. Для метода “Вставить” вы должны определить диапазон, в который будет вставлено изображение, например (вы можете пропустить параметр назначения):

Worksheets(«Sheet1»).Range(«C1:C5»).Copy ActiveSheet.Paste Destination:=Worksheets(«Sheet1»).Range(«D1:D5»)

Картинка вставлена в указанную область, но существуют некоторые особенности:

  • для вставленного изображения Office 2003 не привязывается точно к верхнему левому углу диапазона; если вы определяете одну ячейку, изображение может получить положение больше слева и ниже, даже может получить соседнюю ячейку; поэтому вы должны выполнить процедуру перестройки с использованием свойств Top и Left (см. ниже);
  • для вставленного изображения Office 2003 IS NOR выбрано, поэтому необходимо выполнить специальную процедуру для идентификации изображения в коллекции Shapes;

  • для изображения Office 2007 выбирается и привязывается к верхнему левому углу указанного диапазона, поэтому свойство Selection может использоваться для изменения свойства изображения в коллекции (например, имя);

  • вставляемый индекс изображения в коллекции Shapes становится самым большим, НО ПОКАЗАТЬ ИЗОБРАЖЕНИЯ (Тип = msoPicture); в Office 2003 Формы группируются так, что сначала это блок элементов управления (Lstbox, Combobox и т.д.), а блок изображений – последний, поэтому вставляемый индекс изображения фактически является последним во всей коллекции; для блока изображений Office 2007 оказывается ПЕРЕД блоком элементов управления, поэтому вы должны искать индекс последнего вставленного изображения между элементами IMAGE BLOCK (см. пример ниже);

  • для отмены выбора вставленного изображения (не для его удаления случайно) вы должны перемещать фокус в любую ячейку/например, в виде диапазона (“A1”).

Следовательно, чтобы написать универсальную программу, которая работает правильно либо в Office 2003, либо в среде Office 2007, вам необходимо:

  • сначала используйте специальную процедуру, чтобы узнать вставленное изображение (ссылку или индекс) в коллекции Shapes);
  • во-вторых, выравнивание изображения в верхнем левом углу диапазона, в который вставлено изображение;
  • в-третьих, переместить фокус в другую ячейку.

Ниже приведена функция, которая определяет индекс последнего вставленного изображения в коллекции Shapes:

Function GetIndexPastedPicture() As Integer ‘ Pasted picture has the upmost index among the PICTURE block ‘ But it is not necessarily the last inde[ in whole collection ‘ set reference to target sheet with pasted image Set ThisDBSheet = Workbooks(«BookName.xls»).Worksheets(«SheetName») Dim sh As Shape, picIdx As Integer picIdx = 0 ‘ initial value of index in Shapes collection, starts from 1 For Each sh In ThisDBSheet.Shapes If sh.Type = msoPicture Then ‘ image found picIdx = sh.ZOrderPosition ‘ image index End If Next ‘ after For loop, picIdx — is the last index in PICTURE block GetIndexPastedPicture = picIdx End Function

Затем (при условии, что Clipboard уже имеет правильное изображение) процедура вставки изображения выглядит следующим образом:

Sub InsPicFromClipbrd(sInsCell As String, sPicName As String) ‘ Image is pasted to cell with name sInsCell, ‘ it is aligned to upper-left corner of the cell, ‘ pasted image gets name sPicName in Shapes collection ‘ set reference to target sheet with pasted image Set ThisDBSheet = Workbooks(«BookName.xls»).Worksheets(«SheetName») ThisDBSheet.Paste Destination:=Range(sInsCell) ‘ paste image fom clipboard c1 = GetIndexPastedPicture() ‘ get index of pasted image (see above) With ThisDBSheet.Shapes.Item(c1) ‘ correct the properties of the pasted image .Top = Range(sInsCell).Top ‘ top alignment .Left = Range(sInsCell).Left ‘ left alignment .Name = sPicName ‘ assign new name End With Range(«I18»).Activate ‘ move focus from image End Sub ‘InsPicFromClipbrd

Оцените статью
Добавить комментарий