Не удается вставить изображения в Excel с VBA - PullRequest
1 голос
/ 22 марта 2020

Я схожу с ума по этой проблеме, пожалуйста, помогите мне.

Я создал сценарий оболочки, который записывает в текстовый файл путь к некоторым изображениям, которые хранятся в папке. Затем я использую код Excel, чтобы прочитать каждый путь и записать его в ячейку Excel. Затем я сделал код, который должен взять этот путь и использовать его для вставки картинки. Я пытался с Pictures.insert (путь) и shape.addpictures "путь", но у меня возникает одна и та же проблема каждый раз, изображение не может быть загружено. Что странно, так это то, что если я вручную вставлю картинку, а затем удалю ее, код прекрасно загрузит картинку. Но если это первый раз, то нет. Пути, которые я использую, выглядят так: "/Users/theodorebedos/Documents/code_tilly/new_pict_tilly/new_pict_tilly/IMG_9040.jpg"

Я использую ма c, может быть, это имеет значение?

Private Sub Convert_Img()

Dim myPict As Picture
Dim PictureLoc As String
Dim EndPictRow, i As Integer
Dim StartPath As String


If Worksheets("Main").Cells(3, 1).Value <> "" Then
    EndPictRow = Worksheets("Main").Range("A2").End(xlDown).Row

    For i = 3 To EndPictRow
        PictureLoc = Worksheets("Main").Cells(i, 1).Value
        Worksheets("Main").Cells(i, 1).ClearContents
        Worksheets("Main").Cells(i, 1).ColumnWidth = 30
        Worksheets("Main").Cells(i, 1).RowHeight = 150
           ActiveSheet.Shapes.AddPicture PictureLoc, False, True, Worksheets("Main").Cells(i, 1).Left, Worksheets("Main").Cells(i, 1).Top, Worksheets("Main").Cells(i, 1).Width, Worksheets("Main").Cells(i, 1).Height

    Next i
End If

End Sub

Редактировать: Когда я использую «Pictures.insert» или «shape.addpicture path, true, true», у меня нет сообщения об ошибке в VBA, но вместо изображения в Excel отображается пустое изображение внутри сообщение об ошибке, подобное этому: image

Если я использую «путь image 2

А затем ошибка 1004, например: image3

И если я делаю процесс, чтобы получить изображение 1, то я сохраняю документ, снова открываю это, у меня будет это непосредственно: изображение 4

Спасибо за вашу помощь. Это будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 22 марта 2020

РЕДАКТИРОВАТЬ: На основании вашего комментария я посмотрел, как нужно указывать пути к файлам при запуске VBA на Ma c, и нашел эту статью Рона де Брюина. Оказывается, вы должны использовать «:» в качестве разделителя пути вместо «/».

Это должно исправить проблему, которая возникла у вас с методом .AddPicture, но я все равно оставлю свой первоначальный ответ ниже на всякий случай.


Кажется, что вы описываете проблему быть таким же, как этот вопрос . К сожалению, это не похоже на ответ, при условии, что он действительно решит вашу проблему.

У меня нет Ma c, поэтому я не могу проверить это, но я бы посоветовал вам попробуйте этот потенциальный обходной путь: вместо вставки изображения вы можете вставить прямоугольную angular форму и затем заполнить ее нужным изображением.

Код для этого будет выглядеть следующим образом:

Sub AddFilledRectangle()

    Dim FullFileName As String
    FullFileName = "Users:File:Path:img.jpg"

    Dim MyShapeTop As Double, MyShapeLeft As Double, MyShapeWidth As Double, MyShapeHeight As Double
    MyShapeTop = 100
    MyShapeLeft = 100
    MyShapeWidth = 100
    MyShapeHeight = 100

    'Create a new rectangular Shape
    Dim shp As Shape
    Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, MyShapeLeft, MyShapeTop, MyShapeWidth, MyShapeHeight)

    'Change the filling options
    With shp.Fill
        .Visible = msoTrue
        .UserPicture FullFileName
        .TextureTile = msoFalse
        .RotateWithObject = msoTrue
    End With

End Sub

Надеюсь, это работает в версии Excel * Ma 1024 *.

0 голосов
/ 23 марта 2020

Хорошо, так что это еще не идеально, но я отключил l oop и использовал Dir (), как вы сказали @ Variatus. Всплывающее окно типа this открылось, когда я выполнил команда Dir (). Он попросил у меня авторизацию для доступа к файлу. Я нажал «да», и тогда это сработало. Это сработало, но только для этого файла. Итак, я думаю, что сейчас я на правильном пути, и мне нужно найти способ предоставить доступ ко всем файлам в этой папке, прежде чем запускать код. Я не могу сделать это для всех них. Большое спасибо.

0 голосов
/ 22 марта 2020

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

  1. После того, как ширина столбца установлена, ширина всех ячеек в ней одинакова.
  2. Свойство Left всех ячеек в столбце всегда одинаково.
  3. Если столбец является столбцом A, значение Left всегда равно 0.

Конечно, то, что вы пытались для достижения - это ввести значение только один раз. Это хорошая практика, но читать свойства с листа медленно. Более быстрый способ - меньше кода и лучше читаемый текст - объявить константу сверху и использовать это имя в коде.

Таким образом, вы получите этот код.

Private Sub Convert_Img()

    Const ClmWidth As Single = 30
    Const RowHight As Single = 150

    Dim EndPictRow As Long, R As Long
    ' sorry, I recommend i for arrays and R for rows (C for columns)


    With Worksheets("Main")
        ' End(xlDown) will find the first blank cell below the base cell.
        '   There might be more filled cells further down.
        ' End(xlUp) will find the first used cell above the base cell
        '   disregarding more blanks above that one.
        EndPictRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        ' no need to set the column width multiple times in the loop
        .Columns(1).ColumnWidth = ClmWidth

        ' this loop will never run if R < EndPicRow
        For R = 3 To EndPictRow
            With .Cells(R, 1)
                .RowHeight = RowHight
                ' this will work only once:-
                .Worksheet.Shapes.AddPicture CStr(.Value), False, True, 0, .Top, ClmWidth, RowHight
            End With
        Next R
    End With
End Sub

Причина, по которой это работает только один раз, становится совершенно очевидной. Новое изображение берет исходный путь из ячейки Value. Конечно, после того, как вы вставите изображение (изображение) в ячейку, это значение больше не может быть путем (строкой). Если вы запустите код во второй раз, он потерпит неудачу. Однако, если это необходимо, должна быть возможность извлечь путь из формулы, которая определяет изображение в ячейке. Учитывая, что само изображение не присутствует в этом месте, формула должна содержать путь или ссылку на местоположение в фоновых данных рабочей книги, в зависимости от того, как оно было загружено.

...