2016-04-05 55 views
0

我的工作表有三列「A」=圖像,「B」=圖像名稱和「C」= URL鏈接,第1行和第2行用作頁眉和行3至1002用於用戶輸入。當前工作代碼將在您選擇的文件夾的列「B」中搜索圖像名稱,並將其插入列「A」。這個宏運行在我已經創建的用戶窗體上的命令按鈕上。通過URL鏈接將圖像放到Excel表格中

工作的代碼如下(這是公認的答案here的編輯版本):

Private Sub Add_Images_Click() 
Const EXIT_TEXT   As String = "" 
Const NO_PICTURE_FOUND As String = "No picture found" 

Dim picName    As String 
Dim picFullName   As String 
Dim rowIndex   As Long 
Dim lastRow    As Long 
Dim selectedFolder  As String 
Dim data()    As Variant 
Dim wks     As Worksheet 
Dim Cell    As Range 
Dim pic     As Picture 

On Error GoTo ErrorHandler 

selectedFolder = GetFolder 
If Len(selectedFolder) = 0 Then GoTo ExitRoutine 

Application.ScreenUpdating = False 

Set wks = ActiveSheet 
lastRow = wks.Cells(2, "B").End(xlDown).Row 
data = wks.Range(wks.Cells(3, "B"), wks.Cells(lastRow, "B")).Value2 

For rowIndex = 3 To UBound(data, 1) 
    If StrComp(data(rowIndex, 1), EXIT_TEXT, vbTextCompare) = 0 Then GoTo ExitRoutine 

    picName = data(rowIndex, 1) 
    picFullName = selectedFolder & picName 

    If Len(Dir(picFullName)) > 0 Then 
     Set Cell = wks.Cells(rowIndex, "A") 
     Set pic = wks.Pictures.Insert(picFullName) 
     With pic 
      .ShapeRange.LockAspectRatio = msoFalse 
      .Height = Cell.Height 
      .Width = Cell.Width 
      .Top = Cell.Top 
      .Left = Cell.Left 
      .Placement = xlMoveAndSize 
     End With 
    Else 
     wks.Cells(rowIndex, "A").Value = NO_PICTURE_FOUND 
    End If 
Next rowIndex 

ExitRoutine: 
Set wks = Nothing 
Set pic = Nothing 
Application.ScreenUpdating = True 
UserForm.Hide 
Exit Sub 

ErrorHandler: 
MsgBox Prompt:="Unable to find photo", _ 
     Title:="An error occured", _ 
     Buttons:=vbExclamation 
Resume ExitRoutine 

End Sub 
Private Function GetFolder() As String 
Dim selectedFolder As String 
With Application.FileDialog(msoFileDialogFolderPicker) 
    .InitialFileName = Application.DefaultFilePath & "\" 
    .Title = "Select the folder containing the Image/PDF files." 
    .Show 

    If .SelectedItems.count > 0 Then 
     selectedFolder = .SelectedItems(1) 
     If Right$(selectedFolder, 1) <> Application.PathSeparator Then _ 
      selectedFolder = selectedFolder & Application.PathSeparator 
    End If 
End With 
GetFolder = selectedFolder 
End Function 

我正在尋找一種方式來編輯這個宏,以便它能夠使用的URL鏈接爲「C」列中的圖像,並以這種方式查找圖像並將其插入列「A」。我發現一個工作代碼(不記得在哪裏,或者我會鏈接它),我嘗試使用當前的代碼來實現期望的結果。

示例代碼我在網上找到:

Sub Images_Via_URL() 
Dim url_column As Range 
Dim image_column As Range 

Set url_column = Worksheets(1).UsedRange.Columns("A") 
Set image_column = Worksheets(1).UsedRange.Columns("B") 

Dim i As Long 
For i = 2 To url_column.Cells.Count 

    With image_column.Worksheet.Pictures.Insert(url_column.Cells(i).Value) 
    .Left = image_column.Cells(i).Left 
    .Top = image_column.Cells(i).Top 
    .Height = 100 
    .Width = 100 
    End With 
Next 
End Sub 

下面的代碼是我失敗的嘗試來編輯它自己。它曾經爲7個URL鏈接列表工作過一次,然後我刪除了中間的一個鏈接,看看它是否能正確處理空白單元格,現在它平淡無味。它每次都進入「ExitRoutine」。

不工作代碼:

Option Explicit 
Private Sub URL_Images_Click() 

Const EXIT_TEXT   As String = "" 
Const NO_PICTURE_FOUND As String = "No picture found" 

Dim picURL    As String 
Dim rowIndex   As Long 
Dim lastRow    As Long 
Dim data()    As Variant 
Dim wks     As Worksheet 
Dim Cell    As Range 
Dim pic     As Picture 

On Error GoTo ErrorHandler 

Application.ScreenUpdating = False 

Set wks = ActiveSheet 
lastRow = wks.Cells(2, "B").End(xlDown).Row 
data = wks.Range(wks.Cells(3, "C"), wks.Cells(lastRow, "C")).Value2 

For rowIndex = 3 To UBound(data, 1) 
    **If StrComp(data(rowIndex, 1), EXIT_TEXT, vbTextCompare) = 0 Then GoTo ExitRoutine** 

    picURL = data(rowIndex, 1) 

    If Len(picURL) > 0 Then 
     Set Cell = wks.Cells(rowIndex, "A") 
     Set pic = wks.Pictures.Insert(picURL) 
     With pic 
      .ShapeRange.LockAspectRatio = msoFalse 
      .Height = Cell.Height 
      .Width = Cell.Width 
      .Top = Cell.Top 
      .Left = Cell.Left 
      .Placement = xlMoveAndSize 
     End With 
    Else 
     wks.Cells(rowIndex, "A").Value = NO_PICTURE_FOUND 
    End If 

Next rowIndex 

ExitRoutine: 
Set wks = Nothing 
Set pic = Nothing 
Application.ScreenUpdating = True 
UserForm.Hide 
Exit Sub 

ErrorHandler: 
MsgBox Prompt:="Unable to find photo", _ 
     Title:="An error occured", _ 
     Buttons:=vbExclamation 
Resume ExitRoutine 

End Sub 

我加粗是迫使它的「ExitRoutine」的路線。我不確定這條線是如何工作的,因爲我不是最初編寫它的人。任何幫助將是偉大的!

+0

什麼'lastRow'失敗時的價值?一個簡單的測試將是'如果Len(data(rowIndex,1))= 0然後GoTo ExitRoutine' –

回答

0
lastRow = wks.Cells(2, "B").End(xlDown).Row 
data = wks.Range(wks.Cells(3, "C"), wks.Cells(lastRow, "C")).Value2 

For rowIndex = 3 To UBound(data, 1) 
    '.... 

如果開始在rowIndex位置= 3那麼你就跳過輸入數據的前兩行:2-d陣列從一個範圍總是有兩個維度的1下界,而不管位置如何的範圍內。

在這種情況下data(1,1)將對應於C3,而data(3,1)是C5