2017-07-25 89 views
0

我試圖寫一個代碼,其中檢查我的工作簿中的每個表的信息後輸入圖像我。自從我加入每個給它採空工作,並開始給我這個編譯錯誤消息的代碼,該代碼作品,未經對於每一個,但我希望它是自動的。 u人能幫忙嗎?編譯錯誤:參數不可選的Excel VBA

EN:我想放在一起,它檢查所有表和插入圖像作爲一個給定的單元格中數據的代碼。代碼工作不循環,但希望它是完全自動化,並提供了包括對於每個出現此編譯錯誤。如果你能幫助我,這是感激。

Sub ForEachWs() 
Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 
    Call Worksheet_SelectionChange 
    Next ws 

End Sub 

Sub Worksheet_SelectionChange(ByVal Target As Range) 

    On Error Resume Next 

    If Target.Column = 2 And Target.Row = 1 Then ' onde clicar para buscar imagem 

     BuscarImagemTavares (Target.Value) 

    End If 

End Sub 

Sub BuscarImagemTavares(Produto As String) 
    On Error Resume Next 
    'Autor: Tavares 

    If Range("B2") = "ok" Then 'Verifica se celula B2 tem ok se sim não insere a imagem novamente 
    Exit Sub 
    End If 

    Dim Imagem, CaminhoImagem As String 

    If Len(Produto) = 3 Then 'acrescenta 00 antes do cod do produto 
     Produto = "00" & Produto 
    End If 
    If Len(Produto) = 4 Then 'acrescenta 0 antes do cod do produto 
     Produto = "0" & Produto 
    End If 

    Imagem = Dir("\\Clfssrvfar\ENGENHARIA\GESTAO_DE_PROJETOS\04. FOLLOWUP\09. ARQUIVOS PARA FERRAMENTAS\09.1 IMAGENS\09.1.2 IMAGENS PRODUTOS\" & Produto & "*", vbDirectory) 

    CaminhoImagem = "\\Clfssrvfar\ENGENHARIA\GESTAO_DE_PROJETOS\04. FOLLOWUP\09. ARQUIVOS PARA FERRAMENTAS\09.1 IMAGENS\09.1.2 IMAGENS PRODUTOS\" & Imagem 



    With ActiveSheet.Pictures.Insert(CaminhoImagem) 'Mostra Imagem 
     'Define tamanho e posição da imagem 

    With .ShapeRange 
     .Width = 75 
     .Height = 115 
     .Top = 7 
     .Left = 715 
     '*above it's me trying to make white background transparent* 
      'With .PictureFormat 
      '.TransparentBackground = True 
      '.TransparencyColor = RGB(255, 0, 0) 
      'End With 
     '.Fill.Visible = True 
     'End With 
     'ActiveSheet.Shapes.Range(Array("Picture 2")).Select 
     'Application.CommandBars("Format Object").Visible = False 
    End With 
    End With 
    If CaminhoImagem <> "" Then 'Após inserir imagem informa "ok" na B2 para não inserir de novo 
    Range("B2").Select 
    ActiveCell.FormulaR1C1 = "OK" 
    End If 

End Sub 
+1

你應該嘗試寫在英格爾斯的問題。如果你不知道如何使用翻譯,有人將編輯可能的錯誤。 –

+0

Неставатакатука。 – Vityata

+0

有ü去,現在英格爾。 –

回答

0

既然你要運行的子BuscarImagemTavares你有充分的工作,你必須改變潛艇BOTH ForEachWsBuscarImagemTavares

ForEachWs:

Sub ForEachWs() 
    Dim ws As Worksheet 

    For Each ws In ActiveWorkbook.Worksheets 
     'Here you can directly call the sub without the sub Worksheet_SelectionChange 
     Call BuscarImagemTavares(ws, ws.Cells(1,2).Value) 
     'in BuscarImagemTavares you´ll need the ws reference to actually work on the right worksheet (otherwise youll always work on the selected one) 
    Next ws 

End Sub 

BuscarImagemTavares:

Sub BuscarImagemTavares(ByVal ws as Worrksheet, Produto As String) 
    'Mind the additional parameter 'ws' 
    On Error Resume Next 
    'Autor: Tavares 

    'If Range("B2") = "ok" Then 'Verifica se celula B2 tem ok se sim não insere a imagem novamente 
    If ws.Range("B2") = "ok" Then 'Here you actually have to use a reference to the Worksheet you want to use, otherwise alwys the same will be used 
     Exit Sub 
    End If 

    ... 

    'You need the reference here as well so you won#t use the same worksheet over and over again 
    With ws.Pictures.Insert(CaminhoImagem) 'Mostra Imagem 

    ... 

    If CaminhoImagem <> "" Then 'Após inserir imagem informa "ok" na B2 para não inserir de novo 
     'Range("B2").Select 
     'ActiveCell.FormulaR1C1 = "OK" 
     'If you don´t actually need the cell in excel to be selected after the programm finished you should´nt use the '.select' and '.selection' instead use this: 
     ws.Range("B2").Value= "OK" 'Since you aren´t adding a formula you should address the '.value' property 
    End If 

    ... 

End Sub 

希望我可以幫助你有點。

+0

Duuuuuude,太感謝你了,它現在workig,我希望我能買焦炭ü! –

+0

不客氣:) – FatTony

0

您所呼叫的事件例行Sub Worksheet_SelectionChange。這是一個常規的闕被從Excel稱爲當自動用戶正在改變所選擇的小區(移動光標)。它允許調用由手的情況下,常規的,但是你必須通過range參數(代表了所選擇的範圍),例如:

For Each ws In ActiveWorkbook.Worksheets 
    Call Worksheet_SelectionChange(ws.cells(1,2)) 
Next ws 

這將滿足編譯器,但是,爲什麼不直接調用真正的程序:

For Each ws In ActiveWorkbook.Worksheets 
    Call BuscarImagemTavares (ws.cells(1,2).value) 
Next ws 
+0

是的,它的工作,酒精所以,問題是,現在是輸入查詢所有的圖片在一張紙上,而不是每個表中的一個畫面。 –

+0

這是因爲你的ActiveSheet對象上工作。無論是插入ws.activate在調用(壞)的前傳或整個工作表的參數,並在有效的。我剛開始更改代碼,但FatTony是快... – FunThomas

+0

老兄你srsly幫了不少忙,謝謝!它現在是workig。 –